gpt4 book ai didi

wpf - 查找适合路径的边界框

转载 作者:行者123 更新时间:2023-12-04 01:12:32 26 4
gpt4 key购买 nike

假设我们有这样的路径:

enter image description here

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

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

最佳答案

我想首先我会给出一个简单的答案。底部的突出部分显然不会影响最大内部矩形的大小,因此我们可以假设您可以省略它。一旦省略,在我看来只有两个 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>

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

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

关于wpf - 查找适合路径的边界框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com