判断两个多边形是否相交,只需判断边是否有相交。

编码量有点大,不过思路挺简单的。

#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<string>
#include<queue>
#include<list>
#include<algorithm>
#include<iostream>
using namespace std;string s;
struct point
{double x;double y;point (double a,double b){x=a;y=b;}
};struct Sharp
{string name;vector<point>v;vector<string> ans;
}sharp[100];
int tot;bool cmp(const Sharp&a,const Sharp&b)
{return a.name<b.name;
}void work()
{int a,b,c,d,e,f;if(s=="square"){scanf(" (%d,%d)",&a,&b);scanf(" (%d,%d)",&c,&d);point p1(1.0*a,1.0*b);point p2(1.0*(a+b+c-d)/2.0,1.0*(-a+b+c+d)/2.0);point p3(1.0*c,1.0*d);point p4(1.0*(a-b+c+d)/2.0,1.0*(a+b-c+d)/2.0);sharp[tot].v.push_back(p1);sharp[tot].v.push_back(p2);sharp[tot].v.push_back(p3);sharp[tot].v.push_back(p4);}if(s=="rectangle"){scanf(" (%d,%d)",&a,&b);scanf(" (%d,%d)",&c,&d);scanf(" (%d,%d)",&e,&f);point p1(1.0*a,1.0*b);point p2(1.0*c,1.0*d);point p3(1.0*e,1.0*f);point p4(p1.x+p3.x-p2.x,p1.y+p3.y-p2.y);sharp[tot].v.push_back(p1);sharp[tot].v.push_back(p2);sharp[tot].v.push_back(p3);sharp[tot].v.push_back(p4);}if(s=="line"){for(int i=1;i<=2;i++){scanf(" (%d,%d)",&a,&b);point p(1.0*a,1.0*b);sharp[tot].v.push_back(p);}}if(s=="triangle"){for(int i=1;i<=3;i++){scanf(" (%d,%d)",&a,&b);point p(1.0*a,1.0*b);sharp[tot].v.push_back(p);}}if(s=="polygon"){int x;scanf("%d",&x);for(int i=1;i<=x;i++){scanf(" (%d,%d)",&a,&b);point p(1.0*a,1.0*b);sharp[tot].v.push_back(p);}}tot++;
}const double eps=1e-8;
#define zero(x)(((x)>0?(x):(-x))<eps)double xmult(point p1,point p2,point p0)
{return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}int dots_inline(point p1,point p2,point p3)
{return zero(xmult(p1,p2,p3));
}int same_side(point p1,point p2,point l1,point l2)
{return xmult(l1,p1,l2)*xmult(l1,p2,l2)>eps;
}int dot_online_in(point p,point l1,point l2)
{return zero(xmult(p,l1,l2))&&(l1.x-p.x)*(l2.x-p.x)<eps&&(l1.y-p.y)*(l2.y-p.y)<eps;
}int intersect_in(point u1,point u2,point v1,point v2)
{if(!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2)) return !same_side(u1,u2,v1,v2)&&!same_side(v1,v2,u1,u2);return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,u2);
}bool judge(int a,int b)
{for(int i=0;i<sharp[a].v.size();i++){for(int j=0;j<sharp[b].v.size();j++){point p1=sharp[a].v[i];point p2=sharp[a].v[(i+1)%sharp[a].v.size()];point p3=sharp[b].v[j];point p4=sharp[b].v[(j+1)%sharp[b].v.size()];if(intersect_in(p1,p2,p3,p4)) return 1;}}return 0;
}void init()
{tot=0;for(int i=0;i<100;i++){sharp[i].ans.clear();sharp[i].v.clear();}
}
int main()
{while(1){cin>>s;if(s==".") break;init();sharp[tot].name=s;cin>>s; work();while(1){cin>>s;if(s=="-") break;sharp[tot].name=s;cin>>s; work();}sort(sharp,sharp+tot,cmp);for(int i=0;i<tot;i++){for(int j=i+1;j<tot;j++){if(judge(i,j)){sharp[i].ans.push_back(sharp[j].name);sharp[j].ans.push_back(sharp[i].name);}}}for(int i=0;i<tot;i++){cout<<sharp[i].name<<" ";if(sharp[i].ans.size()==0) printf("has no intersections\n");else if(sharp[i].ans.size()==1) cout<<"intersects with "<<sharp[i].ans[0]<<endl;else if(sharp[i].ans.size()==2) cout<<"intersects with "<<sharp[i].ans[0]<<" and "<<sharp[i].ans[1]<<endl;else{printf("intersects with");for(int k=0;k<sharp[i].ans.size();k++){if(k<sharp[i].ans.size()-1) cout<<" "<<sharp[i].ans[k]<<",";else cout<<" and "<<sharp[i].ans[k]<<endl;}}}printf("\n");}return 0;
}

