【问题标题】:Find bounding box fitting in a path在路径中查找边界框拟合
【发布时间】:2016-07-01 12:38:09
【问题描述】:

假设我们有这条路径:

我们如何找到适合里面的盒子的边界?

是的,我知道路径可以任意复杂,并且不能关闭。仍然对如何解决这个问题的建议感到好奇。

【问题讨论】:

  • 什么这么难?边界框位于最大和最小 x 和 y 坐标之间。
  • @Ben 我认为问题在于他如何找到形状内的最大和最小坐标......像圆角这样的东西使它变得更加困难。
  • 当然,您需要为算法提供起始坐标,因为在气泡中间搜索一个框与在下面的三角形内搜索会得到不同的结果。对于更复杂的路径来说更是如此。
  • 路径中可以放入的最大矩形,路径可以是任意的。我发布了这个问题,以防有一些关于这个问题的好理论可供阅读。
  • 另外,你可能想看看this paper

标签: wpf geometry bounding-box


【解决方案1】:

我想一开始我会回答一个简单的问题。底部的突出部分显然不会影响最大内部矩形的大小,因此我们可以假设您可以省略它。一旦被省略,在我看来就像两个RectangleGeometries 已经组合在一起,它们的RadiusXRadiusY 属性不为零。

我所做的近似值由下面的 xaml 给出:

<Path Fill="Black">
    <Path.Data>
        <CombinedGeometry GeometryCombineMode="Xor">
            <CombinedGeometry.Geometry1>
                <RectangleGeometry Rect="10,10,100,50" RadiusX="5" RadiusY="5" />
            </CombinedGeometry.Geometry1>
            <CombinedGeometry.Geometry2>
                <RectangleGeometry Rect="15,15,90,40" RadiusX="5" RadiusY="5"/>
            </CombinedGeometry.Geometry2>
        </CombinedGeometry>
    </Path.Data>
</Path>

对我来说,您的问题归结为一般如何找到适合内部RectangleGeometry 内部而不重叠其边界的最大矩形。为此,我们必须处理 RadiusXRadiusY 值。

为了简化现在的事情,我假设 RadiusX = RadiusY != 0 如果您碰巧对 RadiusX != RadiusY != 0 的情况感兴趣,那么我们可以过桥当我们到达它时。

当 x 和 y 半径相等时,只需使用圆形绘制出弯角。考虑到它的工作方式,并且考虑到半径值相对于图像的宽度和高度较小,这个圆圈将缩短内部空间,您可能正在寻找适合接触弯曲角的 45 度角的边界矩形。

要做到这一点,我们只需要计算出单个角损失的宽度和高度。由于我们正在谈论一个圆圈并考虑 45 度角,因此两个方向的损失将是相同的。使用一些简单的三角函数,给定半径值 R,我得出以下损失量:

单角方向的损失 = R(1 - sqrt(2)/2)

这是通过确定从非圆形版本的角到圆形圆的 45 度边缘的距离得出的。这个长度可以通过使用勾股定理来确定圆的半径长度加上“缺失”部分,然后减去已知半径来确定这个“缺失”部分的斜边长度,即等于 R(1 - sqrt(2))。

在收集到这个距离后,我再次使用三角函数来收集所得等腰三​​角形的边的大小,结果为 R(1 - sqrt(2)/2),这是我之前列出的方程。

最后,假设没有任何舍入的原始矩形将具有 x = x_o、y = y_o、宽度 = w_o、高度 = h_o 和 R = RadiusX = RadiusY != 0,我们将得到以下内接矩形:

x = x_o + R(1 - sqrt(2)/2)
y = y_o + R(1 - sqrt(2)/2)
宽度 = w_o - 2R(1 - sqrt(2)/2)
高度 = h_o - 2R(1 - sqrt(2)/2)

我使用以下 xaml 对此进行了测试:

<Path Stroke="Black">
    <Path.Data>
         <RectangleGeometry Rect="10,10,100,50" RadiusX="5" RadiusY="5"/>
    </Path.Data>
</Path>
<Path Stroke="Orange">
     <Path.Data>
         <RectangleGeometry Rect="11.47,11.47,97.07,47.07" RadiusX="0" RadiusY="0"/>
    </Path.Data>
</Path>

现在这并没有考虑到每个矩形几何图形的实际笔画重叠但内部不重叠,这就是我假设你正在寻找的。​​p>

我知道这里有很多假设和简化,但即使有所有这些,这也是一篇很长的帖子,所以我希望这足以满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2011-07-23
    • 2017-07-10
    相关资源
    最近更新 更多