直線是用乙個點和乙個方向向量
(已單位化)構成
.現在要求二條直線最近的點
(即公垂線與兩直線的交點)
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就可以過了 大致思路 列舉每乙個點 計算其他所有點...