objective c判斷兩條線段相交

2021-08-26 19:00:18 字數 2619 閱讀 5643

參考自: //

// 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所...