public bool InPlanePolygon(MyVector3 p)//the sum of inner angle is 360
        {
            //this.ProjectVerticesTo2d();
            if (this.planeVertices.Count == 0)
            {
                return(false);
            }

            double    theta = 0;
            MyVector3 v1    = p - planeVertices[0];
            MyVector3 v2    = p - planeVertices[planeVertices.Count - 1];

            theta = Math.Acos(v1.Dot(v2) / (v1.Length() * v2.Length()));
            for (int i = 0; i < planeVertices.Count - 1; i++)
            {
                v1     = p - planeVertices[i];
                v2     = p - planeVertices[i + 1];
                theta += Math.Acos(v1.Dot(v2) / (v1.Length() * v2.Length()));
            }

            if (Math.Abs(2 * Math.PI - theta) < 1e-10)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        public Quaternion Inverse()
        {
            double b = s * s + v.Dot(v);

            if (b != 0)
            {
                return(new Quaternion(s / b, -v.x / b, -v.y / b, -v.z / b));
            }
            throw new DivideByZeroException();
        }
        public MyVector3 RayIntersection(MyVector3 v1, MyVector3 dir)
        {
            if (Math.Abs(dir.Dot(this.Normal())) < 1e-7)
            {
                return(new MyVector3());
            }

            double a = dir.x;
            double b = dir.y;
            double c = dir.z;

            double A = this.planeEquation.A;
            double B = this.planeEquation.B;
            double C = this.planeEquation.C;
            double D = this.planeEquation.Offset;

            double t = (-D - A * v1.x - B * v1.y - C * v1.z) / (A * a + B * b + C * c);

            MyVector3 result = new MyVector3();

            result.x = a * t + v1.x;
            result.y = b * t + v1.y;
            result.z = c * t + v1.z;

            return(result);
        }
        public MyPlane(MyVector3 v1, MyVector3 v2, MyVector3 v3)
        {
            planeVertices.Add(v1);
            planeVertices.Add(v2);
            planeVertices.Add(v3);

            planePoints.Add(v1);
            planePoints.Add(v2);
            planePoints.Add(v3);

            MyVector3 planenormal = (v1 - v2).Cross(v1 - v3);

            planenormal.Normalize();
            double offset = -v1.Dot(planenormal);

            planeEquation = new Plane((float)planenormal.x, (float)planenormal.y, (float)planenormal.z, (float)offset);

            planeCenter = (v1 + v2 + v3) / 3;
            planeColor  = Color.FromArgb(150, 255, 255, 0);

            // Accord.Math.Point3 _v1 = new Point3((float)v1.x, (float)v1.y, (float)v1.z);
            // Accord.Math.Point3 _v2 = new Point3((float)v2.x, (float)v2.y, (float)v2.z);
            //  Accord.Math.Point3 _v3 = new Point3((float)v3.x, (float)v3.y, (float)v3.z);
            // planeEquation = Plane.FromPoints(_v1, _v2, _v3);

            //ComputePlaneArea();
            ComputeBoundQuad();
        }
 public static bool IsParallel(MyVector3 _v1, MyVector3 _v2, double angle = 1)
 {
     if ((_v1.Dot(_v2) / (_v1.Length() * _v2.Length())) >= Math.Cos(angle * Math.PI / 180))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
        public static bool IsParallel(MyPlane p1, MyPlane p2, double angle = 5)
        {
            MyVector3 _v1 = p1.Normal();
            MyVector3 _v2 = p2.Normal();

            if (Math.Abs(_v1.Dot(_v2) / (_v1.Length() * _v2.Length())) >= Math.Cos(angle * Math.PI / 180))
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        public void ComputeBoundQuad()
        {
            MyVector3 normal  = Normal();
            MyVector3 xaxis   = new MyVector3(1, 0, 0);
            MyVector3 yaxis   = new MyVector3(0, 1, 0);
            MyVector3 zaxis   = new MyVector3(0, 0, 1);
            MyVector3 rotAxis = zaxis.Cross(normal).Normalize();

            double cos = zaxis.Dot(normal);

            if (cos > 1)
            {
                cos = 1;
            }
            if (cos < -1)
            {
                cos = -1;
            }
            double          rotAngle  = Math.Acos(cos);
            MyMatrix4d      R         = MyMatrix4d.RotationMatrix(rotAxis, rotAngle);
            MyVector3       new_xaxis = (R * new MyVector4(xaxis)).XYZ().Normalize();
            MyVector3       new_yaxis = (R * new MyVector4(yaxis)).XYZ().Normalize();
            CoordinateFrame frame     = new CoordinateFrame(this.planeCenter, new_xaxis, new_yaxis, normal);

            double xmin = double.MaxValue; double ymin = double.MaxValue;
            double xmax = double.MinValue; double ymax = double.MinValue;

            foreach (MyVector3 v in this.planeVertices)
            {
                MyVector3 u = frame.GetPointLocalCoord(v);
                xmin = Math.Min(u.x, xmin);
                xmax = Math.Max(u.x, xmax);
                ymin = Math.Min(u.y, ymin);
                ymax = Math.Max(u.y, ymax);
            }

            MyVector3 v1 = new MyVector3(xmin, ymin, 0);
            MyVector3 v2 = new MyVector3(xmax, ymin, 0);
            MyVector3 v3 = new MyVector3(xmax, ymax, 0);
            MyVector3 v4 = new MyVector3(xmin, ymax, 0);

            SmartCanvas.Point3[] pts3 =
                new SmartCanvas.Point3[4] {
                new SmartCanvas.Point3(frame.GetPointSpaceCoord(v1)),
                new SmartCanvas.Point3(frame.GetPointSpaceCoord(v2)),
                new SmartCanvas.Point3(frame.GetPointSpaceCoord(v3)),
                new SmartCanvas.Point3(frame.GetPointSpaceCoord(v4))
            };
            this.boundQuad = new Quad3D(pts3);
        }
        public void Project3dToBelongPlane()
        {
            // prepare 2d coordinate
            MyVector3 circle_norm = this.belongPlane.Normal();
            MyVector3 X           = new MyVector3(1, 0, 0);
            MyVector3 Y           = new MyVector3(0, 1, 0);
            MyVector3 Z           = new MyVector3(0, 0, 1);
            MyVector3 rotAxis     = Z.Cross(circle_norm).Normalize();
            double    angle_cos   = Z.Dot(circle_norm);

            if (angle_cos > 1)
            {
                angle_cos = 1;
            }
            if (angle_cos < -1)
            {
                angle_cos = -1;
            }
            double rotAngle = Math.Acos(angle_cos);

            MyMatrix4d      Mat   = MyMatrix4d.RotationMatrix(rotAxis, rotAngle);
            MyVector3       X_new = (Mat * new MyVector4(X)).XYZ().Normalize();
            MyVector3       Y_new = (Mat * new MyVector4(Y)).XYZ().Normalize();
            CoordinateFrame frame = new CoordinateFrame(this.belongPlane.planeCenter, X_new, Y_new, circle_norm);

            // projection and denoise(leave out far away points)
            MyVector3 tmpc = frame.GetPointLocalCoord(this.center);

            this.center2d = new MyVector2(tmpc.x, tmpc.y);
            for (int i = 0; i < this.circleSlice3d.Count; i++)
            {
                MyVector3 vert = this.circleSlice3d[i];
                MyVector3 tmp  = frame.GetPointLocalCoord(vert);
                MyVector2 tmp2 = new MyVector2(tmp.x, tmp.y);
                double    dist = Math.Abs((tmp2 - this.center2d).Length() - this.radius);
                if (dist > 0.5 * this.radius && dist < 0.75 * this.radius)
                {
                    this.circleSlice3d.RemoveAt(i);
                    i--;
                }
                else
                {
                    this.circleSlice2d.Add(tmp2);
                }
            }
        }
        public MyPlane(MyVector3 point, MyVector3 normal)
        {
            double d = -point.Dot(normal);

            planeEquation = new Plane((float)normal.x, (float)normal.y, (float)normal.z, (float)d);
            planeCenter   = point;
            planeColor    = Color.FromArgb(150, 255, 255, 0);

            // add three plane points
            MyVector3 x = new MyVector3(normal.y, -normal.x, 0);

            if (x.x == 0 && x.y == 0)
            {
                x = new MyVector3(1, 0, 0);
            }
            MyVector3       y     = normal.Cross(x).Normalize();
            CoordinateFrame frame = new CoordinateFrame(point, x, y, normal);
            double          s     = 0.8;
            MyVector3       v1    = frame.GetPointLocalCoord(new MyVector3(s, s, 0));
            MyVector3       v2    = frame.GetPointLocalCoord(new MyVector3(-s, s, 0));
            MyVector3       v3    = frame.GetPointLocalCoord(new MyVector3(-s, -s, 0));
            MyVector3       v4    = frame.GetPointLocalCoord(new MyVector3(s, -s, 0));

            planeVertices.Add(v1);
            planeVertices.Add(v2);
            planeVertices.Add(v3);
            planeVertices.Add(v4);

            planePoints.Add(v1);
            planePoints.Add(v2);
            planePoints.Add(v3);
            planePoints.Add(v4);

            this.ComputeVertices();
            this.ComputeBoundQuad();
            this.ComputeCenter();
        }
Esempio n. 10
0
        public void BuildLocalFrame()
        {
            MyVector3 X         = new MyVector3(1, 0, 0);
            MyVector3 Y         = new MyVector3(0, 1, 0);
            MyVector3 Z         = new MyVector3(0, 0, 1);
            MyVector3 rotAxis   = Z.Cross(normal).Normalize();
            double    angle_cos = Z.Dot(normal);

            if (angle_cos < -1)
            {
                angle_cos = -1;
            }
            if (angle_cos > 1)
            {
                angle_cos = 1;
            }
            double rotAngle = Math.Acos(angle_cos);

            MyMatrix4d Mat   = MyMatrix4d.RotationMatrix(rotAxis, rotAngle);
            MyVector3  X_new = (Mat * new MyVector4(X)).XYZ().Normalize();
            MyVector3  Y_new = (Mat * new MyVector4(Y)).XYZ().Normalize();

            frame = new CoordinateFrame(center, X_new, Y_new, normal);
        }
 public MyVector3 Rotate(MyVector3 axis, double cos, double sin)
 {
     return(this * cos + (axis.Cross(this)) * sin +
            axis * ((1.0 - cos) * (axis.Dot(this))));
 }