检查矩形框架是否为有效形状或无效形状。

4

enter image description here

以上图像包含4个点,用户可以将其拖动到图像框内的任何位置。我需要一种算法(逻辑),能够判断用户所画矩形是否为有效矩形。该矩形应为有效形状(梯形、三角形、四边形)。最佳方法是什么以确定矩形是否为有效形状。

以下图形为无效形状: enter image description here

enter image description here


意图是什么?这对我来说似乎是一个 XY 问题。你正在询问一个非常奇怪和非常具体的事情。用户为什么要画一个矩形?难道是为了裁剪图像吗? - Fogmeister
1
好的,但什么是有效的形状?为什么一个形状有效而另一个形状无效? - Fogmeister
我认为在这里采用不同的方法会更好。一个直角三角形可以吗?或者一个旋转45度的正方形?或者一个带有凹角的四边形怎么样?您最好提供可以移动和缩放的预定义形状。然后,用户可以选择三角形或梯形等形状,并将其移动到所需位置。 - Fogmeister
我已经编辑过了,请检查。 - Mukesh
如果允许用户独立移动四个点,那么无效形状的数量将比有效形状的数量多得多。我仍然会回到提供预设形状,让他们放置在图像上。 - Fogmeister
1个回答

1

您想检查您的形状是否为四边形,特别是凸四边形(查找凹多边形凸多边形)。对于您展示的两个问题,您可以使用两个测试:

  1. 对于第一个情况,您只需要检查两条边之间没有内角大于180度,即您的多边形是凸多边形。要做到这一点,请查看SO中的问题

  2. 我不确定检查“凸性”是否解决了第二种情况。您应该尝试。如果不行,您需要检查四个内角之和是否为360度(对于所有四边形都成立)。要获取两个线段之间的角度,您可以将它们转换为向量并使用点积。在顶点2处的角度将是:

v_{12} = (x2 - x1, y2 - y1) --> 从点1到点2的向量

v_{23} = (x3 - x2, y3 - y2) --> 从点2到点3的向量

现在计算点积

v_{12}.v_{23} = (x3 - x2)(x2 - x1) + (y3 - y2)(y2 - y1)

线段12和23之间夹角的余弦值是点积除以每个向量的模。


你能用代码解释一下吗?我知道这个逻辑,但是无法映射到代码上。我理解了第一个情况,但是第二个情况还不太清楚。我正在使用上述代码来计算点之间的角度。 - Mukesh
@muku,我在答案中添加了更多信息。 - rpsml
您还需要计算叉积。@rpsmi - Mukesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接