GraphicsPath Polygon Fitting in C#

我需要将任意形状的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);
来检查它是否有效。如果失败,则取每条曲线并抓住距离您找到的圆心最远的点(对于任何给定区域,可能有多个这样的点)。 将它们添加到您的点列表中重新应用算法。你不需要从头开始;您不需要考虑不在边界上的点(即,忽略原始调用算法找不到的“Set Q”中的点)。 请注意,这不再是线性的,因为生成递归调用的概率不再是第i个点的1 / i。 这有一个必须明确处理的边缘条件。如果在步骤1的第一次迭代期间发现的区域之外找到的曲线之一是完全圆形并且接触外圆,则在“设置Q”内将存在无限点,并且该算法将失败地失败。所以,在第一次应用
rgnShape.Intersect(rgnCircle);
之后,你应该明确地检查任何完美的圆形曲线。例如,如果你的形状是
(}
,你应该明确地检查
()
(为了讨论的目的,假装
()
是一个圆圈),如果
(
位于第一次迭代中找到的区域之外。 这仍然很糟糕,但它比将每条曲线变成点更好。     
我不明白为什么你需要二进制搜索。 一旦获得了形状的边界矩形,并且您想要适合形状的目标矩形,就可以比较两个比率
targetHeight / shapeHeight
targetWidth / shapeWidth
。 取较小的比例,并将其用作比例因子来缩放您的形状。 如果目标是圆形而不是矩形,则可以通过采用
targetCircleDiameter / boundingRectangleDiagonal
的比率使用类似的解决方案,并将其用作缩放系数。     
你可以在GraphicsPath和Region上使用GetBounds,然后比较矩形的大小,至少让你接近。 如果定义的空间是一个应该精确的正方形。 如果定义的空间是别的东西,那至少会让你接近。然后,您可以使用二进制搜索来查找实际的缩放量。     
你不能计算图形路径的中心和半径吗? 您可以计算重心(坐标的平均值)并添加2倍的标准偏差 - 这应该可以获得大约92%的图表 - 大部分时间它会很好,但如果图表的“重量”最大则会失败在一端。 您还可以计算点的中心 - 遍历所有点,在计算边界框时获取所有方向上的最大/最小点,取此中心并测量与(最大/最小)点的最长距离作为半径。 如果你寻找一个边界球体算法,你可能会发现一个更复杂的算法 - 但如果它只是为了展示一些东西你可以做一些权衡。如果您正在进行碰撞检测,那么也存在一些快速算法:)     
用简单的数学怎么样?即,获取路径的边界框/圆,计算预定义的高度/宽度矩形比,将其与BB的相同值进行比较,相应地拉伸BB(例如,如果预定义比率小于1,则BB水平拉伸并且垂直地否则匹配相同的比率),最后将整个事物缩放到预定义的矩形尺寸。比例因子现在只是预定义高度除以BB高度和预定义宽度除以BB宽度之间的最小值。 (对于边界圆,无需调整其大小。)     

要回复问题请先登录注册