<pre name="code" class="cpp">叉乘 (一)判断方向 (二)判断线段相交 (三)求三角形面积 (一)判断方向 叉乘的性质如下: (1). P x Q > 0; 表示P在Q的顺时针方向; (2). p x Q < 0; 表示P在Q的逆时针方向; (3). P x Q = 0; 表示P和Q是共线的 P(x1,y1),Q(x2,y2), P*Q=x1y2-x2y1 判断结果三种状态 模版为: struct point { int x,y; }p[i]; double cross(point a,point b,point c) //向量P=(b.x-a.x,b.y-a.y),Q=(c.x-a.x,c.y-a.y),则P与Q //叉积为PQ=(b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y); { return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y); } (二)判断线段相交 快速排斥与跨立实验 #define eps 1e-8 #define maxn 100005 struct point { double x,y; }; struct line { point a,b; }s[maxn]; double cross(point a,point b,point c) { return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y); } bool quick(line p,line q) { if( min(p.a.x,p.b.x)<=max(q.a.x,q.b.x)&& min(q.a.x,q.b.x)<=max(p.a.x,p.b.x)&& min(p.a.y,p.b.y)<=max(q.a.y,q.b.y)&& min(q.a.y,q.b.y)<=max(p.a.y,p.b.y)&& cross(p.a,q.a,q.b)*cross(p.b,q.a,q.b)<-eps&& cross(q.a,p.a,p.b)*cross(q.b,p.a,p.b)<-eps) return true; return false; } (三)求三角形面积 double area(point a, point b, point c) { return fabs(cross( a, b,c)/2); }
时间: 2024-12-22 07:09:55