// COPYRIGHT (C) Tom. ALL RIGHTS RESERVED. // THE AntdUI PROJECT IS AN WINFORM LIBRARY LICENSED UNDER THE Apache-2.0 License. // LICENSED UNDER THE Apache License, VERSION 2.0 (THE "License") // YOU MAY NOT USE THIS FILE EXCEPT IN COMPLIANCE WITH THE License. // YOU MAY OBTAIN A COPY OF THE LICENSE AT // // http://www.apache.org/licenses/LICENSE-2.0 // // UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE // DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. // SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND // LIMITATIONS UNDER THE License. // GITEE: https://gitee.com/antdui/AntdUI // GITHUB: https://github.com/AntdUI/AntdUI // CSDN: https://blog.csdn.net/v_132 // QQ: 17379620 using System; using System.Drawing; namespace AntdUI { public struct Vector { double _x, _y; public Vector(double x, double y) { _x = x; _y = y; } public Vector(PointF pt) { _x = pt.X; _y = pt.Y; } public Vector(PointF st, PointF end) { _x = end.X - st.X; _y = end.Y - st.Y; } public double X { get { return _x; } set { _x = value; } } public double Y { get { return _y; } set { _y = value; } } public double Magnitude { get { return Math.Sqrt(X * X + Y * Y); } } public static Vector operator +(Vector v1, Vector v2) { return new Vector(v1.X + v2.X, v1.Y + v2.Y); } public static Vector operator -(Vector v1, Vector v2) { return new Vector(v1.X - v2.X, v1.Y - v2.Y); } public static Vector operator -(Vector v) { return new Vector(-v.X, -v.Y); } public static Vector operator *(double c, Vector v) { return new Vector(c * v.X, c * v.Y); } public static Vector operator *(Vector v, double c) { return new Vector(c * v.X, c * v.Y); } public static Vector operator /(Vector v, double c) { return new Vector(v.X / c, v.Y / c); } public double CrossProduct(Vector v) { return _x * v.Y - v.X * _y; } public double DotProduct(Vector v) { return _x * v.X + _y * v.Y; } public static bool IsClockwise(PointF pt1, PointF pt2, PointF pt3) { Vector v1 = new Vector(pt2, pt1), v2 = new Vector(pt2, pt3); return v1.CrossProduct(v2) < 0; } public static bool IsCCW(PointF pt1, PointF pt2, PointF pt3) { Vector v1 = new Vector(pt2, pt1), v2 = new Vector(pt2, pt3); return v1.CrossProduct(v2) > 0; } public static double DistancePointLine(PointF pt, PointF lnA, PointF lnB) { Vector v1 = new Vector(lnA, lnB), v2 = new Vector(lnA, pt); v1 /= v1.Magnitude; return Math.Abs(v2.CrossProduct(v1)); } public void Rotate(int degree) { double radian = degree * Math.PI / 180.0; double sin = Math.Sin(radian), cos = Math.Cos(radian); double nx = _x * cos - _y * sin, ny = _x * sin + _y * cos; _x = nx; _y = ny; } public PointF ToPointF() { return new PointF((float)_x, (float)_y); } } }