任务是找到描述由图元(弧和线)组成的轮廓的矩形的面积(长度和宽度)。我有形成这些图元的点的坐标(图中的红点)
还有圆心坐标,但现在可能不需要了。我使用以下算法解决了这个问题:
- 从所有点进行分段,即将每个点与每个点连接起来;
- 在片段中搜索彼此垂直的片段;
- 在成对的垂直线段中,他找到了乘积最大的线段。这些是所需矩形的宽度和长度(以及因此的区域)。
该算法适用于大多数形状,包括第一张图中所示的形状。但是在这里我遇到了第二张图片中的一个数字:
很明显,我的算法在这里不起作用。他选择了正确的宽度(下底),但没有选择长度,因为 没有底部中心的坐标,因此可以构造一条连接底部中心和最高点的线段。
有一个选项可以找到下底座的中心,但此选项仅适用于第二张图纸。如果图 3 中的情况突然出现,那么该算法将再次失效。因为连接顶部与底部中心的线不会垂直于底部。
请告诉我用于查找描述轮廓的矩形的长度和宽度的通用算法的变体。
这是您的问题的部分解决方案的大纲,用于多边形,没有圆段。
我将尝试与“旋转卡尺”方法进行类比(我不知道一个好的俄语名称)。
考虑封闭矩形,其底边与水平面成某个角度 φ。令S(φ)为这个矩形的面积。我们的目标是在 [0, π/2) 上找到该函数的极值。
让 φ = 0 开始。考虑封闭矩形:
在我们的例子中,封闭矩形的边分别通过顶点A 1 、A 4 和A 1 、A 5 。首先,让我们找到仍然会出现这种情况的角度 φ 的值范围。让我们首先找出底部底座可以旋转多远,以使底部仍然停留在A ₁ 的顶部。该角度将是光束角A ₁ A 2、A ₁ A ₃、A ₁ A ₄、A ₁ A中的最小值₅。同样,我们找到其他四个边的旋转范围。这些范围的交集将给出 φ 值的范围,在该范围内,封闭矩形位于相同的顶点上。
对于这个范围,我们找到该区域的极值。设A 1 A 4 线段与水平线的夹角为 φ1,A 1 A 5 线段的夹角为φ2。表示d ₁ = | A ₁ A ₄|, d 2 = | A ₁ A ₅| 矩形的垂直边是d ₁ sin(φ − φ₁),水平边是d ₂ sin(φ + π/2 − φ₂) = d ₂ cos(φ − φ₂)。
面积为d ₁ d 2 sin(φ − φ₁) cos(φ − φ₂) = d ₁ d ₂ (sin (2φ − φ₁ − φ₂) + sin (φ₂ − φ₁))/2。为了找到这个值的极值,我们可以丢弃常数d ₁ d ₂/2 和 sin (φ₂ − φ₁),并记住在参数为 3π/2 + 的点处达到了正弦的最小值k 2π,或在段的末端。
将线段末端的面积值以及 3π/4 + (φ₁ + φ₂)/2 + k · π(如果它们落在线段上)形式的点相互比较,我们得到该细分市场的最低要求。
好的。更简单。进一步转动底,我们考虑下底的参考点为A ₅ 的情况,我们重复考虑这部分 φ 的值。我们继续直到 φ 达到值 π/2。
一切。
您还需要将此算法推广到弯曲边的情况。在这里,参考点将沿着 φ 变化的圆弧滚动,这原则上允许我们进行相同的考虑。
敢!