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

我目前使用Matrix对象缩放GraphicsPath,并且缩放效果很好,但是问题是获取了缩放因子。

我能想到的最好的技术是将GraphicsPath转换为Region,将Rectangle或Circle转换为Region,然后执行以下操作:

rgnShape.Intersect(rgnCircle);


然后检查是否:

rgnShape.IsEmpty()


但是,这只是告诉我该形状是否太大而无法适合,因此有必要将其缩小以缩小比例,然后重试(可能很多次)。

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

最佳答案

请参阅http://en.wikipedia.org/wiki/Smallest_circle_problem以西蒙(Simon)的点而不是路径来讨论此问题。


因此,请使用rgnShape.Intersect(rgnCircle);进行检查。如果失败,则绘制每条曲线并抓住离您发现的圆心最远的点(任何给定区域可能有多个这样的点)。
将它们添加到您的分数列表,重新应用算法。您无需从头开始;您无需考虑不在边界上的点(即,忽略不在算法初始调用中找到的“集合Q”中的点)。


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

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

这仍然很糟糕,但是比将每条曲线更改为点要好。

10-08 13:54