题目大意:给一些几何图形的编号,求出来这些图形都和那些相交。
 
分析:输入的正方形对角线上的两个点,所以需要求出来另外两个点,公式是:
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
别的图形的点也都是按照顺序给的,两个图形如果相交一定是边的相交,一个图形把另一个包含不算相交。所以处理完输入输出,还是比较容易做的。
 
代码如下:
========================================================================================================================
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. const int MAXN = ;
  8. const double EPS = 1e-;
  9.  
  10. int Sign(double t)
  11. {
  12. if(t > EPS)return ;
  13. if(fabs(t) < EPS)return ;
  14. return -;
  15. }
  16. struct Point
  17. {
  18. double x, y;
  19. Point(double x=, double y=):x(x),y(y){}
  20. Point operator - (const Point &tmp)const{
  21. return Point(x-tmp.x, y-tmp.y);
  22. }
  23. double operator ^(const Point &tmp)const{
  24. return x*tmp.y - y*tmp.x;
  25. }
  26. };
  27. struct Segment
  28. {
  29. Point S, E;
  30. Segment(Point S=, Point E=):S(S), E(E){}
  31. bool Intersect(const Segment &tmp)const{
  32. int t1 = Sign((S-E)^(tmp.S-E));
  33. int t2 = Sign((S-E)^(tmp.E-E));
  34.  
  35. return abs(t1+t2) != ;
  36. }
  37. };
  38. struct Shapes
  39. {
  40. Segment sg[MAXN];
  41. int N;
  42. };
  43. bool Find(int u, int v, Shapes a[])
  44. {
  45. for(int i=; i<a[u].N; i++)
  46. for(int j=; j<a[v].N; j++)
  47. {
  48. if(a[u].sg[i].Intersect(a[v].sg[j]) && a[v].sg[j].Intersect(a[u].sg[i]))
  49. return true;
  50. }
  51.  
  52. return false;
  53. }
  54. void Link(Shapes a[], int k, Point p[])
  55. {
  56. int i, N=a[k].N;
  57. p[N] = p[];
  58. for(i=; i<=N; i++)
  59. a[k].sg[i-] = Segment(p[i-], p[i]);
  60. }
  61. int main()
  62. {
  63. char Id[MAXN], s[MAXN], s1[MAXN], s2[MAXN];
  64. Shapes a[MAXN];
  65. Point p[MAXN];
  66.  
  67. memset(a, , sizeof(a));
  68.  
  69. while(scanf("%s", Id) != EOF && Id[] != '.')
  70. {
  71. if(Id[] == '-')
  72. {
  73. for(int i=; i<MAXN; i++)
  74. {
  75. if(a[i].N)
  76. {///如果这个符号的形状存在
  77. int ans[MAXN], k=;
  78. for(int j=; j<MAXN; j++)
  79. {
  80. if(!a[j].N || i==j)
  81. continue;
  82. if(Find(i, j, a) == true)
  83. ans[k++] = j;
  84. }
  85.  
  86. if(k == )
  87. printf("%c intersects with %c\n", i+'A', ans[]+'A');
  88. else if(k == )
  89. printf("%c has no intersections\n", i+'A');
  90. else
  91. {
  92. printf("%c intersects with %c", i+'A', ans[]+'A');
  93. for(int t=; t<k-; t++)
  94. printf(", %c", ans[t]+'A');
  95. if(k == )
  96. printf(" and %c\n", ans[k-]+'A');
  97. else
  98. printf(", and %c\n", ans[k-]+'A');
  99. }
  100. }
  101. }
  102. printf("\n");
  103. memset(a, , sizeof(a));
  104. }
  105. else
  106. {
  107. scanf("%s", s);
  108. int k = Id[] - 'A';
  109.  
  110. if(strcmp(s, "square") == )
  111. {///正方形
  112. a[k].N = ;
  113. scanf("%s%s", s1, s2);
  114. sscanf(s1, "(%lf,%lf)", &p[].x, &p[].y);
  115. sscanf(s2, "(%lf,%lf)", &p[].x, &p[].y);
  116.  
  117. p[].x = (p[].x+p[].x + p[].y-p[].y)/;
  118. p[].y = (p[].x-p[].x + p[].y+p[].y)/;
  119. p[].x = (p[].x+p[].x + p[].y-p[].y)/;
  120. p[].y = (p[].x-p[].x + p[].y+p[].y)/;
  121. }
  122. else if(strcmp(s, "line") == )
  123. {///直线
  124. a[k].N = ;
  125. scanf("%s%s", s1, s2);
  126. sscanf(s1, "(%lf,%lf)", &p[].x, &p[].y);
  127. sscanf(s2, "(%lf,%lf)", &p[].x, &p[].y);
  128. }
  129. else if(strcmp(s, "rectangle") == )
  130. {///长方形
  131. a[k].N = ;
  132. for(int t=; t<; t++)
  133. {
  134. scanf("%s", s1);
  135. sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);
  136. }
  137. p[].x = p[].x-p[].x+p[].x;
  138. p[].y = p[].y-p[].y+p[].y;
  139. }
  140. else if(strcmp(s, "triangle") == )
  141. {///三角形
  142. a[k].N = ;
  143. for(int t=; t<; t++)
  144. {
  145. scanf("%s", s1);
  146. sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);
  147. }
  148. }
  149. else if(strcmp(s, "polygon") == )
  150. {///多边形
  151. scanf("%d", &a[k].N);
  152.  
  153. for(int t=; t<a[k].N; t++)
  154. {
  155. scanf("%s", s1);
  156. sscanf(s1, "(%lf,%lf)", &p[t].x, &p[t].y);
  157. }
  158. }
  159.  
  160. Link(a, k, p);
  161. }
  162. }
  163.  
  164. return ;
  165. }

