如何解决缩放一个多边形以接触另一个多边形
我希望缩放一个凹多边形(具体来说,对两个轴应用缩放仿射变换相对于形状的质心位置),使其相交/接触另一个凹多边形。每个多边形都由一组坐标定义。
下图显示了一种迭代方法:逐渐缩放多边形,直到两个多边形的最近点之间的距离为零(为此我使用了 JTS 库的 distanceOp.nearestPoints()
)。
有没有一种非迭代的方法来做到这一点?一种无需迭代缩放和检查即可立即生成所需缩放因子的方法?
解决方法
我是这样看的:
顶部三角形是要缩放的三角形,底部是要触摸的三角形。让我们先定义一些热。令缩放后的多边形(顶部)为A
,底部为B
令缩放中心为P0
(A 内的红点) 有两种情况(左右)。对于两者,在 A 和 B 中获得接触点/边缘(A、B 中的蓝色部分)位置足以计算比例。
-
A
的B
触摸顶点的边缘(左)简单地从
P0
投射光线穿过A
的每个顶点,然后对于A
的每个边计算A
的选定边和 {{ 的顶点之间的垂直距离1}} 位于饼图切片内(两条射线通过 A 端点的选定边缘投射。记住最近的一条。 -
B
触摸边缘的顶点或A
的顶点(右)简单地从
B
投射光线穿过P0
的每个顶点,并找到与A
(到B
的距离)最近的交点。
所以现在我们有一个可能的触摸列表,我们需要选择一个最小比例的触摸。因此,对于每个这样的触摸,我们需要知道 P0 与选定顶点或边之间的距离(称之为 P0
)以及 da
与 P0
中的触摸点之间的距离(称之为 {{1} })。从那里应用比例更改为 B
,我们希望 db
如此:
da
在某些情况下,da = db
的边缘可以接触 da' = da*scale = db
scale = db/da
的边缘,但是这种情况由 A
处理,因为 B
的任一边缘完全位于 {{ 的内部边缘1}} 所以 #1,#2
的顶点也碰到那里,或者 B
的边缘与射线相交,相交再次相同。
您可以围绕缩放中心“展开”两个形状,即转换为(距离、方位角)坐标。两种形状都可以在(可能重叠的)扇区中分解,并且通过排序/合并过程,您可以找到两个多边形的单个边缘彼此面对的扇区部分。到端点的距离的所有比率中最小的将为您提供解决方案。顶点排序后,合并过程与顶点总数成线性关系。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。