Пример #1
0
        public static void DrawRotatedCircle(float aX, float aY, float aRadius, float aAngleDeg,
                                             Color aColor, int aVertices = 12)
        {
            if (aVertices >= 3)
            {
                Vector2[] vertices = new Vector2[aVertices];
                float     rotation = AntMath.DegToRad(aAngleDeg);
                float     angle    = 0.0f;
                for (int i = 0; i < aVertices; i++)
                {
                    angle = ((i / (float)aVertices) * 360f) / 180f * Mathf.PI;
                    float dx = aRadius;
                    float dy = 0f;

                    vertices[i] = new Vector2(aX + Mathf.Cos(angle - rotation) * dx - Mathf.Sin(angle - rotation) * dy,
                                              aY - (Mathf.Sin(angle - rotation) * dx + Mathf.Cos(angle - rotation) * dy));

                    if (i == 0)
                    {
                        DrawLine(aX, aY, vertices[i].x, vertices[i].y, aColor);
                    }
                }

                DrawPath(vertices, aColor, true);
            }
        }
Пример #2
0
        public static Vector2 ExpandSegment(Vector2 aA, Vector2 aB, float aLenght)
        {
            var lenAB = AntMath.Distance(aA, aB);

            return(new Vector2(
                       aB.x + (aB.x - aA.x) / lenAB * aLenght,
                       aB.y + (aB.y - aA.y) / lenAB * aLenght
                       ));
        }
Пример #3
0
        /// <summary>
        /// Разворачивает сегмент в обе стороны до указанной длины.
        /// </summary>
        /// <param name="aA">Первая точка отрезка.</param>
        /// <param name="aB">Вторая точка отрезка.</param>
        /// <param name="aC">Первая точка нового отрезка.</param>
        /// <param name="aD">Вторая точка нового отрезка.</param>
        /// <param name="aLenght">Длина на которую необходимо увеличить сегмент.</param>
        public static void ExpandSegment(Vector2 aA, Vector2 aB, out Vector2 aC, out Vector2 aD, float aLenght)
        {
            var lenAB = AntMath.Distance(aA, aB);

            aC.x = aB.x + (aB.x - aA.x) / lenAB * aLenght;
            aC.y = aB.y + (aB.y - aA.y) / lenAB * aLenght;
            aD.x = aA.x + (aA.x - aB.x) / lenAB * aLenght;
            aD.y = aA.y + (aA.y - aB.y) / lenAB * aLenght;
        }
Пример #4
0
        public static void DrawRotatedPath(float aPivotX, float aPivotY, Vector2[] aPoints,
                                           float aAngleDeg, Color aColor, bool aLoop = false)
        {
            Vector2[] vertices = new Vector2[aPoints.Length];
            for (int i = 0; i < vertices.Length; i++)
            {
                vertices[i] = AntMath.RotatePointDeg(aPoints[i].x, aPoints[i].y, aPivotX, aPivotY, aAngleDeg);
            }

            DrawPath(vertices, aColor, aLoop);
        }
Пример #5
0
        public static void DrawArrow(float aX1, float aY1, float aX2, float aY2, Color aColor, float aSize = 0.5f)
        {
            Vector2 p1 = new Vector2(aX1, aY1);
            Vector2 p2 = new Vector2(aX2, aY2);
            Vector2 p3 = AntMath.RotatePointDeg(p2.x + aSize, p2.y, p2.x, p2.y, AntMath.AngleDeg(aX1, aY1, aX2, aY2) - 145f);
            Vector2 p4 = AntMath.RotatePointDeg(p2.x + aSize, p2.y, p2.x, p2.y, AntMath.AngleDeg(aX1, aY1, aX2, aY2) + 145f);

            DrawPath(new Vector2[5] {
                p1, p2, p3, p4, p2
            }, aColor);
        }
