<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);
}
叉乘、快速排斥与跨立实验及求取三角形面积
最新推荐文章于 2022-04-24 15:13:01 发布