C#判断线段是否相交
生活随笔
收集整理的這篇文章主要介紹了
C#判断线段是否相交
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
線段是否相交,一種是從幾何上就是判斷兩個線段有沒有交點,還有一種是通過向量叉乘(也就是向量積)來判斷。因為向量叉乘的結果是一個垂直于原來兩個向量的新向量,可以簡單的理解為垂直于原來兩向量所在平面的向量。我們來看圖
?
/// <summary>/// 線段是否相交/// </summary>/// <param name="p1">線段P1P2的P1點</param>/// <param name="p2">線段P1P2的P2點</param>/// <param name="q1">線段Q1Q2的Q1點</param>/// <param name="q2">線段Q1Q2的Q2點</param>/// <returns></returns>public static bool IsIntersect(PointF p1, PointF p2, PointF q1, PointF 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 = VectorKits.Cross(p1, p2, q1);var crossP1Q2P2 = VectorKits.Cross(p1, q2, p2);var crossQ1Q2P1 = VectorKits.Cross(q1, q2, p1);var crossQ1P2Q2 = VectorKits.Cross(q1, p2, q2);bool isIntersect = (crossP1P2Q1 * crossP1Q2P2 >= 0) && (crossQ1Q2P1 * crossQ1P2Q2 >= 0);return isIntersect;} /// <summary>/// 矢量工具/// </summary>public class VectorKits{#region Cross/// <summary>/// 叉乘(P1P2 x P1P3)/// </summary>/// <param name="p1"></param>/// <param name="p2"></param>/// <param name="p3"></param>/// <returns></returns>public static float Cross(PointF p1, PointF p2, PointF p3){return (p2.X - p1.X) * (p3.Y - p1.Y) - (p2.Y - p1.Y) * (p3.X - p1.X);}/// <summary>/// 叉乘./// V1(x1, y1) X V2(x2, y2) = x1y2 – y1x2/// </summary>/// <param name="vector1"></param>/// <param name="vector2"></param>/// <returns></returns>public static float Cross(PointF vector1, PointF vector2){return Cross(vector1.X, vector1.Y, vector2.X, vector2.Y);}/// <summary>/// 叉乘/// </summary>/// <param name="v1X">v1向量的X分量</param>/// <param name="v1Y">v1向量的Y分量</param>/// <param name="v2X">v2向量的X分量</param>/// <param name="v2Y">v2向量的Y分量</param>/// <returns></returns>public static float Cross(float v1X, float v1Y, float v2X, float v2Y){return v1X * v2Y - v1Y * v2X;}#endregion#region Dot/// <summary>/// 點乘(P1P2 * P1P3)/// </summary>/// <param name="p1"></param>/// <param name="p2"></param>/// <param name="p3"></param>/// <returns></returns>public static float Dot(PointF p1, PointF p2, PointF p3){return (p2.X - p1.X) * (p3.X - p1.X) + (p3.Y - p1.Y) * (p2.Y - p1.Y);}/// <summary>/// 點乘./// V1( x1, y1) x V2(x2, y2) = x1*x2 + y1*y2/// </summary>/// <returns></returns>public static float Dot(PointF vector1, PointF vector2){return Dot(vector1.X, vector1.Y, vector2.X, vector2.Y);}/// <summary>/// 點乘./// V1( x1, y1) x V2(x2, y2) = x1*x2 + y1*y2/// </summary>/// <param name="v1X">v1向量的X分量</param>/// <param name="v1Y">v1向量的Y分量</param>/// <param name="v2X">v2向量的X分量</param>/// <param name="v2Y">v2向量的Y分量</param>/// <returns></returns>public static float Dot(float v1X, float v1Y, float v2X, float v2Y){return v1X * v2X + v1Y * v2Y;}#endregion }轉載請注明出處。
?
?
總結
以上是生活随笔為你收集整理的C#判断线段是否相交的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于A6s上的无法动态修改maxLeng
- 下一篇: 打卡复旦MBA首场公开课暨招生宣讲会,在