SORU
11 Mayıs 2009, PAZARTESİ


Kısa mesafe arasında bir nokta ve bir çizgi parçası

Temel işlevi bir nokta ve bir doğru arasındaki en kısa mesafeyi bulmak istiyorum. İstediğiniz herhangi bir dilde çözüm yazmak için çekinmeyin, ben kullanıyorum ne içine (Javascript) tercüme edebilirim.

EDİT: Benim hat kesimi iki bitiş noktası tarafından tanımlanır. AB iki nokta A (x1,y1 ve B ile tanımlanır çizgi segmenti (x2,y2. Bu çizgi parçası ve nokta C (x3,y3) arasındaki mesafeyi bulmaya çalışıyorum. Benim geometri becerileri paslı, gördüğüm örnekler kafa karıştırıcı yani, itiraf için özür dilerim.

CEVAP
1 EKİM 2009, PERŞEMBE


Eli, karar vermelisin kodu doğru değil. Hangi kesimi yalan çizgisine yakın bir noktada ama parçanın bir ucu çok uzakta yanlış kesimi yakınlarındaki karar olacaktır.Güncelleme: yanlış cevap söz artık kabul etti.

İşte bazı doğru kod, C . Eklemek operatörleri, subract, ölçek, vb, ve bir mesafe ile bir sınıf 2B-vektör class vec2 {float x,y;} aslında, sayılan ve ürün fonksiyon (yani x1 x2 y1 y2) nokta.

float minimum_distance(vec2 v, vec2 w, vec2 p) {
  // Return minimum distance between line segment vw and point p
  const float l2 = length_squared(v, w);  // i.e. |w-v|^2 -  avoid a sqrt
  if (l2 == 0.0) return distance(p, v);   // v == w case
  // Consider the line extending the segment, parameterized as v   t (w - v).
  // We find projection of point p onto the line. 
  // It falls where t = [(p-v) . (w-v)] / |w-v|^2
  const float t = dot(p - v, w - v) / l2;
  if (t < 0.0) return distance(p, v);       // Beyond the 'v' end of the segment
  else if (t > 1.0) return distance(p, w);  // Beyond the 'w' end of the segment
  const vec2 projection = v   t * (w - v);  // Projection falls on the segment
  return distance(p, projection);
}

EDİT: Javascript bir uygulama ihtiyacım vardı, burada, hiçbir bağımlılıkları ile (ya da yorum, ama yukarıdaki doğrudan bir bağlantı var). Puan x ile nesneleri olarak gösterilir ve y öznitelikleri.

function sqr(x) { return x * x }
function dist2(v, w) { return sqr(v.x - w.x)   sqr(v.y - w.y) }
function distToSegmentSquared(p, v, w) {
  var l2 = dist2(v, w);
  if (l2 == 0) return dist2(p, v);
  var t = ((p.x - v.x) * (w.x - v.x)   (p.y - v.y) * (w.y - v.y)) / l2;
  if (t < 0) return dist2(p, v);
  if (t > 1) return dist2(p, w);
  return dist2(p, { x: v.x   t * (w.x - v.x),
                    y: v.y   t * (w.y - v.y) });
}
function distToSegment(p, v, w) { return Math.sqrt(distToSegmentSquared(p, v, w)); }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BenjiManTV

    BenjiManTV

    20 Mart 2011
  • BgirlNilaya

    BgirlNilaya

    29 EKİM 2008
  • Mark Hyder

    Mark Hyder

    6 EKİM 2011