private void setVertex() { float xmin = float.MaxValue; float ymin = float.MaxValue; float xmax = float.MinValue; float ymax = float.MinValue; for (int i = 0; i < 4; i++) { xmax = Math.Max(xmax, vertex[i].X); ymax = Math.Max(ymax, vertex[i].Y); xmin = Math.Min(xmin, vertex[i].X); ymin = Math.Min(ymin, vertex[i].Y); } rect = new RectInt((int)xmin, (int)ymin, (int)(xmax - xmin), (int)(ymax - ymin)); AB = new Vector(vertex[0], vertex[1]); BC = new Vector(vertex[1], vertex[2]); CD = new Vector(vertex[2], vertex[3]); DA = new Vector(vertex[3], vertex[0]); // get unit vector AB /= AB.Magnitude; BC /= BC.Magnitude; CD /= CD.Magnitude; DA /= DA.Magnitude; }
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)); }
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 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 }
// A. B=|A|.|B|.cos(angle AOB) public double DotProduct(Vector v) { return _x * v.X + _y * v.Y; }
// A * B =|A|.|B|.sin(angle AOB) public double CrossProduct(Vector v) { return _x * v.Y - v.X * _y; }