我想一开始我会回答一个简单的问题。底部的突出部分显然不会影响最大内部矩形的大小,因此我们可以假设您可以省略它。一旦被省略,在我看来就像两个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 度边缘的距离得出的。这个长度可以通过使用勾股定理来确定圆的半径长度加上“缺失”部分,然后减去已知半径来确定这个“缺失”部分的斜边长度,即等于 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>
我知道这里有很多假设和简化,但即使有所有这些,这也是一篇很长的帖子,所以我希望这足以满足您的需求。