Esempio n. 1
0
        public static Vector3 UnitCross(ref Vector3 vector, ref Vector3 value)
        {
            Vector3 result = new Vector3(vector.y * value.z - vector.z * value.y, vector.z * value.x - vector.x * value.z, vector.x * value.y - vector.y * value.x);

            Vector3ex.Normalize(ref result, 1E-05f);
            return(result);
        }
 public Circle3(Vector3 center, Vector3 normal, float radius)
 {
     this.Center = center;
     this.Normal = normal;
     Vector3ex.CreateOrthonormalBasis(out this.Axis0, out this.Axis1, ref this.Normal);
     this.Radius = radius;
 }
Esempio n. 3
0
        public static bool CreateInscribed(Vector3 v0, Vector3 v1, Vector3 v2, Vector3 v3, out Sphere3 sphere)
        {
            Vector3 vector  = v1 - v0;
            Vector3 vector2 = v2 - v0;
            Vector3 vector3 = v3 - v0;
            Vector3 value   = v2 - v1;
            Vector3 vector4 = v3 - v1;
            Vector3 vector5 = vector4.Cross(value);
            Vector3 vector6 = vector2.Cross(vector3);
            Vector3 vector7 = vector3.Cross(vector);
            Vector3 vector8 = vector.Cross(vector2);

            if (Mathf.Abs(Vector3ex.Normalize(ref vector5, 1E-05f)) < 1E-05f)
            {
                sphere = default(Sphere3);
                return(false);
            }
            if (Mathf.Abs(Vector3ex.Normalize(ref vector6, 1E-05f)) < 1E-05f)
            {
                sphere = default(Sphere3);
                return(false);
            }
            if (Mathf.Abs(Vector3ex.Normalize(ref vector7, 1E-05f)) < 1E-05f)
            {
                sphere = default(Sphere3);
                return(false);
            }
            if (Mathf.Abs(Vector3ex.Normalize(ref vector8, 1E-05f)) < 1E-05f)
            {
                sphere = default(Sphere3);
                return(false);
            }
            float[,] array = new float[3, 3];
            array[0, 0]    = vector6.x - vector5.x;
            array[0, 1]    = vector6.y - vector5.y;
            array[0, 2]    = vector6.z - vector5.z;
            array[1, 0]    = vector7.x - vector5.x;
            array[1, 1]    = vector7.y - vector5.y;
            array[1, 2]    = vector7.z - vector5.z;
            array[2, 0]    = vector8.x - vector5.x;
            array[2, 1]    = vector8.y - vector5.y;
            array[2, 2]    = vector8.z - vector5.z;
            float[,] a     = array;
            float[] b = new float[]
            {
                0f,
                0f,
                -vector8.Dot(vector3)
            };
            Vector3 vector9;

            if (LinearSystem.Solve3(a, b, out vector9, 1E-05f))
            {
                sphere.Center = v3 + vector9;
                sphere.Radius = Mathf.Abs(vector5.Dot(vector9));
                return(true);
            }
            sphere = default(Sphere3);
            return(false);
        }
        public void UpdateEdge(int edgeIndex)
        {
            Vector3 vector = (this._edges[edgeIndex].Point1 = this._vertices[(edgeIndex + 1) % this._vertices.Length]) - (this._edges[edgeIndex].Point0 = this._vertices[edgeIndex]);

            this._edges[edgeIndex].Length    = Vector3ex.Normalize(ref vector, 1E-05f);
            this._edges[edgeIndex].Direction = vector;
            this._edges[edgeIndex].Normal    = this._plane.Normal.Cross(vector);
        }
        public void UpdateEdges()
        {
            int num  = this._vertices.Length;
            int num2 = num - 1;

            for (int i = 0; i < num; i++)
            {
                Vector3 vector = (this._edges[num2].Point1 = this._vertices[i]) - (this._edges[num2].Point0 = this._vertices[num2]);
                this._edges[num2].Length    = Vector3ex.Normalize(ref vector, 1E-05f);
                this._edges[num2].Direction = vector;
                this._edges[num2].Normal    = this._plane.Normal.Cross(vector);
                num2 = i;
            }
        }
        public static Rectangle3 CreateFromCWPoints(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
        {
            Vector3    vector  = p2 - p1;
            Vector3    vector2 = p1 - p0;
            Rectangle3 result;

            result.Center    = (p0 + p2) * 0.5f;
            result.Extents.x = Vector3ex.Normalize(ref vector, 1E-05f) * 0.5f;
            result.Extents.y = Vector3ex.Normalize(ref vector2, 1E-05f) * 0.5f;
            result.Axis0     = vector;
            result.Axis1     = vector2;
            result.Normal    = vector.Cross(vector2);
            return(result);
        }
Esempio n. 7
0
        public float AngleBetweenPlaneAndLine(Vector3 direction)
        {
            Vector3ex.Normalize(ref direction, 1E-05f);
            float num = this.Normal.Dot(direction);

            if (num > 1f)
            {
                num = 1f;
            }
            else if (num < -1f)
            {
                num = -1f;
            }
            return(1.57079637f - Mathf.Acos(num));
        }
Esempio n. 8
0
        public static float AngleRad(this Vector3 vector, Vector3 target)
        {
            Vector3ex.Normalize(ref vector, 1E-05f);
            Vector3ex.Normalize(ref target, 1E-05f);
            float num = vector.x * target.x + vector.y * target.y + vector.z * target.z;

            if (num > 1f)
            {
                num = 1f;
            }
            else if (num < -1f)
            {
                num = -1f;
            }
            return(Mathf.Acos(num));
        }
        public static void CalcBarycentricCoords(ref Vector3 point, ref Vector3 v0, ref Vector3 v1, ref Vector3 v2, out Vector3 baryCoords)
        {
            Vector3 vector  = v1 - v0;
            Vector3 vector2 = v2 - v0;
            Vector3 vector3 = point - v0;
            float   num     = Vector3ex.Dot(ref vector, ref vector);
            float   num2    = Vector3ex.Dot(ref vector, ref vector2);
            float   num3    = Vector3ex.Dot(ref vector2, ref vector2);
            float   num4    = Vector3ex.Dot(ref vector3, ref vector);
            float   num5    = Vector3ex.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;
        }
Esempio n. 10
0
        public static float SignedAngleRad(this Vector3 vector, Vector3 target, Vector3 normal)
        {
            Vector3ex.Normalize(ref vector, 1E-05f);
            Vector3ex.Normalize(ref target, 1E-05f);
            float num = vector.x * target.x + vector.y * target.y + vector.z * target.z;

            if (num > 1f)
            {
                num = 1f;
            }
            else if (num < -1f)
            {
                num = -1f;
            }
            float   num2  = Mathf.Acos(num);
            Vector3 value = vector.Cross(target);

            if (normal.Dot(value) < 0f)
            {
                num2 = -num2;
            }
            return(num2);
        }
        public static bool Create(IList <Vector3> vertices, float epsilon, out int dimension, out int[] indices)
        {
            Vector3ex.Information information = Vector3ex.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];
                Vector3 origin = information.Origin;
                Vector3 vector = information.Direction[0];
                for (int i = 0; i < count; i++)
                {
                    Vector3 value = vertices[i] - origin;
                    array2[i] = vector.Dot(value);
                }
                ConvexHull1.Create(array2, epsilon, out dimension, out indices);
                return(true);
            }
            if (information.Dimension == 2)
            {
                Vector2[] array3  = new Vector2[count];
                Vector3   origin2 = information.Origin;
                Vector3   vector2 = information.Direction[0];
                Vector3   vector3 = information.Direction[1];
                for (int j = 0; j < count; j++)
                {
                    Vector3 value2 = vertices[j] - origin2;
                    array3[j] = new Vector2(vector2.Dot(value2), vector3.Dot(value2));
                }
                return(ConvexHull2.Create(array3, epsilon, out dimension, out indices));
            }
            dimension = 3;
            Vector3[] array4 = new Vector3[count];
            Vector3   min    = information.Min;
            float     d      = 1f / information.MaxRange;

            for (int k = 0; k < count; k++)
            {
                array4[k] = (vertices[k] - min) * d;
            }
            Query3 query = new Query3(array4);
            int    v     = information.Extreme[0];
            int    num   = information.Extreme[1];
            int    num2  = information.Extreme[2];
            int    num3  = information.Extreme[3];

            ConvexHull3.Triangle triangle;
            ConvexHull3.Triangle triangle2;
            ConvexHull3.Triangle triangle3;
            ConvexHull3.Triangle triangle4;
            if (information.ExtremeCCW)
            {
                triangle  = new ConvexHull3.Triangle(v, num, num3);
                triangle2 = new ConvexHull3.Triangle(v, num2, num);
                triangle3 = new ConvexHull3.Triangle(v, num3, num2);
                triangle4 = new ConvexHull3.Triangle(num, num2, num3);
                triangle.AttachTo(triangle2, triangle4, triangle3);
                triangle2.AttachTo(triangle3, triangle4, triangle);
                triangle3.AttachTo(triangle, triangle4, triangle2);
                triangle4.AttachTo(triangle2, triangle3, triangle);
            }
            else
            {
                triangle  = new ConvexHull3.Triangle(v, num3, num);
                triangle2 = new ConvexHull3.Triangle(v, num, num2);
                triangle3 = new ConvexHull3.Triangle(v, num2, num3);
                triangle4 = new ConvexHull3.Triangle(num, num3, num2);
                triangle.AttachTo(triangle3, triangle4, triangle2);
                triangle2.AttachTo(triangle, triangle4, triangle3);
                triangle3.AttachTo(triangle2, triangle4, triangle);
                triangle4.AttachTo(triangle, triangle3, triangle2);
            }
            HashSet <ConvexHull3.Triangle> hashSet = new HashSet <ConvexHull3.Triangle>();

            hashSet.Add(triangle);
            hashSet.Add(triangle2);
            hashSet.Add(triangle3);
            hashSet.Add(triangle4);
            for (int l = 0; l < count; l++)
            {
                if (!ConvexHull3.Update(hashSet, l, query))
                {
                    dimension = -1;
                    indices   = null;
                    return(false);
                }
            }
            ConvexHull3.ExtractIndices(hashSet, out indices);
            return(true);
        }