两个凸多边形的交


#include <iostream>
#include 
<vector>
#include 
<cmath>

using namespace std;

struct point
{
    
double x,y;
}
;

vector 
<point> polygon, scissor, temp;

double operator *(point p1, point p2)
{
    
return p1.x * p2.y - p1.y * p2.x;
}


point 
operator +(point p1, point p2)
{
    point p;
    p.x 
= p1.x + p2.x;
    p.y 
= p1.y + p2.y;
    
return p;
}


point 
operator -(point p1, point p2)
{
    point p;
    p.x 
= p1.x - p2.x;
    p.y 
= p1.y - p2.y;
    
return p;
}


bool at_right(point p1, point p2, point p)
{
    
return (p - p1) * (p2 - p1) <= 0;
}


bool intersect(point p1, point p2, point p3, point p4, point &p)
{
    
if ( ((p3 - p1) * (p2 - p1)) * ((p4 - p1) * (p2 - p1)) >= 0 )
        
return 0;
    
double D, D1, D2;
    D 
= (p1 - p2) * (p4 - p3);
    D1 
= (p3 * p4) * (p1.x - p2.x) - (p1 * p2) * (p3.x - p4.x);
    D2 
= (p1 * p2) * (p4.y - p3.y) - (p3 * p4) * (p2.y - p1.y);
    p.x 
= D1 / D;
    p.y 
= D2 / D;
    
return 1;
}


double getarea(point p1, point p2, point p3)
{
    
return fabs((p1 - p2) * (p3 - p2)) / 2.0;
}


int main()
{
    
int scin, poln, i, j;
    
double area = 0.0;
    point pp;

    scanf(
"%d"&poln);

    
for (i = 0; i < poln; ++i)
    
{
        scanf(
"%lf%lf"&pp.x, &pp.y);
        polygon.push_back(pp);
    }


    scanf(
"%d",&scin);
    
for (i = 0; i < scin; ++i)
    
{
        scanf(
"%lf%lf"&pp.x, &pp.y);
        scissor.push_back(pp);    
    }


    scissor.push_back(scissor[
0]);

    
for (i = 0; i < scin; ++i)
    
{
        temp.clear();
        
if (polygon.size() < 3)
            
break;

        
for (j = 0; j < polygon.size() - 1++j)
        
{
            
if (intersect(scissor[i], scissor[i + 1], polygon[j], polygon[j + 1], pp))
                temp.push_back(pp);
            
if (at_right(scissor[i], scissor[i + 1], polygon[j + 1]))
                temp.push_back(polygon[j 
+ 1]);
        }


        
if (intersect(scissor[i], scissor[i + 1], polygon[j], polygon[0], pp))
            temp.push_back(pp);
        
if (at_right(scissor[i], scissor[i + 1], polygon[0]))
            temp.push_back(polygon[
0]);
        polygon 
= temp;
    }


    
if (polygon.size() > 2)
        
for (i = 1; i < polygon.size() - 1++i)
            area 
+= getarea(polygon[0], polygon[i], polygon[i + 1]);
    printf(
"%.2lf\n",area);
    
return 0;
}
posted on 2007-10-07 10:27 Felicia 阅读(1715) 评论(2)  编辑 收藏 引用 所属分类: 计算几何
Comments
  • # re: [计算几何]两个凸多边形的交
    imlazy
    Posted @ 2008-10-01 10:09
    Felicia您真是几何高手,看了你许多几何文章,学习了不少。请问这个凸多边形交的算法在POJ或其它OJ上有没有题目可以练习呢?  回复  更多评论   
  • # re: [计算几何]两个凸多边形的交[未登录]
    Felicia
    Posted @ 2008-10-01 23:58
    哦,这个是以前的凸多边形交,O(n^2)的,后来我写了新的O(n)的版本,可以在我的新blog www.gccfeli.cn上找到……可以写个二分的半平面交,里面有凸多边形交的应用,题目可以找zeyuan zhu在poj上出的题  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理