空間直線與球面的相交演算法

2021-10-07 23:23:27 字數 2468 閱讀 1619

2、**實現:

空間直線的數學定義是,已知直線l上一點m0(x0,y0,c0),以及直線l的方向向量s(m,n,p),那麼空間直線l的方程為:

以上是空間直線的標準式方程(點向式方程)。令上面式子的比值為t,那麼直線的引數式方程為:

對於知道線段的起點o和終點e,顯然方向向量為d=e−o。這時,根據射線的向量方程,線段上某一點p為

轉化為引數方程就是:

並且,採取這種公式描述還有個好處,引數t的取值範圍為0到1,否則就在直線的兩個端點之外。

根據數學定義,已知球心座標c(cx,cy,cz)與球的半徑r,球面的公式為:

聯立(1)(2)兩式,最終會得到乙個關於t的一元二次方程:

一元二次方程組的有無解,單個解,以及双解三種可能,這也符合空間直線與球面相交的直觀認識,要麼相切有乙個交點,要麼相交有兩個交點,否則的話可能沒有交點。

得到t後,將其帶入到(1)式中,就得到想要的交點。並且,由引數t 就可以判斷交點的位置。

/* 兩個向量的差, (vector1 - vector2). */

vec3d vdiff

(const vec3d vector1,

const vec3d vector2)

/* 兩個向量的和, (vector1 + vector2). */

vec3d vsum

(const vec3d vector1,

const vec3d vector2)

/* 向量的數乘1. */

vec3d vmul

(const vec3d vector,

const

double n)

/* 向量的數乘2. */

vec3d vdiv

(const vec3d vector,

const

double n)

/* 向量的歐幾里得範數 */

double

vdist

(const vec3d v1,

const vec3d v2)

/* 向量的歐幾里得範數 */

double

vnorm

(const vec3d vector)

/* 兩個向量的點積*/

double

dot(

const vec3d vector1,

const vec3d vector2)

/*兩個向量的叉積 */

vec3d cross

(const vec3d vector1,

const vec3d vector2)

/* intersecting a sphere sc with radius of r, with a line p1-p2.

* return zero if successful, negative error otherwise.

* mu1 & mu2 are constant to find points of intersection.

* 球和直線的相交

**/intsphereline

(const vec3d p1,

const vec3d p2,

const vec3d sc,

double r,

double

*const mu1,

double

*const mu2)

*mu1 =

(-b +

sqrt

(bb4ac))/

(2* a)

;*mu2 =

(-b -

sqrt

(bb4ac))/

(2* a)

;return0;

}

int

main

(int argc,

char

*ar**)

除錯輸出:

空間直線與平面的交點

如果直線不與平面平行,將存在交點。如下圖所示,已知直線l過點m m1,m2,m3 且方向向量為vl v1,v2,v3 平面p過點n n1,n2,n3 且法線方向向量為vp vp1,vp2,vp3 求得直線與平面的交點o的座標 x,y,z 將直線方程寫成引數方程形式,即有 x m1 v1 t y m2...

空間直線與平面的交點

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!如果直線不與平面平行,將存在交點。如下圖所示,已知直線l過點m m1,m2,m3 且方向向量為vl v1,v2,v3 平面p過點n n1,n2,n3 且法線方向向量為vp vp1,vp2,vp3 求得直線與平面的交點o的座標 x,y,z 將直線方程...

直線與球體的交點lisp 直線與橢球體相交

示意圖 上述示意圖中,該方法思路不是直接求取射線與橢球體的交點,而是利用變換矩陣,轉化為求取與位於原點的單位球體的交點。首先要基於當前橢球體,構建與空間中位於原點的單位球體之間的變換矩陣,該變換可能包括位移,縮放以及旋轉,採用圖形學中的齊次座標形式表示 位移矩陣 旋轉矩陣 縮放矩陣 則,組合變換矩陣...