转载于:https://www.cnblogs.com/zufezzt/p/5155080.html

POJ 3449 Geometric Shapes相关推荐

  1. Geometric Shapes - POJ 3449(多边形相交)

    题目大意:给一些几何图形的编号,求出来这些图形都和那些相交.   分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是: x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3 ...

  2. Doing Math with Python读书笔记-第6章:Drawing Geometric Shapes and Fractals

    本章学习利用matplotlib画几何图形和分形(fractal) 使用MATPLOTLIB库PATCHES包画几何图形 回顾之前的画图: plt.plot(...) plt.show() 也可以拆解 ...

  3. POJ 计算几何入门题目推荐

      其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的算法,在很多领域有着重要的用途(例如本人的专 ...

  4. [Z]POJ 计算几何入门题目推荐[转PKKJ]

    http://www.cnblogs.com/eric-blog/archive/2011/05/31/2064785.html http://hi.baidu.com/novosbirsk/blog ...

  5. poj计算几何题推荐

    POJ 计算几何入门题目推荐(转)       其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...

  6. poj 计算几何 分类

    转自novosbirsk的空间,上面还有很多有用的东西. 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组 ...

  7. POJ 计算几何入门题目推荐(转)

    POJ 计算几何入门题目推荐(转)       其实也谈不上推荐,只是自己做过的题目而已,甚至有的题目尚未AC,让在挣扎中.之所以推荐计算几何题,是因为,本人感觉ACM各种算法中计算几何算是比较实际的 ...

  8. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  9. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

最新文章

  1. 获取线程结束代码(Exit Code)
  2. (转)HBase二级索引与Join
  3. 微信公众号接入图灵机器人实现自动回复消息
  4. python可变长参数(非关键字及关键字参数)
  5. 修改输入框placeholder的默认样式
  6. Python 模块EasyGui
  7. 内存泄漏(Memory Leak)
  8. Java程序员面试宝典--面向对象的基本概念
  9. markdown编辑器------------编辑方法
  10. java实例化对象的四种方式
  11. 正则表达式语法和常用表达式列表
  12. 精准测试白皮书2020版
  13. Firemonkey下使用StyleBook的一些经验
  14. 关于记忆的10个惊人事实
  15. cl.exe link.exe 用法
  16. ndows phone,Windows Phone 7
  17. 《Maven实战》(许晓斌)导读(读书笔记第二次读后感)
  18. HTML5 codecademy
  19. 大一新生HTML期末作业 个人网页王嘉尔明星介绍网页设计与制作
  20. 【产品分析】共享充电宝

热门文章

  1. LeetCode1117. Building H2O --Java解法--多线程保证执行顺序--AtomicInteger
  2. 1480. 一维数组的动态和
  3. oracle如何给表上锁,【ORACLE】Oracle中发生表加锁、死锁的原因,查看,与解决方法...
  4. Logstash(三)filter插件简介
  5. css中“[]”、“”“~”、“,”、“+”和“”详解
  6. gis许可服务器状态,把ArcGIS的许可指到本机(服务设为@l者机器名)通过修改注册表实现...
  7. java 拆分类_拆分或不拆分类(用Java)
  8. 安全策略_实操教程丨使用Pod安全策略强化K8S安全
  9. 序列每天从1开始_时间序列预测一
  10. 归纳推理测试没做完_敷完面膜不要做4件事,不但敷了面膜没效果,皮肤还变差了...