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