1.必備知識
向量積(矢積)與數量積(標積)的區別
名稱標積 / 內積 / 數量積 / 點積
矢積 / 外積 / 向量積 / 叉積
表示式(a,b和c粗體字,表示向量)
a·b=|a|·|b|cosθ
a×b=c,其中|c|=|a|·|b|sinθ,c的方向遵守右手定則
幾何意義
向量a在向量b方向上的投影與向量b的模的乘積
c是垂直a、b所在平面,且以|b|sinθ為高、|a|為底的平行四邊形的面積
運算結果的區別
標量(常用於物理)/數量(常用於數學)
向量(常用於物理)/向量(常用於數學)
表示方法
兩個向量a和b的叉積寫作a×b(有時也被寫成a∧b,避免和字母x混淆)。
定義 向量積可以被定義為:
模長:(在這裡θ表示兩向量之間的夾角(共起點的前提下)(0° ≤ θ ≤ 180°),它位於這兩個向量所定義的平面上。)
方向:a向量與b向量的向量積的方向與這兩個向量所在平面垂直,且遵守右手定則。
(乙個簡單的確定滿足「右手定則」的結果向量的方向的方法是這樣的:若座標系是滿足右手定則的,當右手的四指從a以不超過180度的轉角轉向b時,豎起的大拇指指向是c的方向。)
也可以這樣定義(等效):
向量積|c|=|a×b|=|a|·|b|sin< a,b >
即c的長度在數值上等於以a,b,夾角為θ組成的平行四邊形的面積。
而c的方向垂直於a與b所決定的平面,c的指向按右手定則從a轉向b來確定。
*運算結果c是乙個偽向量。這是因為在不同的座標系中c可能不同。
} double direction(point pi,point pj,point pk) //計算向量pkpi和向量pjpi的叉積
bool judge(point p1,point p2,point p3,point p4) //判斷線段p1p2和p3p4是否相交
int main()
for(int i=1; ifor(int j=i+1; j<=n; j++)
} cout
0;
}3.[c++]計算幾何之判斷線段相交
給定兩個點:
typedef struct
point;
point a1,a2,b1,b2;
首先引入兩個實驗:
a.快速排斥實驗
設以線段a1a2和線段b1b2為對角線的矩形為m,n;
若m,n 不相交,則兩個線段顯然不相交;
所以:滿足第乙個條件時:兩個線段可能相交。
b.跨立實驗
如果兩線段相交,則兩線段必然相互跨立對方.若a1a2跨立b1b2,則向量( a1 - b1 ) 和(a2-b1)位於向量(b2-b1)的兩側,
即(a1-b1) × (b2-b1) * (a2-b1) × (b2-b1)<0。
上式可改寫成(a1-b1) × (b2-b1) * (b2-b1) × (a2-a1)>0。
應該判斷兩次,即兩條線段都要為直線,判斷另一直線的兩端點是否在它兩邊,若是則兩線段相交。
若積極滿跨立實驗是不行的,如下面的情況:
即兩條線段在同一條直線上。所以我們要同時滿足兩次跨立和快速排斥實驗。
如圖:
應用:
1. 判斷兩個線段相交
2. 判斷線段與直線相交
3. 判斷點在矩形內
**:
/*
(a1-b1) × (b2-b1) * (b2-b1) × (a2-a1) >= 0
(b1-a1) × (a2-a1) * (a2-a1) × (b2-a1) >= 0
*/#include
#define min(a,b) a#define max(a,b) a>b?a:b
typedef struct point;
point a1,a2,b1,b2;
point a1b1, b2b1, a2a1, b2a1;
double xx(point &s,point &t)
int kua() //跨立實驗
else
return 0
; }
int main()
else
printf("線段不相交\n");
} return 0
; }
4.[cad]
判斷兩條線段是否相交,可以採用向量積的方式來判斷,如下圖所示:
現定義乙個函式初步判斷兩線段是否相交,如下**:
///
/// 初步根據外圍框大致判斷兩條線段是否相交
//////
線段1的座標,長度為6
///線段2的座標,長度為6
///返回型別為bool,如果為true表示兩條線段可能相交,如果為false表示兩條線段不相交
private
bool
judgeaboutcrossstatus(double line01coords, double line02coords)
return returnresult;
}函式judgeaboutcrossstatus()如果返回值為true則表示兩條線段可能相交,則需要採用向量積的方式來判斷是否相交,如果為false則表示兩條線段不相交。現在定義乙個函式judge2linesrelation ()用於判斷兩條線段是否相交,其**如下:
////// 判斷兩條線段是否相交
//////
線段1的座標,長度為6
///線段2的座標,長度為6
///返回型別為bool,如果為true表示兩條線段相交,如果為false表示兩條線段不相交
private
bool
judge2linesrelation(double line01coords, double line02coords)
else
if (((babck > 0) && (babdk < 0)) || ((babck < 0) && (babdk > 0)))
else
}else
if ((babck == 0)||(babdk==0))//點c或d在直線ab上
else
//點d在直線ab上
if (line01coords[0] == line01coords[3])//是否垂直,是則比較y值
else
//比較x值}}
return returnresult;
}
2.叉積、線段相交判斷、凸包
3. 1288: 計算幾何練習題——線段相交
判斷兩條線段是否相交
如上圖,判斷線段ab和線段cd相交。分析 如果線段ab和線段cd相交,只能是圖中的兩種相交情況。可以用向量叉乘來判斷。如果 向量ab叉乘向量ac 向量ab叉乘向量ad 0 並且 向量cd叉乘向量ca 向量cd叉乘向量cb 0,那麼說明線段ab與線段cd相交。設a x1,y1 b x2,y2 c x3...
判斷兩條線段是否相交
題目 給定兩條線段,判斷這兩條線段是否相交,線段ab的表示形式是a x1,y1 b x2,y2 線段cd的表示形式為c x3,y3 d x4,y4 那麼我們如何判斷線段ab與線段cd是否相交。解析 在介紹如何解決線段相交問題之前,我們先介紹向量的叉積。如下圖所示 下面的圖 1 表示p1向量在p2向量...
判斷兩條線段是否相交
判斷兩條線段是否相交,可以採用向量積的方式來判斷,如下圖所示 現定義乙個函式初步判斷兩線段是否相交,如下 初步根據外圍框大致判斷兩條線段是否相交 線段1的座標,長度為6 線段2的座標,長度為6 返回型別為bool,如果為true表示兩條線段可能相交,如果為false表示兩條線段不相交 private...