gpt4 book ai didi

c# - 如何确定 GDI+ 中两条线的交点?

转载 作者:行者123 更新时间:2023-11-30 18:56:08 24 4
gpt4 key购买 nike

我正在使用 .NET 创建一个带有绘图界面的应用程序,类似于 Visio。 UI 使用 Graphics.DrawLine 连接屏幕上的两个对象。这个简单的实现效果很好,但随着表面变得越来越复杂,我需要一种更可靠的方式来表示对象。这些强大的要求之一是确定两条线的交点,这样我就可以通过某种图形来指示分隔。

所以我的问题是,有人可以建议一种方法吗?也许使用不同的技术(可能是 GraphViz)或算法?

最佳答案

用 y = mx + c 表示直线对于计算机图形学来说是有问题的,因为垂直线要求 m 是无限的。

此外,计算机图形中的线有起点和终点,这与无限延伸的数学线不同。如果交叉点位于所讨论的两条线段上,人们通常只对线交叉感兴趣。

如果你有两条线段,一条从向量 x1 到 x1+v1,一条从向量 x2 到 x2+v2,那么定义:

a = (v2.v2 v1.(x2-x1) - v1.v2 v2.(x2-x1)) / ((v1.v1)(v2.v2) - (v1.v2)^2)
b = (v1.v2 v1.(x2-x1) - v1.v1 v2.(x2-x1)) / ((v1.v1)(v2.v2) - (v1.v2)^2)

其中对于向量 p=(px,py), q=(qx,qy),p.q 是点积 (px * qx + py * qy)。首先检查是否 (v1.v1)(v2.v2) = (v1.v2)^2 - 如果是,则线平行且不交叉。

如果它们不平行,则如果 0<=a<=1 和 0<=b<=1,则交点位于两条线段上,并由点给出

x1 + a * v1

编辑 a和b的方程推导如下。交点满足矢量方程

x1 + a*v1 = x2 + b*v2

通过将此方程与 v1v2 相乘,我们得到两个方程:

v1.v1*a - v2.v1*b = v1.(x2-x1)
v1.v2*a - v2.v2*b = v2.(x2-x1)

它形成了 a 和 b 的两个线性方程。求解该系统(通过将第一个方程乘以 v2.v2,将第二个方程乘以 v1.v1 并减去,或以其他方式)给出 a 和 b 的方程。

关于c# - 如何确定 GDI+ 中两条线的交点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/153592/

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