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
İş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)); }
Geçen bir parçası ve konteyner faaliye...
Nasıl 100 hareketli hedefler arasında ...
0 ve 1 arasında rastgele bir kayan nok...
Nasıl bir nokta bir doğru üzerinde iki...
Python (iki GPS nokta arasındaki Kerte...