学习心得(code)

superlong@CoreCoder

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

公告

文字可能放在http://blog.csdn.net/superlong100,此处存放代码

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新随笔

最新评论

  • 1. re: Poj 1279
  • 对于一个凹多边形用叉积计算面积 后能根据结果的正负来判断给的点集的时针方向?
  • --bsshanghai
  • 2. re: Poj 3691
  • 你写的这个get_fail() 好像并是真正的get_fail,也是说fail指向的串并不是当前结点的子串。为什么要这样弄呢?
  • --acmer1183
  • 3. re: HDU2295[未登录]
  • 这个是IDA* 也就是迭代加深@ylfdrib
  • --superlong
  • 4. re: HDU2295
  • 评论内容较长,点击标题查看
  • --ylfdrib
  • 5. re: HOJ 11482
  • 呵呵..把代码发在这里很不错..以后我也试试...百度的编辑器太烂了....
  • --csuft1

阅读排行榜

评论排行榜

#include <iostream>
#include 
<math.h>
#include 
<string>
using namespace std;

int n;

struct point
{
    
double x, y;
    
void write(){printf("%.2lf %.2lf\n", x, y);}
};

point p[
1505];
bool  h[1505];

double xmul(point a, point b, point c)
{
return (c.x - a.x) * (b.y - a.y) - (c.y - a.y) * (b.x - a.x);}

point intersection(point u1,point u2,point v1,point v2){
    point ret
=u1;
    
double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))
            
/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
    ret.x
+=(u2.x-u1.x)*t;
    ret.y
+=(u2.y-u1.y)*t;
    
return ret;
}

void read()
{
    scanf(
"%d"&n);
    
for(int i = 0; i < n; i ++)
        scanf(
"%lf %lf"&p[i].x, &p[i].y);
    p[n] 
= p[0];
}
double cross(point a, point b)
{
return a.x * b.y - a.y * b.x;}

double area(point *p, int n)//面积为负多边形为顺时针给出
{
    
double sum = 0;
    
for(int i = 0; i < n; i ++)
        sum 
+= cross(p[i], p[i + 1]);
    
return sum / 2;
}

void pre()
{
    point tp[
1505];
    
if(area(p, n) < 0)
    {
        
for(int i = 0; i < n; i ++)
            tp[i] 
= p[n - 1 - i];
        tp[n] 
= tp[0];
        
for(int i = 0; i <= n; i ++) p[i] = tp[i];
    }
    
}

void solve()
{
    
int i, j, flag;
    
double sum;
    point tp[
1505], tt[1505], ns, ne;
    
int len = 0, tlen;
    point s, e, pp;
    memset(h, 
0sizeof(h));

    
//enum
    for(i = 0; i <= n; i ++) tp[i] = p[i];
    len 
= n;
    
    
for(i = 0; i < n; i ++)
    {
//        for(j = 0; j < len; j ++)
//            printf("<%.2lf %.2lf> \n",tp[j].x, tp[j].y);
//        puts("");
        
        s 
= p[i];    e = p[i + 1];
        tlen 
= 0;
        
        
for(j = 0; j < len; j ++)
        {
            ns 
= tp[j];    ne = tp[j + 1];
            
if(xmul(s, e, ns) <= 0)
                tt[tlen 
++= ns;
            
if(xmul(s, e, ns) * xmul(s, e, ne) < 0)
            {
                pp 
= intersection(s, e, ns, ne);
                
                tt[tlen 
++= pp;
            }    
        }
        tt[tlen] 
= tt[0];
        
for(j = 0; j <= tlen; j ++) tp[j] = tt[j];
        len 
= tlen;
    }
    
    
//core
    tp[len] = tp[0];
    sum 
= area(tp, len);
    printf(
"%.2lf\n", fabs(sum));
}

int main()
{
    
int test;
    scanf(
"%d"&test);
    
while(test --)
    {
        read();
        pre();
        solve();
    }
}

posted on 2009-08-29 16:32 superlong 阅读(559) 评论(1)  编辑 收藏 引用

Feedback

# re: Poj 1279 2012-04-21 01:02 bsshanghai
对于一个凹多边形用叉积计算面积 后能根据结果的正负来判断给的点集的时针方向?  回复  更多评论
  


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