缩放一个多边形以接触另一个多边形

问题描述

我希望缩放一个凹多边形(具体来说,对两个轴应用缩放仿射变换相对于形状的质心位置),使其相交/接触另一个凹多边形。每个多边形都由一组坐标定义。

下图显示了一种迭代方法:逐渐缩放多边形,直到两个多边形的最近点之间的距离为零(为此我使用了 JTS 库的 distanceOp.nearestPoints())。

有没有一种非迭代的方法来做到这一点?一种无需迭代缩放和检查即可立即生成所需缩放因子的方法

enter image description here

解决方法

我是这样看的:

overview

顶部三角形是要缩放的三角形,底部是要触摸的三角形。让我们先定义一些热。令缩放后的多边形(顶部)为A,底部为B 令缩放中心为P0(A 内的红点) 有两种情况(左右)。对于两者,在 A 和 B 中获得接触点/边缘(A、B 中的蓝色部分)位置足以计算比例。

  1. AB 触摸顶点的边缘(左)

    简单地从 P0 投射光线穿过 A 的每个顶点,然后对于 A 的每个边计算 A 的选定边和 {{ 的顶点之间的垂直距离1}} 位于饼图切片内(两条射线通过 A 端点的选定边缘投射。记住最近的一条。

  2. B 触摸边缘的顶点或 A 的顶点(右)

    简单地从 B 投射光线穿过 P0 的每个顶点,并找到与 A(到 B 的距离)最近的交点。

所以现在我们有一个可能的触摸列表,我们需要选择一个最小比例的触摸。因此,对于每个这样的触摸,我们需要知道 P0 与选定顶点或边之间的距离(称之为 P0)以及 daP0 中的触摸点之间的距离(称之为 {{1} })。从那里应用比例更改为 B,我们希望 db 如此:

da

在某些情况下,da = db 的边缘可以接触 da' = da*scale = db scale = db/da 的边缘,但是这种情况由 A 处理,因为 B 的任一边缘完全位于 {{ 的内部边缘1}} 所以 #1,#2 的顶点也碰到那里,或者 B 的边缘与射线相交,相交再次相同。

,

您可以围绕缩放中心“展开”两个形状,即转换为(距离、方位角)坐标。两种形状都可以在(可能重叠的)扇区中分解,并且通过排序/合并过程,您可以找到两个多边形的单个边缘彼此面对的扇区部分。到端点的距离的所有比率中最小的将为您提供解决方案。顶点排序后,合并过程与顶点总数成线性关系。

enter image description here