题意: 给四个点,判断四边形的形状。可能是正方形,矩形,菱形,平行四边形,梯形或普通四边形。

解法: 开始还在纠结怎么将四个点按序排好,如果直接处理的话,有点麻烦,原来凸包就可搞,直接求个凸包,然后点就自动按逆时针排好了,然后就判断就可以了,判断依据题目下面有,主要是用到点积和叉积,判断垂直用点积,判断平行用叉积。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #define eps 1e-8
  8. using namespace std;
  9.  
  10. struct Point{
  11. double x,y;
  12. Point(double x=, double y=):x(x),y(y) {}
  13. void input() { scanf("%lf%lf",&x,&y); }
  14. };
  15. typedef Point Vector;
  16. struct Circle{
  17. Point c;
  18. double r;
  19. Circle(){}
  20. Circle(Point c,double r):c(c),r(r) {}
  21. Point point(double a) { return Point(c.x + cos(a)*r, c.y + sin(a)*r); }
  22. void input() { scanf("%lf%lf%lf",&c.x,&c.y,&r); }
  23. };
  24. struct Line{
  25. Point p;
  26. Vector v;
  27. double ang;
  28. Line(){}
  29. Line(Point p, Vector v):p(p),v(v) { ang = atan2(v.y,v.x); }
  30. Point point(double t) { return Point(p.x + t*v.x, p.y + t*v.y); }
  31. bool operator < (const Line &L)const { return ang < L.ang; }
  32. };
  33. int dcmp(double x) {
  34. if(x < -eps) return -;
  35. if(x > eps) return ;
  36. return ;
  37. }
  38. template <class T> T sqr(T x) { return x * x;}
  39. Vector operator + (Vector A, Vector B) { return Vector(A.x + B.x, A.y + B.y); }
  40. Vector operator - (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); }
  41. Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p); }
  42. Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p); }
  43. bool operator < (const Point& a, const Point& b) { return a.x < b.x || (a.x == b.x && a.y < b.y); }
  44. bool operator >= (const Point& a, const Point& b) { return a.x >= b.x && a.y >= b.y; }
  45. bool operator <= (const Point& a, const Point& b) { return a.x <= b.x && a.y <= b.y; }
  46. bool operator == (const Point& a, const Point& b) { return dcmp(a.x-b.x) == && dcmp(a.y-b.y) == ; }
  47. double Dot(Vector A, Vector B) { return A.x*B.x + A.y*B.y; }
  48. double Length(Vector A) { return sqrt(Dot(A, A)); }
  49. double Angle(Vector A, Vector B) { return acos(Dot(A, B) / Length(A) / Length(B)); }
  50. double Cross(Vector A, Vector B) { return A.x*B.y - A.y*B.x; }
  51. Vector VectorUnit(Vector x){ return x / Length(x);}
  52. Vector Normal(Vector x) { return Point(-x.y, x.x) / Length(x);}
  53. double angle(Vector v) { return atan2(v.y, v.x); }
  54. int ConvexHull(Point* p, int n, Point* ch)
  55. {
  56. sort(p,p+n);
  57. int m = ;
  58. for(int i=;i<n;i++) {
  59. while(m > && Cross(ch[m-]-ch[m-], p[i]-ch[m-]) <= ) m--;
  60. ch[m++] = p[i];
  61. }
  62. int k = m;
  63. for(int i=n-;i>=;i--) {
  64. while(m > k && Cross(ch[m-]-ch[m-], p[i]-ch[m-]) <= ) m--;
  65. ch[m++] = p[i];
  66. }
  67. if(n > ) m--;
  68. return m;
  69. }
  70.  
  71. //data segment
  72. Point p[],ch[];
  73. Point A,B,C,D;
  74. //data ends
  75.  
  76. int main()
  77. {
  78. int t,n,i,cs = ;
  79. scanf("%d",&t);
  80. while(t--)
  81. {
  82. for(i=;i<;i++) p[i].input();
  83. printf("Case %d: ",cs++);
  84. int m = ConvexHull(p,,ch);
  85. if(m < ) { puts("Ordinary Quadrilateral"); continue; }
  86. A = ch[], B = ch[], C = ch[], D = ch[];
  87.  
  88. if(dcmp(Dot(B-A,D-A)) == && dcmp(Dot(B-A,C-B)) == && dcmp(Dot(C-B,C-D)) == && dcmp(Dot(D-C,D-A)) ==
  89. && dcmp(Length(B-A)-Length(C-B)) == && dcmp(Length(C-B)-Length(D-C)) == && dcmp(Length(C-D)-Length(A-D)) == )
  90. puts("Square");
  91. else if(dcmp(Dot(B-A,D-A)) == && dcmp(Dot(B-A,C-B)) == && dcmp(Dot(C-B,C-D)) == && dcmp(Dot(D-C,D-A)) ==
  92. && dcmp(Length(A-D)-Length(C-B)) == && dcmp(Length(A-B)-Length(C-D)) == )
  93. puts("Rectangle");
  94. else if(dcmp(Length(B-A)-Length(C-B)) == && dcmp(Length(C-B)-Length(D-C)) == && dcmp(Length(C-D)-Length(A-D)) == )
  95. puts("Rhombus");
  96. else if(dcmp(Length(A-D)-Length(B-C)) == && dcmp(Length(A-B)-Length(C-D)) == )
  97. puts("Parallelogram");
  98. else if(dcmp(Cross(B-C,D-A)) == || dcmp(Cross(B-A,D-C)) == )
  99. puts("Trapezium");
  100. else
  101. puts("Ordinary Quadrilateral");
  102. }
  103. return ;
  104. }

