如何根据给定的长度确定矩形?
Posted
技术标签:
【中文标题】如何根据给定的长度确定矩形?【英文标题】:How do I determine a rectangle on the basis of the given lengths? 【发布时间】:2018-01-07 10:33:52 【问题描述】:如果给了我 4 条边,我如何确定这 4 条边是否构成一个矩形? 目前,我正在做的是:
在大小为 4 的数组中将 4 条边作为输入;
sort(array,array+4)
对数组进行排序
for(int i=0;i
但是,这里我只是检查 4 个边是否是平行四边形。如何更改我的算法以检查它是否是矩形
【问题讨论】:
你不能从边上唯一地重建一个四边形。 你的问题太模糊了。赋予你的“一面”究竟是什么——双重价值?如果这就是你所知道的,你就无法区分矩形和平行四边形,因为边长不能决定图形。您还需要有关角度、对角线或顶点坐标等的信息。 该值不是双倍的。它是 int.. 我认为您可以通过首先检查是否只给出四个唯一点来获得它。其次,计算所有对距离,您必须获得最多三个不同的值。每个对角线一个,两侧两个。那么两边必须满足毕达哥拉斯关系。 如果只给出长度,您将无法确定形状是否为矩形。如果您获得了形状顶点的坐标,那么如果您知道哪 2 个顶点定义了特定长度,则应该可以。您必须提供更多信息。 【参考方案1】:我想你可以得到它
首先检查是否只给出了四个唯一点。
其次,计算所有对距离,您必须获得最多三个不同的值。每个对角线一个,两侧两个。
那么边必须满足毕达哥拉斯关系。
【讨论】:
【参考方案2】:矩形(不同于三角形)不是一个刚性多边形;这就是为什么如果只给你四个长度,你就有无限多个可能的数字。例如。在最简单的[1, 1, 1, 1]
情况下,我们可以有正方形(rectangle)或众多菱形之一(not)。如果我们将问题表述为
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]
【讨论】:
【参考方案3】:对于矩形,您必须检查对边(没有公共顶点)是否相等,并且两条对角线(也没有公共顶点)是否相似。如果你检查所有的可能性,你会发现一个共同的属性是所有没有公共点的顶点之间的线段的可能性必须是相同的长度(对边和对角线)
另一种更简单的方法是检查所有顶点是否在一个公共圆中(中心在矩形中心),这是两条对角线的共同点,假设您在 P1、P2、P3 和 P4 处有顶点:你得到中点 C1 = (P1 + P3)/2 和 C2 = (P2 + P4)/2(C1 必须等于 C2)。如果您的图形是矩形,则所有四个顶点都必须位于中心为 C1 == C2 == C 的圆中。此外,所有点都必须在圆中。所以 dist(Pi, C) 必须相同。我认为这是检查它们是否形成矩形的最直接方法。
注意
仅凭边长,您无法确定 cuadrilateral 是矩形,因为菱形的四个边都相等,但不是矩形(它无法通过将所有顶点都放在圆,因为两条对角线的大小不同)对于菱形也是如此(它的边等于二乘二,但对角线的大小不同,并且顶点不落在一个共同的圆中)
如果您有四个边和两条对角线,则边必须由交替对相等,并且对角线必须等长才能形成一个矩形。
【讨论】:
以上是关于如何根据给定的长度确定矩形?的主要内容,如果未能解决你的问题,请参考以下文章