找到路径中的边界框

时间:2016-03-15 20:59:40

标签: wpf geometry bounding-box

说我们有这条道路:

enter image description here

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

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

1 个答案:

答案 0 :(得分:3)

我想开始我会回答一个简单的答案。底部的突出显然不会影响最大内部矩形的大小,所以我们可以假设你可以省略它。一旦省略,在我看来,只有两个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度边缘的距离得出的。这个长度可以通过使用毕达哥拉斯定理来确定圆的半径的长度加上&#34;缺失的&#34;部分,然后只是减去已知的半径,以确定斜边的长度为#34;缺少&#34;部分等于R(1 - sqrt(2))。

一旦收集到这个距离,我再次使用三角法来收集得到的等腰三角形的腿的大小,该三角形出现在R(1 - sqrt(2)/ 2)这是我之前列出的等式。

所以最后,假设没有任何舍入的原始矩形将具有x = x_o,y = y_o,width = w_o,height = h_o,并且R = RadiusX = RadiusY!= 0,我们将得到以下内容用于我们的内切矩形:

x = x_o + R(1 - sqrt(2)/ 2)
y = y_o + R(1 - sqrt(2)/ 2)
width = w_o - 2R(1 - sqrt(2)/ 2)
height = 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>

现在这并没有考虑每个矩形几何体的实际笔划,它们重叠但内部不重叠,这就是我所假设的是你正在寻找的东西。

我知道有很多假设和简化在这里飞来飞去,但即使是所有这些都是一个非常长的帖子,所以我希望这对你正在寻找的东西足够好。