C++判断四个点能否构成正方形(续)
2018-03-26 11:13
246 查看
在前面的文章C++判断四个点能否构成正方形
中,关于“直角边中三个点是如何选择的?”和“正方形四条边中四个点是如何选择的?”,没有进行解释,这里做了详细的讲述:
第3个点都是距离第0个点最远的点,
正方形中距离最远的两个点就是对角线上的两个点,即第3个点是第0个点的对角点,
所以确定点的序号,其实就是确定对角点,为计算直角做准备。
现在可以知道:0,3为对角点,那么1,2也是对角点,
所以计算直角时,可以有四x2种选择:
1:(1,0,2)(2,0,1) 2:(0,1,3) (3,1,0) 3:(1,3,2) (2,3,1) 4:(0,2,3) (3,2,0)
eg:(1,0,2)
IsRightAngle(a[1], a[0], a[2]);
中间的数字是直角的顶点序号。
故四条边就可以是 (0,1),(0,2),(1,3),(2,3)
对于该题目而言,到此为止就可以计算了,如果想深究的话:
根据判断结果:其实在确定点的编号时,用到的比较函数cmp(point,point),是可以唯一确认顺逆时针的:
(1)x升序,y降序: 点 0->2->3->1->0 确定的正方形为顺时针,反之,则是逆时针
(2)x降序,y升序: 点 0->2->3->1->0 确定的正方形也为顺时针,反之,则是逆时针
即顺时针:s1(0,2),s2(2,3),s3(3,1),s4(1,0) 逆时针:s1(0,1),s2(1,3),s3(3,2),s4(2,0)
eg:
s1 = TwoPointDiatance(a[0], a[2]); //s1(0,2)
s2 = TwoPointDiatance(a[2], a[3]); //s2(2,3)
s3 = TwoPointDiatance(a[3], a[1]); //s3(3,1)
s4 = TwoPointDiatance(a[1], a[0]); //s4(1,0)
(1.1) x升序,y降序
(2.1)x降序,y升序
修正后的整体代码如下:
中,关于“直角边中三个点是如何选择的?”和“正方形四条边中四个点是如何选择的?”,没有进行解释,这里做了详细的讲述:
I: 确定点 关系着 计算直角时三个点的选择:
确定点的序号(0,1,2,3)时,无论比较函数 cmp(point,point) 怎么排序,第3个点都是距离第0个点最远的点,
正方形中距离最远的两个点就是对角线上的两个点,即第3个点是第0个点的对角点,
所以确定点的序号,其实就是确定对角点,为计算直角做准备。
现在可以知道:0,3为对角点,那么1,2也是对角点,
所以计算直角时,可以有四x2种选择:
1:(1,0,2)(2,0,1) 2:(0,1,3) (3,1,0) 3:(1,3,2) (2,3,1) 4:(0,2,3) (3,2,0)
eg:(1,0,2)
IsRightAngle(a[1], a[0], a[2]);
中间的数字是直角的顶点序号。
II: 确定点 也关系着 确定边时两个点的选择:
根据I:0,3是对角点,1,2是对角点故四条边就可以是 (0,1),(0,2),(1,3),(2,3)
对于该题目而言,到此为止就可以计算了,如果想深究的话:
III:根据点的序号,确定边s1,s2,s3,s4按顺时针还是逆时针排列的
就需要做如下判断了:根据判断结果:其实在确定点的编号时,用到的比较函数cmp(point,point),是可以唯一确认顺逆时针的:
(1)x升序,y降序: 点 0->2->3->1->0 确定的正方形为顺时针,反之,则是逆时针
(2)x降序,y升序: 点 0->2->3->1->0 确定的正方形也为顺时针,反之,则是逆时针
即顺时针:s1(0,2),s2(2,3),s3(3,1),s4(1,0) 逆时针:s1(0,1),s2(1,3),s3(3,2),s4(2,0)
eg:
s1 = TwoPointDiatance(a[0], a[2]); //s1(0,2)
s2 = TwoPointDiatance(a[2], a[3]); //s2(2,3)
s3 = TwoPointDiatance(a[3], a[1]); //s3(3,1)
s4 = TwoPointDiatance(a[1], a[0]); //s4(1,0)
(1.1) x升序,y降序
bool cmp(point a, point b) { if (a.x != b.x) return a.x < b.x; //如果横坐标不相等,所有点按横坐标升序排列---x升序 return a.y > b.y;//如果横坐标相等,所有点按纵坐标降序排列----------y降序 }
(2.1)x降序,y升序
bool cmp(point a, point b) { if (a.x != b.x) return a.x > b.x; //如果横坐标不相等,所有点按横坐标降序排列---x降序 return a.y < b.y;//如果横坐标相等,所有点按纵坐标升序排列----------y升序 }
修正后的整体代码如下:
//C++判断四个点能否构成正方形 #include<iostream> #include<algorithm> #include<cmath> using namespace std; struct point { double x, y; } a[4]; bool cmp(point a, point b)//x升序,y降序, 点 0->2->3->1->0 确定的正方形为顺时针,此时,边为:s1(0,2),s2(2,3),s3(3,1),s4(1,0) { if (a.x != b.x) return a.x < b.x; //如果,横坐标不相等,所有点按横坐标升序排列 return a.y > b.y;//如果横坐标相等,所有点按纵坐标降序排列 } double TwoPointDiatance(point a, point b)//计算两点之间的距离 { return sqrt(pow((a.x - b.x), 2) + pow((a.y - b.y), 2)); } bool IsRightAngle(point A, point O, point B)//判断 角AOB 是否为直角 { double x; x = (A.x - O.x)* (B.x - O.x) + (A.y - O.y)*(B.y - O.y); if (x == 0) return 1; else return 0; } int main() { int t, k; double s1, s2, s3, s4; cout << "请问您想要玩几次? "; cin >> t; cout << "输入4个点的坐标:" << endl; while (t--) { for (int i = 0; i < 4; i++) cin >> a[i].x >> a[i].y; //确定点,排序,给点确定标号 sort(a, a + 4, cmp); //确定边,边要确定是顺时针还是逆时针,就得看确定点时的排序情况了。下面就是顺时针排列的。 s1 = TwoPointDiatance(a[0], a[2]); s2 = TwoPointDiatance(a[2], a[3]); s3 = TwoPointDiatance(a[3], a[1]); s4 = TwoPointDiatance(a[1], a[0]); //分析是否为正方形 if (s1 == s2&&s3 == s4&&s1 == s2&&s1 != 0 && IsRightAngle(a[1], a[0], a[2]))//三个条件同时满足(1:四条边相等,2:边不为0,3:有一个直角) cout << "Yes" << endl; else cout << "No" << endl; cout << "还剩 " << t << " 次。" << endl; cout << "输入4个点的坐标:" << endl; } return 0; /* 几组正方形测试坐标: 0 1 1 1 1 0 0 0 0 2 3 -2 -1 -5 -4 -1 0 4 4 7 7 3 3 0 0 1 1 6 5 0 6 5 */ }
相关文章推荐
- C++判断四个点能否构成正方形
- hdu 5206 判断三维空间中的四个点是否构成正方形
- hdu5365 判断四个点是否构成正方形
- 【编程题】-C++实现:判断字符串在末尾加一个字符,能否构成回文串
- hdu 5206:Four Inages Strategy(判断四个点能否组成正方形)
- 定义一个函数,判断三个整形边长能否构成三角形,如果是三角形,则判断它是否是直角三角形。
- php函数,通过平面内的四个坐标点判断是否是正方形
- 已三个点坐标,判断能否构成三角形。若能,则求三角形外接圆的圆心和半径
- c语言:任给三条边长,判断能否构成三角形,如果能,求出其面积和周长
- 判断a,b,c的值能否构成一个三角形
- hdu 5971 Wrestling Match 判断能否构成二分图 [Problem A]2016ACM/ICPC亚洲区大连站
- 判断输入三边能否构成三角形
- 判断四个点是不是组成正方形
- 腾讯模拟笔试编程题--根据输入的点坐标判断是够能构成一个正方形
- c语言:任给三条边长,判断能否构成三角形,如果能,求出其面积和周长
- 【Codeforces Round 271 (Div 2)C】【暴力 坐标变换】Captain Marmot 四个点绕中心旋转 最小步数使得构成正方形
- 给你一堆长度不一的棒子 让你判断用这些棒子(必须全用)能否拼成一个正方形
- c++之数组篇3:判断一个整数x能否被分解为n个连续的整数相加
- [Java]给定二维平面中的4个坐标点,如何判定这四个坐标点能否构成长方形?(经_典_面_试_题_目)
- JAVA之1.封装一类三角形对象Triangle,该类对象具有三条边的属性,具有初始化三角形的功能、修改边长的功能、判断三条边能否构成三角形的功能、求周长的功能、求面积的功能。