如何根据给定的长度确定矩形?
How do I determine a rectangle on the basis of the given lengths?
如果我有 4 条边给我,我如何确定这 4 条边是否形成一个矩形? 目前,我正在做的是:
-
将边的 4 个边作为大小为 4 的数组的输入;
-
sort(array,array+4)
对数组进行排序 -
for(int i=0;I<2;i+=2) { if(a[i] != a[i+1]) { 标志 = 假; 破; } }
但是,在这里我只是检查 4 条边是否是平行四边形。如何更改我的算法,使其检查它是否为矩形
我认为你可以通过以下方式获得它
-
首先检查是否只给出了四个唯一点。
-
其次,计算所有对距离,您必须获得最多三个不同的值。每个对角线一个,两侧两个。
-
那么双方必须满足毕达哥拉斯关系。
矩形(与三角形不同)不是刚性多边形; 这就是为什么如果你只给定四个长度,你就有无限多的可能数字。 例如,在最简单的[1, 1, 1, 1]
情况下,我们可以有四边形(矩形)或众多菱形之一(不是)。如果我们把问题陈述为
If any rectangle can be constructed with given lengths (lengths can be used in arbitrary order)
我们可以这样解决
- 获得所有四个长度
- 按升序对它们进行排序
- 检查
length[0] > 0
(所有长度均为正) - 检查
length[0] == length[1] && length[2] == length[3]
如果应该保留顺序(我们不能重新排列长度):
- 获得所有四个长度
- 检查(循环中)是否
length[i] > 0
(所有长度均为正数) - 检查
length[0] == length[2] && length[1] == length[3]
对于矩形,您必须检查相对的边(没有公共顶点)是否相等,并且两个对角线(也没有公共顶点)是否相似。 如果您检查所有可能性,您会发现共同属性是没有公共点的顶点之间的线段的所有可能性都必须是相同的长度(边对和两个对角线)
另一种更简单的方法是检查所有顶点是否在一个公共圆中(中心位于矩形中心),这是两个对角线的共同点,假设您在 P1、P2、P3 和 P4 处有顶点:你得到中点 C1 = (P1 + P3)/2 和 C2 = (P2 + P4)/2(C1 必须等于 C2)。 如果图形是矩形,则所有四个顶点必须位于一个圆中,中心为 C1 == C2 == C。 此外,所有点都必须在一个圆圈中。所以dist(Pi,C)一定是相同的。 我认为这是检查它们是否形成矩形的最直接方法。
注意
仅使用边长,您无法确定菱形是矩形,因为菱形的所有四个边相等,但不是矩形(它未能通过将所有顶点放在一个圆中的测试,因为两个对角线的大小不同),菱形也是如此(它的边等于二乘二, 但是对角线的大小不一样,顶点不在一个共同的圆圈中)
如果您有四个边和两个对角线,则这些边必须通过交替对相等,并且对角线的长度必须相等才能形成矩形。
- 有根的二进制搜索树.保留与其父级的链接
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Python中的for循环与C++有何不同
- 根中的组合
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- 在C++中释放内存期间,迭代器与指针有何不同
- 比根<操作员
- 使用根/C++时出错:没有匹配的构造函数来初始化'TTree'
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 在字符数组 (C++/根) 中查找双精度值
- 如何从命令行使用 cmake 为有根的安卓设备制作可执行文件?
- 从网站复制证书,并使用脚本将其添加到受信任的根证书颁发机构
- 从根权限进程创建可访问的文件
- 类中的 C++ int 被设置为值,似乎不知从何而来
- 提升图库示例 凯文培根的六度:示例中的 Vertex() 是什么
- -fvisibility-inline-hidden 与 gcc 中的 -fvisibility=hidden 有何不同
- 当包含头文件的文件不在根项目文件夹中时,如何包含它
- 如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
- 为什么我的二叉树会覆盖其根的叶子?
- C++没有标准功能的立方体根查找器