答案 0 :(得分:3)
我想开始我会回答一个简单的答案。底部的突出显然不会影响最大内部矩形的大小,所以我们可以假设你可以省略它。一旦省略,在我看来,只有两个RectangleGeometries
已合并,其RadiusX
和RadiusY
属性为非零。
我所做的近似值由下面的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
内部的最大矩形而不重叠其边界。为此,我们必须处理RadiusX
和RadiusY
值。
为了简化现在的事情,我假设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>
现在这并没有考虑每个矩形几何体的实际笔划,它们重叠但内部不重叠,这就是我所假设的是你正在寻找的东西。
我知道有很多假设和简化在这里飞来飞去,但即使是所有这些都是一个非常长的帖子,所以我希望这对你正在寻找的东西足够好。