Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- namespace gist.yifeitao.com
- {
- /// <summary>
- /// 二维坐标
- /// </summary>
- public struct Ponit2D
- {
- public double X;
- public double Y;
- public Ponit2D(double x, double y)
- {
- X = x;
- Y = y;
- }
- public static Ponit2D operator -(Ponit2D left, Ponit2D right)
- {
- return new Ponit2D(left.X - right.X, left.Y - right.Y);
- }
- public override string ToString()
- {
- return X + "," + Y;
- }
- /// <summary>
- /// 二维向量叉乘
- /// </summary>
- /// <param name="left">(x1,y1,0)</param>
- /// <param name="right">(x2,y2,0)</param>
- /// <returns>(0,0,z)</returns>
- public static double Cross(Ponit2D left, Ponit2D right)
- {
- return left.X*right.Y - left.Y*right.X;
- }
- /// <summary>
- /// 测试点S、T是否在线段AB的同侧
- /// </summary>
- /// <param name="pA"></param>
- /// <param name="pB"></param>
- /// <param name="pT"></param>
- /// <param name="pS"></param>
- /// <returns></returns>
- public static bool SameSideTest(Ponit2D pA, Ponit2D pB, Ponit2D pT, Ponit2D pS)
- {
- // ReSharper disable once InconsistentNaming
- Ponit2D vectorAB = pB - pA;
- // ReSharper disable once InconsistentNaming
- Ponit2D vectorAP = pT - pA;
- // ReSharper disable once InconsistentNaming
- Ponit2D vectorAQ = pS - pA;
- //判断条件,两个叉乘的符号相同,此处判定较为严格,靠近线段时认定为方向相同
- double r = Cross(vectorAB, vectorAP) * Cross(vectorAB, vectorAQ);
- return r >= 0;
- }
- /// <summary>
- /// 测试点T是否在三角形ABC内部
- /// </summary>
- /// <param name="pA"></param>
- /// <param name="pB"></param>
- /// <param name="pC"></param>
- /// <param name="pT"></param>
- /// <returns></returns>
- public static bool TriangleTest(Ponit2D pA, Ponit2D pB, Ponit2D pC, Ponit2D pT)
- {
- bool r = SameSideTest(pA, pB, pC, pT)
- && SameSideTest(pB, pC, pA, pT)
- && SameSideTest(pC, pA, pB, pT);
- return r;
- }
- /// <summary>
- /// 测试点T是否在凸四边形ABCD内部
- /// </summary>
- /// <param name="pA"></param>
- /// <param name="pB"></param>
- /// <param name="pC"></param>
- /// <param name="pD"></param>
- /// <param name="pT"></param>
- /// <returns></returns>
- public static bool QuadrilateralTest(Ponit2D pA, Ponit2D pB, Ponit2D pC, Ponit2D pD, Ponit2D pT)
- {
- //求重心
- Ponit2D pV = new Ponit2D((pA.X + pB.X + pC.X + pD.X) / 4, (pA.Y + pB.Y + pC.Y + pD.Y) / 4);
- //分割为四个三角形测试
- return TriangleTest(pA, pB, pV, pT)
- || TriangleTest(pB, pC, pV, pT)
- || TriangleTest(pC, pD, pV, pT)
- || TriangleTest(pD, pA, pV, pT);
- }
- /// <summary>
- /// 测试四边形ABCD是否为凸
- /// </summary>
- /// <param name="pA"></param>
- /// <param name="pB"></param>
- /// <param name="pC"></param>
- /// <param name="pD"></param>
- /// <returns></returns>
- public static bool BulgeTest(Ponit2D pA, Ponit2D pB, Ponit2D pC, Ponit2D pD)
- {
- return !TriangleTest(pA, pB, pC, pD)
- && !TriangleTest(pD, pB, pC, pA)
- && !TriangleTest(pA, pD, pC, pB)
- && !TriangleTest(pA, pB, pD, pC);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement