Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
        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));
        }
Esempio n. 5
0
        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);
        }