[CSharpTips]C# 判断两条线段是否相交
2023-03-31 10:59:25 时间
C# 判断两条线段是否相交
主要用到了通过向量积的正负判断两个向量位置关系
向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的顺时针方向;若结果大于0,表示向量b在向量a的逆时针方向;若等于0,表示向量a与向量b平行
主要代码参考自文末链接,但是他并没有给出跨立检验函数的具体内容,因此补充了一下放在下面
using System; using System.Collections.Generic; using System.Windows; using System.Linq; using System.Text; using System.Threading.Tasks; namespace lineTest { class Program { public struct Point { public double X; public double Y; public Point(double x, double y) { X = x; Y = y; } } static void Main(string[] args) { Point a = new Point(0, 0); Point b = new Point(100, 100); Point c = new Point(100,0); Point d = new Point(0,100); var result = IsIntersect(a, b, c, d); }
public static bool IsIntersect(Point p1, Point p2, Point q1, Point q2) { //排斥试验,判断p1p2在q1q2为对角线的矩形区之外 if (Math.Max(p1.X, p2.X) < Math.Min(q1.X, q2.X)) {//P1P2中最大的X比Q1Q2中的最小X还要小,说明P1P2在Q1Q2的最左点的左侧,不可能相交。 return false; } if (Math.Min(p1.X, p2.X) > Math.Max(q1.X, q2.X)) {//P1P2中最小的X比Q1Q2中的最大X还要大,说明P1P2在Q1Q2的最右点的右侧,不可能相交。 return false; } if (Math.Max(p1.Y, p2.Y) < Math.Min(q1.Y, q2.Y)) {//P1P2中最大的Y比Q1Q2中的最小Y还要小,说明P1P2在Q1Q2的最低点的下方,不可能相交。 return false; } if (Math.Min(p1.Y, p2.Y) > Math.Max(q1.Y, q2.Y)) {//P1P2中最小的Y比Q1Q2中的最大Y还要大,说明P1P2在Q1Q2的最高点的上方,不可能相交。 return false; } //跨立试验 var crossP1P2Q1 = VectorCross(p1, p2, q1); var crossP1Q2P2 = VectorCross(p1, q2, p2); var crossQ1Q2P1 = VectorCross(q1, q2, p1); var crossQ1P2Q2 = VectorCross(q1, p2, q2); bool isIntersect = (crossP1P2Q1 * crossP1Q2P2 >= 0) && (crossQ1Q2P1 * crossQ1P2Q2 >= 0); return isIntersect; } private static double VectorCross(Point p1, Point p2, Point p3) { Vector vectorP1 = new Vector(p1.X, p1.Y); Vector vectorP2 = new Vector(p2.X, p2.Y); Vector vectorP3 = new Vector(p3.X, p3.Y); Vector vectorP1P2 = Vector.Subtract(vectorP2, vectorP1); Vector vectorP1P3 = Vector.Subtract(vectorP3, vectorP1); return Vector.CrossProduct(vectorP1P2, vectorP1P3); } } }
参考
https://blog.csdn.net/weixin_33973609/article/details/93580049
https://www.cnblogs.com/tuyang1129/p/9390376.html
相关文章
- 关于.NET玩爬虫这些事
- 为什么 .NET的反射这么慢?
- 在ASP.NET Core中使用百度在线编辑器UEditor
- MVC路由自定义及视图找寻规则
- 构建高性能ASP.NET应用的12点建议
- 你了解AJAX吗?TA不是新编程语言而是WEB应用程序技术
- 从.net转型,聊聊最近一些面试,薪资和想法
- ASP.NET 5 开发者的五个阶段​​
- 让编程更轻松的 7 个 Visual Studio 扩展
- 对 ASP.NET 异步编程的一点理解
- 推荐 7 款好用的 Visual Studio 扩展
- 给ASP.NET MVC及WebApi添加路由优先级
- 10年.NET老程序员推荐的7个开发类工具
- 19 个必须知道的 Visual Studio 快捷键
- 迄今为止最全的.NET技术栈
- .NET中删除空白字符串的10大方法
- 详细的.Net并行编程高级教程--Parallel
- 如何用.NET生成二维码?
- .net程序员工作两年总结
- .NET中删除空白字符串的10大方法