首页 > 代码库 > 叉乘、快速排斥与跨立实验及求取三角形面积

叉乘、快速排斥与跨立实验及求取三角形面积

<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);
}


叉乘、快速排斥与跨立实验及求取三角形面积