码迷,mamicode.com
首页 > 其他好文 > 详细

hihocoder 举行判断(计算几何)

时间:2015-02-25 18:19:02      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

判断是否为矩形,必须满足相异的4个点,存在4条边(不重合),边的向量只有两个,且两向量垂直;

满足这些条件就可以了

 

小知识点:

  两个向量垂直(x1,y1),(x2,y2)   x1 * x2 + y1 * y2 == 0;

  两个向量平行(x1,y2),(x2,y2)  x1 * y2 - x2 * y2 == 0;

 

#1040 : 矩形判断

时间限制:1000ms
单点时限:1000ms
内存限制:256MB

描述

给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形。

输入

输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

每组数据包含4行,每行包含4个整数x1, y1, x2, y2 (0 <= x1, y1, x2, y2 <= 100000);其中(x1, y1), (x2,y2)代表一条线段的两个端点。

输出

每组数据输出一行YES或者NO,表示输入的4条线段是否恰好围成矩形。

样例输入
3
0 0 0 1
1 0 1 1
0 1 1 1
1 0 0 0
0 1 2 3
1 0 3 2
3 2 2 3
1 0 0 1
0 1 1 0
1 0 2 0
2 0 1 1
1 1 0 1
样例输出
YES
YES
NO

 1 class Node {
 2     public:
 3         int x,y;
 4         Node(){}
 5         Node(int x,int y):x(x),y(y) {}
 6         bool operator < (const Node& rhs) const {
 7             return (x == rhs.x) ? y < rhs.y : x < rhs.x;
 8         }
 9 
10         bool operator == (const Node& rhs) const {
11             return x == rhs.x && y == rhs.y;
12         }
13 };
14 
15 class Line { 
16 public:
17     Node L1,L2;
18     Line() {}
19     Line(Node L1,Node L2):L1(L1),L2(L2){}
20     bool operator < (const Line& rhs) const {
21         return L1 == rhs.L1 ? L2 < rhs.L2 : L1 < rhs.L1;
22     }
23 };
24 
25 int main () {
26     int N;
27     //FR("1.txt");
28     cin >> N;
29     while (N--) {
30         set<Node> S; // 存储边的向量
31         set<Node> Point; // 存储点  4个点
32         vector<Node> V; // 用来给边排序,因为给的边的点不确定
33         set<Line> L;//存储边  4条边
34         REP(i,4) {
35             int x1,y1,x2,y2;
36             V.clear();
37             cin >> x1 >> y1 >> x2 >> y2;
38             Point.insert(Node(x1,y1));
39             Point.insert(Node(x2,y2));
40             V.push_back(Node(x1,y1));
41             V.push_back(Node(x2,y2));
42             sort(V.begin(),V.end());
43             S.insert(Node(V[1].x - V[0].x,V[1].y - V[0].y));
44             L.insert(Line(V[0],V[1]));
45         }
46         if (S.size() == 2 && Point.size() == 4 && L.size() == 4) {
47             // 接下来判断的是垂直
48             Node now[2];
49             set<Node>::iterator Iter = S.begin();
50             now[0] = *Iter++;
51             now[1] = *Iter;
52             if (now[0].x * now[1].x + now[0].y * now[1].y == 0) {
53                 cout << "YES" << endl;
54             }else cout << "NO" << endl;
55         }
56         else cout << "NO" << endl;
57     }
58 }

 

hihocoder 举行判断(计算几何)

标签:

原文地址:http://www.cnblogs.com/xiaoshanshan/p/4299823.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!