public static bool IsCCW(PointF pt1, PointF pt2, PointF pt3) { Vector V21 = new Vector(pt2, pt1); Vector v23 = new Vector(pt2, pt3); return V21.CrossProduct(v23) > 0; // sin(angle pt2 pt1 pt3) < 0, 180<angle pt2 pt1 pt3 <360 }
public static double DistancePointLine(PointF pt, PointF lnA, PointF lnB) { Vector v1 = new Vector(lnA, lnB); Vector v2 = new Vector(lnA, pt); v1 /= v1.Magnitude; return Math.Abs(v2.CrossProduct(v1)); }
// A * B =|A|.|B|.sin(angle AOB) public double CrossProduct(Vector v) { return _x * v.Y - v.X * _y; }
// A. B=|A|.|B|.cos(angle AOB) public double DotProduct(Vector v) { return _x * v.X + _y * v.Y; }
public static bool IsClockwise(PointF pt1, PointF pt2, PointF pt3) { Vector V21 = new Vector(pt2, pt1); Vector v23 = new Vector(pt2, pt3); return V21.CrossProduct(v23) < 0; // sin(angle pt1 pt2 pt3) > 0, 0<angle pt1 pt2 pt3 <180 }