參考自: //
// lineintersect.h
// hungrybear
//// created by bruce yang on 12-3-12.
//#import
#import"box2d.h"
#define zero(x) (((x)>0?(x):-(x))
@inte***celineintersect : nsobject
#pragma mark-
#pragma mark適用於b2vec2的版本~
//判兩線段相交,包括端點和部分重合
+(int) intersect_in:(b2vec2)u1 u2:(b2vec2)u2 v1:(b2vec2)v1 v2:(b2vec2)v2;
//計算兩線段交點,請判線段是否相交(同時還是要判斷是否平行!)
+(b2vec2) intersection:(b2vec2)u1 u2:(b2vec2)u2 v1:(b2vec2)v1 v2:(b2vec2)v2;
#pragma mark-
#pragma mark適用於cgpoint的版本~
+(int) intersect_in2:(cgpoint)u1 u2:(cgpoint)u2 v1:(cgpoint)v1 v2:(cgpoint)v2;
//計算兩線段交點,請判線段是否相交(同時還是要判斷是否平行!)
+(cgpoint) intersection2:(cgpoint)u1 u2:(cgpoint)u2 v1:(cgpoint)v1 v2:(cgpoint)v2;
#pragma mark-
#pragma mark驗證上述幾個方法的移植是否存在什麼問題~
+(void) validatealgorithm;
@end
//// lineintersect.mm
// hungrybear
//// created by bruce yang on 12-3-12.
//#import"lineintersect.h"
@implementationlineintersect
//計算交叉乘積(p1-p0)x(p2-p0)
+(double) xmult:(b2vec2)p1 p2:(b2vec2)p2 p3:(b2vec2)p0
+(int) dot_online_in:(b2vec2)p l1:(b2vec2)l1 l2:(b2vec2)l2
+(int) same_side:(b2vec2)p1 p2:(b2vec2)p2 l1:(b2vec2)l1 l2:(b2vec2)l2
//判兩直線平行
+(int) parallel:(b2vec2)u1 u2:(b2vec2)u2 v1:(b2vec2)v1 v2:(b2vec2)v2
//判三點共線
+(int) dots_inline:(b2vec2)p1 p2:(b2vec2)p2 p3:(b2vec2)p3
//判兩線段相交,包括端點和部分重合
+(int) intersect_in:(b2vec2)u1 u2:(b2vec2)u2 v1:(b2vec2)v1 v2:(b2vec2)v2 else
}//計算兩線段交點,請判線段是否相交(同時還是要判斷是否平行!)
+(b2vec2) intersection:(b2vec2)u1 u2:(b2vec2)u2 v1:(b2vec2)v1 v2:(b2vec2)v2
#pragma mark-
#pragma mark適用於cgpoint的版本~
//計算交叉乘積(p1-p0)x(p2-p0)
+(double) xmult2:(cgpoint)p1 p2:(cgpoint)p2 p3:(cgpoint)p0
+(int) dot_online_in2:(cgpoint)p l1:(cgpoint)l1 l2:(cgpoint)l2
+(int) same_side2:(cgpoint)p1 p2:(cgpoint)p2 l1:(cgpoint)l1 l2:(cgpoint)l2
//判兩直線平行
+(int) parallel2:(cgpoint)u1 u2:(cgpoint)u2 v1:(cgpoint)v1 v2:(cgpoint)v2
//判三點共線
+(int) dots_inline2:(cgpoint)p1 p2:(cgpoint)p2 p3:(cgpoint)p3
+(int) intersect_in2:(cgpoint)u1 u2:(cgpoint)u2 v1:(cgpoint)v1 v2:(cgpoint)v2 else
}//計算兩線段交點,請判線段是否相交(同時還是要判斷是否平行!)
+(cgpoint) intersection2:(cgpoint)u1 u2:(cgpoint)u2 v1:(cgpoint)v1 v2:(cgpoint)v2
#pragma mark-
#pragma mark驗證上述幾個方法的移植是否存在什麼問題~
+(void) validateintersect:(b2vec2)u1 u2:(b2vec2)u2 v1:(b2vec2)v1 v2:(b2vec2)v2 else
}+(void) validatealgorithm
@end
判斷兩條線段是否相交
如上圖,判斷線段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.必備知識 向量積 矢積 與數量積 標積 的區別 名稱標積 內積 數量積 點積 矢積 外積 向量積 叉積 表示式 a,b和c粗體字,表示向量 a b a b cos a b c,其中 c a b sin c的方向遵守右手定則 幾何意義 向量a在向量b方向上的投影與向量b的模的乘積 c是垂直a b所...