點與線段之間的最短距離我需要一個基本的函數來找到點和線段之間的最短距離??梢噪S意用您想要的任何語言編寫解決方案;我可以將其翻譯成我正在使用的語言(Javascript)。編輯:我的線段由兩個端點定義。所以我的線段AB是由兩點定義的。A (x1,y1)和B (x2,y2)..我想找出這段線段和一個點之間的距離C (x3,y3)..我的幾何技能是生疏的,所以我看到的例子是混亂的,我很抱歉承認。
3 回答

呼啦一陣風
TA貢獻1802條經驗 獲得超6個贊
class vec2 {float x,y;}
x1 x2 + y1 y2
).
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 // We clamp t from [0,1] to handle points outside the segment vw. const float t = max(0, min(1, dot(p - v, w - v) / l2)); const vec2 projection = v + t * (w - v); // Projection falls on the segment return distance(p, projection);}
x
y
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; t = Math.max(0, Math.min(1, t)); 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)) ; }
float dist_to_segment_squared(float px, float py, float pz, float lx1, float ly1, float lz1, float lx2, float ly2, float lz2) { float line_dist = dist_sq(lx1, ly1, lz1, lx2, ly2, lz2); if (line_dist == 0) return dist_sq(px, py, pz, lx1, ly1, lz1); float t = ((px - lx1) * (lx2 - lx1) + (py - ly1) * (ly2 - ly1) + (pz - lz1) * (lz2 - lz1)) / line_dist; t = constrain(t, 0, 1); return dist_sq(px, py, pz, lx1 + t * (lx2 - lx1), ly1 + t * (ly2 - ly1), lz1 + t * (lz2 - lz1));}
添加回答
舉報
0/150
提交
取消