Geometric Shapes - POJ 3449(多边形相交)的更多相关文章

  1. POJ 3449 Geometric Shapes --计算几何,线段相交

    题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一 ...

  2. poj 3082多边形相交 'Roid Rage

    题意是判断多边形是否相交 主要的思路就是判断每一个点是否在另外的多变形内 判断一个点是否在另一个多边形内主要思路是: 判断的那个点向左边做射线,如果射线与多边形的交点为奇数个则在多边形内,偶数个则不在 ...

  3. POJ 3449 Geometric Shapes(判断几个不同图形的相交,线段相交判断)

    Geometric Shapes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1243   Accepted: 524 D ...

  4. TZOJ 2560 Geometric Shapes(判断多边形是否相交)

    描述 While creating a customer logo, ACM uses graphical utilities to draw a picture that can later be ...

  5. POJ 3449 Geometric Shapes (求正方形的另外两点)

    Geometric Shapes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1470   Accepted: 622 D ...

  6. Geometric Shapes (poj3449多边形相交)

    题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出 思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你 ...

  7. poj3449 Geometric Shapes【计算几何】

    含[判断线段相交].[判断两点在线段两侧].[判断三点共线].[判断点在线段上]模板   Geometric Shapes Time Limit: 2000MS   Memory Limit: 655 ...

  8. Inheritance - SGU 129(线段与多边形相交的长度)

    题目大意:给一个凸多边形(点不是按顺序给的),然后计算给出的线段在这个凸多边形里面的长度,如果在边界不计算. 分析:WA2..WA3...WA4..WA11...WA的无话可说,总之细节一定考虑清楚, ...

  9. hdu 5130(2014广州 圆与多边形相交模板)

    题意:一个很多个点p构成的多边形,pb <= pa * k时p所占区域与多边形相交面积 设p(x,y),       (x - xb)^2+(y - yb)^2 / (x - xa)^2+(y ...

随机推荐

  1. java中Map的用法(HaspMap用法)

    public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. import java.util.HashMap; impo ...

  2. Eclipse快捷键,前几个很实用

    F3 :查看实现 F4(或control + T) :继承树 control + F6 :切换文件 control + F7 :切换视图 control + F8 :切换模板 control + O ...

  3. 使用ArrayList对大小写字母的随机打印

    从a~z以及A~Z随机生成一个字母并打印:打印全部的字母 package com.liaojianya.chapter1; import java.util.ArrayList; /** * This ...

  4. LCS最长公共子序列HDU1159

    最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 Y ...

  5. MVVM模式应用 之的RelayCommand的使用

    实现MVVM模式Command是立下了汗马功劳.当然ICommand要引用using System.Windows.Input命名空间. 比如: (1)我们在xaml页面有一个Button按钮,我们需 ...

  6. Windows phone 之独立存储

    独立存储命名空间的说明:

  7. JavaScript 高阶函数 + generator生成器

    map/reduce map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果: function pow(x ...

  8. 轻松使用px为单位开发移动端页面

    研究移动端页面已经有许久了,一直执着于rem来开发,不谈性能怎么样,单从工作效率上看影响了不少,首先要固定设计稿的宽度,一般都是固定在640px,然后在根据根目录的字体大小来计算出每个元素的rem的值 ...

  9. Model Thinking1

    Why Model Reason # 1: Intelligent Citizen of the World Reason # 2: Clearer Thinker Reason # 3: Under ...

  10. Sevlet局部变量初始化

    //java 代码部分package com.servlet; import java.io.IOException; import java.io.PrintWriter; import java. ...