求直線上最近的二點 在公垂線上

2021-05-22 20:13:25 字數 1322 閱讀 7640

直線是用乙個點和乙個方向向量

(已單位化)構成

.現在要求二條直線最近的點

(即公垂線與兩直線的交點)

class

cray//

射線類

如果二個直線平行,則兩條直線r1,r2的方向向量的內積必為1或-1,此時可計算s2在r1上的投影(點乘),在r1上計算投影點為sproject,則要求的兩點分別為sproject和s2.如下圖所示

如果二直線不平行,可用數學公式求解:

設所求公垂線上的二點分別為

m(m0, m1, m2), n(n0, n1, n2).

二個起點分別為

s1(s1x, s1y, s1z), s2(s2x, s2y, s2z),

二個方向向量分別為

d1(d1x, d1y,d1z)

則根據直線的引數方程法

:(m0- s1x)/ d1x = (m1- s1y)/ d1y = (m2- s1z)/ d1z = k1;

(n0- s2x)/ d2x = (n1- s2y)/ d2y = (n2- s2z)/ d2z = k2;

m(m0, m1, m2)

可表示為

(d1x* k1+ s1x, d1y* k1+ s1y, d1z* k1+ s1z)

n(n0, n1, n2)

可表示為

(d2x* k2+ s2x, d2y* k2+ s2y, d2z* k2+ s2z)而mn

點乘d1

結果為0,mn

點乘d1

結果為0

。所以,可得:

-a+ k1-t.k2=0

(d1.d1=1

,d2.d2=1

,可設d1.d2=t, d1 .(s1-s2)=-a)

b+t.k1-k2=0

解之,可得:

k1=(a+ b* dot)/ (1-t*t)

k2=(b+ a* dot)/ (1-t*t)即m

為(d1x* k1+ s1x, d1y* k1+ s1y, d1z* k1+ s1z),n

為(d2x* k2+ s2x, d2y* k2+ s2y, d2z* k2+ s2z)

求解完畢。

**如下:

double

dot= cvector_3d::dot( m_ptdir, r.get_dir() );//

求二個方向向量的內積

double t2= 1- dot* dot;

cvector_3d v;

if ( abs( t2 ) < infinity_little)//

如果二射線平行

else

使用Java求某點到直線上的投影點

求直線外一點到直線上的投影點 param pline 線上一點 param k 斜率 param pout 線外一點 param pproject 投影點 public static void getprojectivepoint pointf pline,double k,pointf pout,...

C 曲線上的點(二) 獲取距離最近的點

如何在一條曲線上,獲取到距離指定點最近的點位置?我們通過曲線上獲取的密集點,通過倆點之間連線,獲取連線上最近的點。我們能夠獲取到一系列最近的點集,最近只取距離最小的點即可。我們這樣的演算法是否精確呢?不算太精確,但是對於獲取曲線上最近點,基本能滿足。斜率變化不大的線段,點不密集 斜率變化較大的線段,...

求一條直線上能包含的最多數量的點

題目大意 給n個二維點的座標,求在所有點的連線中一條直線所能包含最多的點的個數 2000ms,1000的複雜度剛開始自己想了個n 3複雜度的方法,即使加上了感覺很有效的剪枝,但是依然tle了。看了網上某acmer的部落格,恍然大悟,原來n 2logn就可以過了 大致思路 列舉每乙個點 計算其他所有點...