C語言平面幾何12-向量方法判斷線段與矩形是否有交集


向量方法判斷線段與矩形是否有交集,通過向量叉乘的結果正負來判斷,當矩形在線段的某一側時,叉乘的結果要麼全正,要麼全負,此時無交集。

判斷有2步:1)快速排斥,2)叉乘。

int RSIntersection(Rectangle r, Point A, Point B)
{
	MBR m1 = (MBR)r;
	MBR m2 = MbrConstruct(A, B);
	// 快速排斥 
	if (MbrOverlap(m1, m2) == 0)
		return 0;
	
	// 判斷rectangle的四個點是否在向量的某一側
	Vector v = VectorConstruct(A, B);
	Vector v1, v2, v3, v4;
	v1.x = r.xmin - A.x;
	v1.y = r.ymin - A.y;
	v2.x = r.xmax - A.x;
	v2.y = r.ymin - A.y;
	v3.x = r.xmax - A.x;
	v3.y = r.ymax - A.y;
	v4.x = r.xmin - A.x;
	v4.y = r.ymax - A.y;
	
	double t1, t2, t3, t4;
	t1 = CrossProduct(v1, v);
	t2 = CrossProduct(v2, v);
	t3 = CrossProduct(v3, v);
	t4 = CrossProduct(v4, v);

	if (t1>0 && t2>0 && t3>0 && t4>0)
		return 0;
	if (t1<0 && t2<0 && t3<0 && t4<0)
		return 0;

	return 1;	
}
函數MbrConstruct,  MbrOverlap, VectorConstruct, CrossProduct見C語言平面幾何4-兩線段是否相交

判斷線段與矩形是否有交集的另外一種方法(降維方法),見 C語言平面幾何6-判斷線段是否與矩形範圍有交集


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章