예제 #1
0
        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;
        }
예제 #2
0
 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));
 }
예제 #3
0
 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
 }
예제 #4
0
 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
 }
예제 #5
0
 // A. B=|A|.|B|.cos(angle AOB)
 public double DotProduct(Vector v)
 {
     return _x * v.X + _y * v.Y;
 }
예제 #6
0
 // A * B =|A|.|B|.sin(angle AOB)
 public double CrossProduct(Vector v)
 {
     return _x * v.Y - v.X * _y;
 }