gpt4 book ai didi

c# - C# 中的 GraphicsPath 多边形拟合

转载 作者:行者123 更新时间:2023-11-30 21:18:22 37 4
gpt4 key购买 nike

我需要将任意形状的 GraphicsPath“适合”到定义的空间(几乎总是矩形或圆形)。

我目前使用 Matrix 对象缩放 GraphicsPath 并且缩放工作正常,但问题是获取比例因子。

我能想到的最佳技术是将 GraphicsPath 转换为区域,将矩形或圆形转换为区域,然后执行:

rgnShape.Intersect(rgnCircle);

然后检查是否:

rgnShape.IsEmpty()

但是,这只是告诉我形状是否太大而不适合,并且有必要将形状缩放得更小,然后再试一次(可能很多次)。

有没有一种简单的方法可以立即计算出适合多边形 GraphicsPath 的比例因子,使其完全适合一个圆。结果应该是仍然完全适合圆的最大多边形。

最佳答案

参见 http://en.wikipedia.org/wiki/Smallest_circle_problem用于根据点而非路径讨论此问题,由 Simon 发现。

  1. 那么,这样做,使用 rgnShape.Intersect(rgnCircle); 来检查它是否有效。如果失败,则获取每条曲线并获取距离您找到的圆心最远的点(任何给定区域可能有多个这样的点)。

  2. 将它们添加到您的点列表中并重新应用算法。您不需要从头开始;您不需要考虑不在边界上的点(即,忽略不在最初调用算法时找到的“Set Q”中的点)。

请注意,这不再是线性的,因为对于第 i 个点,生成递归调用的概率不再是 1/i。

这有一个边缘条件,您必须明确处理。如果在步骤 1 的第一次迭代期间找到的区域之外发现的曲线之一是完美的圆形并且接触外圆,则“Set Q”内将有无限点并且该算法将失败。因此,在第一次应用 rgnShape.Intersect(rgnCircle); 之后,您应该针对这种情况明确检查任何完美的圆形曲线。例如,如果您的形状是 (},您应该明确检查 ()(出于本次讨论的目的,假装 () 是一个圆圈)如果 ( 位于第一次迭代期间找到的区域之外。

这仍然很糟糕,但总比将每条曲线变成点要好。

关于c# - C# 中的 GraphicsPath 多边形拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4288526/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com