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); } }
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 )); }
/// <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; }
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); }
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); }
// 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); }
/// <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); }