UVA 11800 Determine the Shape --凸包第一题的更多相关文章

  1. uva 11800 Determine the Shape

    vjudge上题目链接:Determine the Shape 第二道独自 A 出的计算几何水题,题意就是给你四个点,让你判断它是哪种四边形:正方形.矩形.菱形.平行四边形.梯形 or 普通四边形. ...

  2. 简单几何(四边形形状) UVA 11800 Determine the Shape

    题目传送门 题意:给了四个点,判断能构成什么图形,有优先规则 分析:正方形和矩形按照点积为0和长度判断,菱形和平行四边形按向量相等和长度判断,梯形按照叉积为0判平行.因为四个点是任意给出的,首先要进行 ...

  3. UVA 11800 - Determine the Shape 几何

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  4. hdu 1348 Wall(凸包模板题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 Wall Time Limit: 2000/1000 MS (Java/Others)    M ...

  5. [算法 笔记]2014年去哪儿网 开发笔试(续)第一题BUG修正

    上一篇的blog地址为:http://www.cnblogs.com/life91/p/3313868.html 这几天又参加了一个家公司的笔试题,在最后的编程题中竟然出现了去哪儿网开发的第一题,也就 ...

  6. 《学习OpenCV》练习题第五章第一题ab

    这道题是载入一幅带有有趣纹理的图像并用不同的模板(窗口,核)大小做高斯模糊(高斯平滑),然后比较用5*5大小的窗口平滑图像两次和用11*11大小的窗口平滑图像一次是否接近相同. 先说下我的做法,a部分 ...

  7. 《学习OpenCV》练习题第四章第一题b&c

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  8. 《学习OpenCV》练习题第四章第一题a

    #include <highgui.h> #include <cv.h> #pragma comment (lib,"opencv_calib3d231d.lib&q ...

  9. Google Code Jam 第一题

    通过的第一题,留做纪念,呵呵,非常简单,Africa 2010, Qualification Round: Store Credit. #include <stdio.h> #includ ...

随机推荐

  1. Ifvisible.js – 判断网页中的用户是闲置还是活动状态

    ifvisible.js 是一个跨浏览器.轻量级的方式,用户检查用户在浏览页面或正在与它进行交互.它可以处理活动状态,如在页面上空闲或活跃.您还可以使用 ifvisible.js 智能设置您的间隔,如 ...

  2. go语言条件语句 if else

    示例: if a < 5 { return 0 } else { return 1 } 关于条件语句,需要注意以下几点:  条件语句不需要使用括号将条件包含起来():  无论语句体内有几条语 ...

  3. CSS基础教程 -- 媒体查询屏幕适配

    响应式布局 Media Query 的使用方法 在上例中, 我们使用Media Queries来根据3种不同尺寸的窗口使用3种不同的样式.通过不同的媒体类型和条件定义样式表规则,媒体查询让CSS可以更 ...

  4. js 中{},[]中括号,大括号使用详解

    一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如:var LangShen = {"Name":"Langshen",&qu ...

  5. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q25-Q28)

    Question 25 You are designing a SharePoint 2010 farm in your organization. You need to design the li ...

  6. JQuery隐藏显示详情功能

    放置两个DIV:初始DIV :在Repetr绑定设置文字隐藏(三元运算符):'<%# Eval("字段2").ToString().Length>11?Eval(&qu ...

  7. assign、retain、copy使用异同

    1 三者的区别 首先,引用计数的概念:表示对象被引用的次数.当引用计数为 0 的时候,系统就会发送dealloc消息来释放内存. assign:用于基本数据类型,没有引用计数,因此不存在增加或减少引用 ...

  8. XML解析方案

    在iOS中,解析XML的手段有很多 苹果原生 NSXMLParser:SAX方式解析,使用简单 第三方框架 libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析 GDa ...

  9. Palo(OLAP database)–MOLAP

    本地安装:D:\Program Files (x86)\Jedox   Palo-Server https://www.openhub.net/p/p4155 维基百科:https://en.wiki ...

  10. 使用 AngularJS 开发一个大规模的单页应用(SPA)

      本文的目标是基于单页面应用程序开发出拥有数百页的内容,包括认证,授权,会话状态等功能,可以支持上千个用户的企业级应用. 下载源代码 介绍 (SPA)这样一个名字里面蕴含着什么呢? 如果你是经典的S ...