Пример #6
0
        // public static bool LinesCross(float aAB_x1, float aAB_y1, float aAB_x2, float aAB_y2, float aCD_x1, float aCD_y1, float aCD_x2, float aCD_y2)
        // {
        //  float d = (aAB_x2 - aAB_x1) * (aCD_y1 - aCD_y2) - (aCD_x1 - aCD_x2) * (aAB_y2 - aAB_y1);

        //  // Отрезки паралельны.
        //  if (Equal(d, 0.0f)) return false;

        //  float d1 = (aCD_x1 - aAB_x1) * (aCD_y1 - aCD_y2) - (aCD_x1 - aCD_x2) * (aCD_y1 - aAB_y1);
        //  float d2 = (aAB_x2 - aAB_x1) * (aCD_y1 - aAB_y1) - (aCD_x1 - aAB_x1) * (aAB_y2 - aAB_y1);
        //  float t1 = d1 / d;
        //  float t2 = d2 / d;

        //  return (t1 >= 0.0f && t1 <= 1.0f && t2 >= 0.0f && t2 <= 1.0f);
        // }

        // ---
        // public static bool SimpleLinesCross(Vector2 aA, Vector2 aB, Vector2 aC, Vector2 aD)
        // {
        //  if (AntMath.Equal(aA, aC) || AntMath.Equal(aA, aD) ||
        //      AntMath.Equal(aB, aC) || AntMath.Equal(aB, aD))
        //  {
        //      return false;
        //  }

        //  return (Intersect(aA.x, aB.x, aC.x, aD.x) &&
        //      Intersect(aA.y, aB.y, aC.y, aD.y) &&
        //      Area(aA, aB, aC) * Area(aA, aB, aD) <= 0.0f &&
        //      Area(aC, aD, aA) * Area(aC, aD, aB) <= 0.0f);
        // }

        // private static float Area(Vector2 aA, Vector2 aB, Vector2 aC)
        // {
        //  return (aB.x - aA.x) * (aC.y - aA.y) - (aB.y - aA.y) * (aC.x - aA.x);
        // }

        // private static bool Intersect(float aA, float aB, float aC, float aD)
        // {
        //  if (aA > aB) Swap(ref aA, ref aB);
        //  if (aC > aD) Swap(ref aC, ref aD);
        //  return AntMath.Max(aA, aC) <= AntMath.Min(aB, aD);
        // }

        // private static void Swap(ref float aA, ref float aB)
        // {
        //  float t = aA;
        //  aA = aB;
        //  aB = t;
        // }
        // ---

        /// <summary>
        /// Определяет пересечение двух отрезков.
        /// </summary>
        /// <param name="aA">Точка A отрезка AB.</param>
        /// <param name="aB">Точка B отрезка AB.</param>
        /// <param name="aC">Точка C отрезка CD.</param>
        /// <param name="aD">Точка D отрезка CD.</param>
        /// <param name="aIgnoreEqualPoints">Проверка, если какие-либо из вершин совпадают, то линии не пересекаются.</param>
        /// <returns>Возвращает true если отрезки пересекаются.</returns>
        public static bool LinesCross(Vector2 aA, Vector2 aB, Vector2 aC, Vector2 aD, bool aIgnoreEqualPoints = false)
        {
            if (aIgnoreEqualPoints &&
                (AntMath.Equal(aA, aC) || AntMath.Equal(aA, aD) ||
                 AntMath.Equal(aB, aC) || AntMath.Equal(aB, aD)))
            {
                return(false);
            }

            float d = (aD.y - aC.y) * (aB.x - aA.x) - (aD.x - aC.x) * (aB.y - aA.y);

            // Отрезки паралельны.
            if (Equal(d, 0.0f))
            {
                return(false);
            }

            float na = (aD.x - aC.x) * (aA.y - aC.y) - (aD.y - aC.y) * (aA.x - aC.x);
            float nb = (aB.x - aA.x) * (aA.y - aC.y) - (aB.y - aA.y) * (aA.x - aC.x);
            float ua = na / d;
            float ub = nb / d;

            return(ua >= 0.0f && ua <= 1.0f && ub >= 0.0f && ub <= 1.0f);
        }
Пример #7
0
        /// <summary>
        /// Находит ближайшую точку сегмента к указанной точке.
        /// </summary>
        /// <param name="aPoint">Точка ближайшую к которой необходимо найти.</param>
        /// <param name="aA">Первая точка отрезка.</param>
        /// <param name="aB">Вторая точка отрезка.</param>
        /// <returns>Возвращает ближайшую точку из отрезка к указанной.</returns>
        // public static Vector2 GetNearestPointFromSegment(Vector2 aPoint, Vector2 aA, Vector2 aB)
        // {
        //  var a = aPoint.x - aA.x;
        //  var b = aPoint.y - aA.y;
        //  var c = aB.x - aA.x;
        //  var d = aB.y - aA.y;

        //  var dot = a * c + b * d;
        //  var lenSq = c * c + d * d;
        //  var param = -1.0f;
        //  if (!AntMath.Equal(lenSq, 0.0f))
        //  {
        //      // In case of zero length line.
        //      param = dot / lenSq;
        //  }

        //  var result = Vector2.zero;
        //  if (param < 0.0f)
        //  {
        //      result.x = aA.x;
        //      result.y = aA.y;
        //  }
        //  else if (param > 1.0f)
        //  {
        //      result.x = aB.x;
        //      result.y = aB.y;
        //  }
        //  else
        //  {
        //      result.x = aA.x + param * c;
        //      result.y = aA.x + param * d;
        //  }

        //  return result;
        // }

        public static Vector2 GetNearestPointFromSegment(Vector2 aPoint, Vector2 aA, Vector2 aB)
        {
            return((AntMath.Distance(aPoint, aA) < AntMath.Distance(aPoint, aB)) ? aA : aB);
        }