C++計算兩平面直線的交點


這里還是用直線的參數曲線方程: 

A:   f(t) = va*t+a

B:  g(s) = vb*s +b

va是直線A的二維的單位方向向量,a是直線A的原點

計算直線A和B交點, f(t) = g(s)      =>

va.x *t + a.x = vb.x*s +b.x

va.y *t + a.y = vb.y*s +b.y

=>

va.x*t - vb.x*s = b.x-a.x

va.y*t - vb.y*s = b.y-a.y

這就是 M*X = Y

其中M是如下的兩行兩列矩陣

| va.x     -vb.x|

|va.y     -vb.y|

X是向量 |t  s| 轉置

Y是列向量

|b.x-a.x|

|b.y-a.y|

其中Yx = b.x - a.x

Yy = b.y-a.y

這個方程組用克拉姆法則求解,不了解的看下線性代數

先M的行列式 m = -va.x*vb.y + va.y*vb.x

如果m 等於0(實際上會用fabs(m)<e判斷小到什么限度, e是一個小的浮點值,比如1e-5)

說明兩條直線幾乎平行,就沒有交點,直接返回false

否則,Ms = 

| va.x     Yx|

|va.y     Yy|

ms = va.x*Yy - va.y * Yx

則 s= ms / m 

 

Mt = 

| Yx     -vb.x|

|Yy     -vb.y|

mt = -vb.y*Yx + vb.x* Yy

則 t = mt / m 

 

計算出t和s的值以后,代入f(t)就可以得到交點c的值了,

這個可以不用什么3d向量庫,按照公式推導用C++寫公式代碼就行了,這個一般

在matlab的m文件就叫算例,用C++表達式寫出來就行了,或者包個函數

bool lineALineBCross(Vec2d a, Vec2d va, Vec2d b, Vec2d vb, double& t, double& s)

{...}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM