码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-11-10 23:31:04      阅读:519      评论:0      收藏:0      [点我收藏+]

标签:acm   总结   

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


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

标签:acm   总结   

原文地址:http://blog.csdn.net/dojintian/article/details/40985343

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!