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

题目大意:给一些几何图形的编号,求出来这些图形都和那些相交。
 
分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是:
x2:=(x1+x3+y3-y1)/2; y2:=(y1+y3+x1-x3)/2;
x4:=(x1+x3-y3+y1)/2; y4:=(y1+y3-x1+x3)/2;
这个是可以推倒出来的,有兴趣的可以推一下,给的矩形三个点,是按照顺序给的,求出来第四个点即可,比较容易求,x4=x1-x2+x3, y4=y1-y2+y3
别的图形的点也都是按照顺序给的,两个图形如果相交一定是边的相交,一个图形把另一个包含不算相交。所以处理完输入输出,还是比较容易做的。
 
代码如下:
========================================================================================================================
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;const int MAXN = 26;
const double EPS = 1e-8;int Sign(double t)
{if(t > EPS)return 1;if(fabs(t) < EPS)return 0;return -1;
}
struct Point
{double x, y;Point(double x=0, double y=0):x(x),y(y){}Point operator - (const Point &tmp)const{return Point(x-tmp.x, y-tmp.y);}double operator ^(const Point &tmp)const{return x*tmp.y - y*tmp.x;}
};
struct Segment
{Point S, E;Segment(Point S=0, Point E=0):S(S), E(E){}bool Intersect(const Segment &tmp)const{int t1 = Sign((S-E)^(tmp.S-E));int t2 = Sign((S-E)^(tmp.E-E));return abs(t1+t2) != 2;}
};
struct Shapes
{Segment sg[MAXN];int N;
};
bool Find(int u, int v, Shapes a[])
{for(int i=0; i<a[u].N; i++)for(int j=0; j<a[v].N; j++){if(a[u].sg[i].Intersect(a[v].sg[j]) && a[v].sg[j].Intersect(a[u].sg[i]))return true;}return false;
}
void Link(Shapes a[], int k, Point p[])
{int i, N=a[k].N;p[N] = p[0];for(i=1; i<=N; i++)a[k].sg[i-1] = Segment(p[i-1], p[i]);
}
int main()
{char Id[MAXN], s[MAXN], s1[MAXN], s2[MAXN];Shapes a[MAXN];Point p[MAXN];memset(a, 0, sizeof(a));while(scanf("%s", Id) != EOF && Id[0] != '.'){if(Id[0] == '-'){for(int i=0; i<MAXN; i++){if(a[i].N){///如果这个符号的形状存在int ans[MAXN], k=0;for(int j=0; j<MAXN; j++){if(!a[j].N || i==j)continue;if(Find(i, j, a) == true)ans[k++] = j;}if(k == 1)printf("%c intersects with %c\n", i+'A', ans[0]+'A');else if(k == 0)printf("%c has no intersections\n", i+'A');else{printf("%c intersects with %c", i+'A', ans[0]+'A');for(int t=1; t<k-1; t++)printf(", %c", ans[t]+'A');if(k == 2)printf(" and %c\n", ans[k-1]+'A');elseprintf(", and %c\n", ans[k-1]+'A');}}}printf("\n");memset(a, 0, sizeof(a));}else{scanf("%s", s);int k = Id[0] - 'A';if(strcmp(s, "square") == 0){///正方形a[k].N = 4;scanf("%s%s", s1, s2);sscanf(s1, "(%lf,%lf)", &p[0].x, &p[0].y);sscanf(s2, "(%lf,%lf)", &p[2].x, &p[2].y);p[1].x = (p[0].x+p[2].x + p[2].y-p[0].y)/2;p[1].y = (p[0].x-p[2].x + p[0].y+p[2].y)/2;p[3].x = (p[0].x+p[2].x + p[0].y-p[2].y)/2;p[3].y = (p[2].x-p[0].x + p[0].y+p[2].y)/2;}else if(strcmp(s, "line") == 0){///直线a[k].N = 2;scanf("%s%s", s1, s2);sscanf(s1, "(%lf,%lf)", &p[0].x, &p[0].y);sscanf(s2, "(%lf,%lf)", &p[1].x, &p[1].y);}else if(strcmp(s, "rectangle") == 0){///长方形a[k].N = 4;for(int t=0; t<3; t++){scanf("%s", s1);sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);}p[3].x = p[0].x-p[1].x+p[2].x;p[3].y = p[0].y-p[1].y+p[2].y;}else if(strcmp(s, "triangle") == 0){///三角形a[k].N = 3;for(int t=0; t<3; t++){scanf("%s", s1);sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);}}else if(strcmp(s, "polygon") == 0){///多边形scanf("%d", &a[k].N);for(int t=0; t<a[k].N; t++){scanf("%s", s1);sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);}}Link(a, k, p);}}return 0;
}

 

转载于:https://www.cnblogs.com/liuxin13/p/4797478.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

更新10_linux,时隔十年,QQ更新了Linux版本

昨天1024程序员节&#xff0c;QQ悄悄地更新了QQ for Linux&#xff0c;也许是给各位一个惊喜吧。官网及其的简陋。和一个Word文档似的。十年一更&#xff0c;有网友称&#xff0c;瞬间回到QQ2006&#xff0c;确实界面功能有些落后&#xff0c;相信QQ可以跟上潮流的&#xff0c;…

[渗透测试]扫目录,Sqlmap利用均超时,利用dirb扫描

今天碰到一个网友传来的Webshell地址&#xff0c;问我对方如何取得webshell。 网站为阿里云服务器&#xff0c;存在明显的注入漏洞&#xff0c;但是任何语句都会令网页报错&#xff0c;sqlmap一直超时&#xff0c;御剑扫描目录1个线程也会导致被屏蔽IP。 经一学长提点&#xff…

x = x+1,x+=1,x++那个的执行效率高

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** x x1的效率最低 1&#xff09;读取右边x的地址 2&#xff09;执行x13&#xff09;读…

修正线性单元(Rectified linear unit,ReLU)

修正线性单元&#xff08;Rectified linear unit&#xff0c;ReLU&#xff09; Rectified linear unit 在神经网络中&#xff0c;常用到的激活函数有sigmoid函数f(x)11exp(−x)、双曲正切函数f(x)tanh(x)&#xff0c;今天要说的是另外一种activation function&#xff0c;recti…

C语言综合期末作业,内蒙古农业大学2010年期末c语言综合作业.doc

内蒙古农业大学2010年期末c语言综合作业综合练习作业#includeint main(void){int choice,i;void shuai();void ge();void wang();void bing();for(i1;i<5;i){printf("[1]统计字符个数\n");printf("[2]判断素数\n");printf("[3]求斐波那契数列\n&qu…

链表创建、逆置、删除详解

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 对链表的理解&#xff1a;http://www.nowamagic.net/librarys/veda/detail/2220 #inc…

python与shell的3种交互方式介绍

【目录】 1.os.system(cmd) 2.os.popen(cmd) 3.利用subprocess模块 4.subprocessor模块进阶 【概述】 考虑这样一个问题&#xff0c;有hello.py脚本&#xff0c;输出”hello, world!”&#xff1b;有testinput.py脚本&#xff0c;等待用户输入&#xff0c;然后打印用户输入的数…

C语言里if语句变量作为判断条件,C语言教学(九-上)if else判断语句

原标题&#xff1a;C语言教学(九-上)if else判断语句今天讲if else判断语句&#xff0c;简单理解就是进行条件判断&#xff0c;如果条件达到则执行if 里或else里的语句。先来看if。if的写法和for差不多,就是不用括号里的两个分号&#xff0c;if (条件) { }&#xff0c;if加括号…

const修饰指针和引用的用法【转贴】

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** const修饰的指针会额外的占内存吗&#xff1f; 仍然是4&#xff0c;不会占额外的…

调整linux系统时区

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 好吧&#xff0c;使用tzselect又靠谱些&#xff0c;使用前把/etc/localtime删除了。 执行上前那个告诉我文件重新了&#xff0c;所以就没有搞了转载于:https://www.cnblogs.com/hark0623/p/4807426.html

stm32c语言设计以及注释,13个基于STM32的经典项目设计实例,全套资料~-嵌入式系统-与非网...

STM32单片机现已火遍大江南北&#xff0c;各种教程资料也是遍布各大网站论坛&#xff0c;可谓一抓一大把&#xff0c;但大部分都差不多。今天总结了几篇电路城上关于STM32 的制作&#xff0c;不能说每篇都是经典&#xff0c;但都是在其他地方找不到的&#xff0c;很有学习参考意…

memcpy,strcpy,strncpy

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** memcpy c和c使用的内存拷贝函数.从源src所指的内存地址的起始位置开始拷贝n个字节…

二维数组联通子数组和最大

题目要求&#xff1a; 返回一个二维整数数组中最大联通子数组的和。输入一个二维整形数组&#xff0c;数组里有正数也有负数。文件输出。思路:和之前的动态规划相识&#xff0c;把二维数组转换为一维数组&#xff0c;先求每一个列的子数组和最大&#xff0c;最后在用正数就加&a…

c语言如何给变量加锁,C语言互斥锁-条件变量实现公共缓存区数据读写

#include char buffer[128];int has_data0;pthread_mutex_t mutex;pthread_cond_t cond;pthread_cond_t cond2;void read_buf(void){do{pthread_mutex_lock(&mutex);//锁定互斥锁if(has_data0){/*阻塞线程,等待另外一个线程发送信号&#xff0c;同时为公共数据区解锁*/pthr…

view-activity跟控件在onkey事件上的传递关系

android 中Activity跟View对于键盘的监听&#xff0c;主要有以下几个方法 //按键按下 public boolean onKeyDown(int keyCode, KeyEvent event) {} //按键弹起 public boolean onKeyUp(int keyCode, KeyEvent event) {} //常按 public boolean onKeyLongPress(int keyCode, Ke…

PMP考试的过与不过

*************************************************** 更多精彩&#xff0c;欢迎进入&#xff1a;http://shop115376623.taobao.com *************************************************** 我在一年多时间里参加了三次PMP考试&#xff0c;前两次都失败&#xff0c;直到第三次才…

JPA一对多循环引用的解决

说是解决&#xff0c;其实不是很完美的解决的&#xff0c;写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的&#xff0c;能否知道一二。 下面说说出现问题&#xff1a; 问题是这样的&#xff0c;当我查询一个一对多的实体的时候&#xff0c;工具直接就爆了&#xff0…

太原理工大学c语言课程设计报告,[太原理工大学C语言实验报告.doc

[太原理工大学C语言实验报告本科实验报告课程名称&#xff1a; 程序设计技术B实验项目&#xff1a;实验地点&#xff1a; 明向校区软件学院机房专业班级&#xff1a; 学号&#xff1a;学生姓名&#xff1a;指导教师&#xff1a; 呼克佑2014年 12月 日实验名称 实验一 C语言的运…

网页常用动态效果--悬浮广告

关键在于动态获取滚动坐标值 测试滚动事件 $(window).scroll(function(){ console.log($(window).scrolltop()); }) 获取三个高度&#xff1a;窗口高度&#xff0c;盒子高度以及滚动坐标值&#xff0c;将广告盒子设置为绝对定位&#xff0c;当鼠标滚动时&#xff0c;其top值为滚…

打印英文年历C语言函数,C语言打印年历

voidshow_year(int year){inti,j,k,t,n;                           // 用来辅助计数int table[24][21] {0};                     // 年历数组int month_day[12] {31,28,31,30,31,30,31,31,30,31,30,31}; // 每月上限天数i…