public void UpdateEdge(int edgeIndex) { Vector2 vector = (this._edges[edgeIndex].Point1 = this._vertices[(edgeIndex + 1) % this._vertices.Length]) - (this._edges[edgeIndex].Point0 = this._vertices[edgeIndex]); this._edges[edgeIndex].Length = Vector2ex.Normalize(ref vector, 1E-05f); this._edges[edgeIndex].Direction = vector; this._edges[edgeIndex].Normal = vector.Perp(); }
public void UpdateEdges() { int num = this._vertices.Length; int num2 = num - 1; for (int i = 0; i < num; i++) { Vector2 vector = (this._edges[num2].Point1 = this._vertices[i]) - (this._edges[num2].Point0 = this._vertices[num2]); this._edges[num2].Length = Vector2ex.Normalize(ref vector, 1E-05f); this._edges[num2].Direction = vector; this._edges[num2].Normal = vector.Perp(); num2 = i; } }
public static void CalcBarycentricCoords(ref Vector2 point, ref Vector2 v0, ref Vector2 v1, ref Vector2 v2, out Vector3 baryCoords) { Vector2 vector = v1 - v0; Vector2 vector2 = v2 - v0; Vector2 vector3 = point - v0; float num = Vector2ex.Dot(ref vector, ref vector); float num2 = Vector2ex.Dot(ref vector, ref vector2); float num3 = Vector2ex.Dot(ref vector2, ref vector2); float num4 = Vector2ex.Dot(ref vector3, ref vector); float num5 = Vector2ex.Dot(ref vector3, ref vector2); float num6 = 1f / (num * num3 - num2 * num2); baryCoords.y = (num3 * num4 - num2 * num5) * num6; baryCoords.z = (num * num5 - num2 * num4) * num6; baryCoords.x = 1f - baryCoords.y - baryCoords.z; }
public static float AngleRad(this Vector2 vector, Vector2 target) { Vector2ex.Normalize(ref vector, 1E-05f); Vector2ex.Normalize(ref target, 1E-05f); float num = vector.x * target.x + vector.y * target.y; if (num > 1f) { num = 1f; } else if (num < -1f) { num = -1f; } return(Mathf.Acos(num)); }
public static bool Create(IList <Vector2> vertices, float epsilon, out int dimension, out int[] indices) { Vector2ex.Information information = Vector2ex.GetInformation(vertices, epsilon); if (information == null) { dimension = -1; indices = null; return(false); } int count = vertices.Count; if (information.Dimension == 0) { dimension = 0; int[] array = new int[1]; indices = array; return(true); } if (information.Dimension == 1) { float[] array2 = new float[count]; Vector2 origin = information.Origin; Vector2 vector = information.Direction[0]; for (int i = 0; i < count; i++) { Vector2 value = vertices[i] - origin; array2[i] = vector.Dot(value); } ConvexHull1.Create(array2, epsilon, out dimension, out indices); return(true); } dimension = 2; Vector2[] array3 = new Vector2[count]; Vector2 min = information.Min; float d = 1f / information.MaxRange; for (int j = 0; j < count; j++) { array3[j] = (vertices[j] - min) * d; } Query2 query = new Query2(array3); int num = information.Extreme[0]; int num2 = information.Extreme[1]; int num3 = information.Extreme[2]; ConvexHull2.Edge edge; ConvexHull2.Edge edge2; ConvexHull2.Edge edge3; if (information.ExtremeCCW) { edge = new ConvexHull2.Edge(num, num2); edge2 = new ConvexHull2.Edge(num2, num3); edge3 = new ConvexHull2.Edge(num3, num); } else { edge = new ConvexHull2.Edge(num, num3); edge2 = new ConvexHull2.Edge(num3, num2); edge3 = new ConvexHull2.Edge(num2, num); } edge.Insert(edge3, edge2); edge2.Insert(edge, edge3); edge3.Insert(edge2, edge); ConvexHull2.Edge edge4 = edge; for (int k = 0; k < count; k++) { if (!ConvexHull2.Update(ref edge4, k, query)) { dimension = -1; indices = null; return(false); } } edge4.GetIndices(out indices); return(true); }