示例#1
0
        static public List <Edge> GetAxis(Point3D center, Mode m, OrtMode om, int c)
        {
            List <Edge> res = new List <Edge>();
            Edge3D      x   = new Edge3D(center, new Point3D(center.X + 200, center.Y, center.Z));
            Edge3D      y   = new Edge3D(center, new Point3D(center.X, center.Y - 200, center.Z));
            Edge3D      z   = new Edge3D(center, new Point3D(center.X, center.Y, center.Z + 200));

            switch (m)
            {
            case Mode.Orthographic:
                res.Add(EdgeToProjection(x, Mode.Orthographic, om));
                res.Add(EdgeToProjection(y, Mode.Orthographic, om));
                res.Add(EdgeToProjection(z, Mode.Orthographic, om));
                break;

            case Mode.Isometric:
                res.Add(EdgeToProjection(x, Mode.Isometric));
                res.Add(EdgeToProjection(y, Mode.Isometric));
                res.Add(EdgeToProjection(z, Mode.Isometric));
                break;

            case Mode.Perspective:
                res.Add(EdgeToProjection(x, Mode.Perspective, OrtMode.XY, 1600));
                res.Add(EdgeToProjection(y, Mode.Perspective, OrtMode.XY, 1600));
                res.Add(EdgeToProjection(z, Mode.Perspective, OrtMode.XY, 1600));
                break;
            }
            return(res);
        }
示例#2
0
        private Edge ToIsometric(Edge3D e)
        {
            var new_start = VectorToPoint(MatrixMultiplication(PointToVector(e.start), isometric_matr));
            var new_end   = VectorToPoint(MatrixMultiplication(PointToVector(e.end), isometric_matr));

            return(new Edge(new_start, new_end));
        }
示例#3
0
        private Edge ToOrtographics(Edge3D e)
        {
            var new_start = VectorToPoint(MatrixMultiplication(PointToVector(e.start), ortographics_matr));
            var new_end   = VectorToPoint(MatrixMultiplication(PointToVector(e.end), ortographics_matr));

            return(new Edge(new_start, new_end));
        }
示例#4
0
        public void OctTreeEdge3DQueryTest()
        {
            var tree = new OctTreeEdge3D(2, 10);

            var e1 = new Edge3D(new Point3D(0, 1, 0), new Point3D(1, 0, 1));
            var e2 = new Edge3D(new Point3D(5, 5, 5), new Point3D(15, 15, 15));

            tree.AddItem(e1);

            var items = tree.GetItemsWithinRadius(e1, 5).ToList();

            Assert.AreEqual(1, items.Count);
            Assert.AreEqual(true, items.Contains(e1));

            tree.AddItem(e2);

            items = tree.GetItemsWithinRadius(e1, 5).ToList();
            Assert.AreEqual(2, items.Count);
            Assert.AreEqual(true, items.Contains(e1));
            Assert.AreEqual(true, items.Contains(e2));

            items = tree.GetItemsWithinRadius(e1, 0).ToList();
            Assert.AreEqual(1, items.Count);
            Assert.AreEqual(true, items.Contains(e1));
            Assert.AreEqual(false, items.Contains(e2));
        }
示例#5
0
        private Edge ToPerspective(Edge3D e)
        {
            var new_start = VectorToPoint(MatrixMultiplication(PointToVector(e.start), perspective_matr));
            var new_end   = VectorToPoint(MatrixMultiplication(PointToVector(e.end), perspective_matr));

            return(new Edge(new_start, new_end));
        }
        private long GetEdgeKey(Edge3D edge)
        {
            var leftTriangleFaceHash  = edge.ConnectedTriangles.First.Value.SourceFace.Id;
            var rightTriangleFaceHash = edge.ConnectedTriangles.Last.Value.SourceFace.Id;

            return(leftTriangleFaceHash > rightTriangleFaceHash
                ? ((long)leftTriangleFaceHash << 32) + rightTriangleFaceHash
                : ((long)rightTriangleFaceHash << 32) + leftTriangleFaceHash);
        }
示例#7
0
        private void OZ_Click(object sender, EventArgs e)
        {
            OX.Enabled     = true;
            OY.Enabled     = true;
            OZ.Enabled     = false;
            Custom.Enabled = true;
            Point3D center = cur_polyhedron.center();

            RAL = new Edge3D(new Point3D(center.X, center.Y, center.Z), new Point3D(0, 0, 1));
        }
        public void Edge3DCreationTest()
        {
            var source = new Point3D(0, 2, 0);
            var target = new Point3D(2, 0, 2);

            var edge = new Edge3D(source, target);

            Assert.AreEqual(source, edge.Source);
            Assert.AreEqual(new Point3D(1, 1, 1), edge.Midpoint);
            Assert.AreEqual(target, edge.Target);
        }
        public void Edge3DBoundaryTest()
        {
            var source = new Point3D(2, 2, 0);
            var target = new Point3D(-2, 0, 2);

            var edge     = new Edge3D(source, target);
            var boundary = edge.Boundary;

            Assert.AreEqual(new Point3D(-2, 0, 0), boundary.Min);
            Assert.AreEqual(new Point3D(2, 2, 2), boundary.Max);
        }
示例#10
0
        public static Point3D NormalizedVector(Edge3D line)
        {
            Point3D lvector = new Point3D(line.end.X - line.start.X, line.end.Y - line.start.Y, line.end.Z - line.start.Z);

            //нормализуем вектор, заданный линией
            double len = Math.Sqrt(lvector.X * lvector.X + lvector.Y * lvector.Y + lvector.Z * lvector.Z);
            double l   = (lvector.X / len);
            double m   = (lvector.Y / len);
            double n   = (lvector.Z / len);

            return(new Point3D((float)l, (float)m, (float)n));
        }
示例#11
0
        private void Rota_Click(object sender, EventArgs e)
        {
            cur_state = State.RotateAroundLine;
            rotateAroundLine.Enabled = false;
            OX.Enabled          = false;
            OY.Enabled          = true;
            OZ.Enabled          = true;
            Custom.Enabled      = true;
            button3.Enabled     = true;
            scaleButton.Enabled = true;
            Point3D center = cur_polyhedron.center();

            RAL = new Edge3D(new Point3D(center.X, center.Y, center.Z), new Point3D(1, 0, 0));
        }
示例#12
0
            private Vertex3D FindOrAddVertex(Edge3D e)
            {
                Vertex3D v;

                if (!centerVertex.TryGetValue(e, out v))
                {
                    v       = e.Center;
                    v.extID = vertex.Count;
                    MoveToSurface(v);
                    vertex.Add(v);
                    centerVertex.Add(e, v);
                }
                return(v);
            }
示例#13
0
            private Edge3D FindOrAddEdge(Vertex3D v1, Vertex3D v2)
            {
                Predicate <Edge3D> cond = (e) =>
                {
                    return(((e.V1 == v1) & (e.V2 == v2)) | ((e.V1 == v2) & (e.V2 == v1)));
                };
                Edge3D ed = edge.Find(cond);

                if (ed == null)
                {
                    ed = new Edge3D(v1, v2);
                    edge.Add(ed);
                }
                return(ed);
            }
示例#14
0
        public Edge Project(Mode m, Edge3D e)
        {
            switch (m)
            {
            case Mode.Orthographic:
                return(ToOrtographics(e));

            case Mode.Isometric:
                return(ToIsometric(e));

            case Mode.Perspective:
                return(ToPerspective(e));

            default:
                return(new Edge(new PointF(-1, -1), new PointF(-1, -1)));
            }
        }
示例#15
0
        private void Custom_Click(object sender, EventArgs e)
        {
            OX.Enabled     = true;
            OY.Enabled     = true;
            OZ.Enabled     = true;
            Custom.Enabled = false;
            float x1 = 0;
            float y1 = 0;
            float z1 = 0;
            float x2 = 0;
            float y2 = 0;
            float z2 = 0;

            if (float.TryParse(s_x.Text, out x1) && float.TryParse(s_y.Text, out y1) && float.TryParse(s_z.Text, out z1) && float.TryParse(e_x.Text, out x2) && float.TryParse(e_y.Text, out y2) && float.TryParse(e_z.Text, out z2))
            {
                RAL = new Edge3D(new Point3D(x1, y1, z1), NormalizedVector(new Edge3D(new Point3D(x1, y1, z1), new Point3D(x2, y2, z2))));
            }
        }
示例#16
0
        private Edge3D GetOrCreateEdgeBetween(Vertex3D v1, Vertex3D v2)
        {
            foreach (var face in v1.ConnectedTriangles)
            {
                for (var i = 0; i < 3; i++)
                {
                    if (v1 == face.Vertices[i] && v2 == face.Vertices[(i + 1) % 3] ||
                        v2 == face.Vertices[i] && v1 == face.Vertices[(i + 1) % 3])
                    {
                        return(face.Edges[i]);
                    }
                }
            }

            var newEdge = new Edge3D(v1, v2);

            Edges.Add(newEdge);
            return(newEdge);
        }
示例#17
0
        static public Edge EdgeToProjection(Edge3D e, Mode m, OrtMode om = OrtMode.XY, int c = 0)
        {
            double[,] matr = new double[4, 4];
            switch (m)
            {
            case Mode.Orthographic:
                matr = FormOrtoghraphicsMatr(om);
                break;

            case Mode.Isometric:
                matr = FormIsometricMatr();
                break;

            case Mode.Perspective:
                matr = FormPerspectiveMatr(c);
                break;
            }
            var new_start = VectorToPoint(MatrixMultiplication(PointToVector(e.start), matr));
            var new_end   = VectorToPoint(MatrixMultiplication(PointToVector(e.end), matr));

            return(new Edge(new_start, new_end));
        }
示例#18
0
 public EdgeNormal(Edge3D edge, Vector3d normal)
 {
     Edge   = edge;
     Normal = normal;
 }
示例#19
0
 public bool Equals(Edge3D other)
 {
     return(this == other);
 }
示例#20
0
文件: Euler.cs 项目: Mexahoid/CSF
 public void Parse(string Input)
 {
     double AllX = 0, AllY = 0, AllZ = 0;
       double X, Y, Z;
       string[] Arr = Input.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
       int Length = Arr.Length;
       string[] Row;
       for (int i = 0; i < Length; i++)
       {
     if (Arr[i] != "" && Arr[i][0] != '#')
       switch (Arr[i].Substring(0, 2))
       {
     case "v ":
       Row = Arr[i].Split(null as string[], StringSplitOptions.RemoveEmptyEntries);
       Array.Resize(ref Points, ++PLength);
       X = double.Parse(Row[1], System.Globalization.CultureInfo.InvariantCulture);
       Y = double.Parse(Row[2], System.Globalization.CultureInfo.InvariantCulture);
       Z = double.Parse(Row[3], System.Globalization.CultureInfo.InvariantCulture);
       AllX += X;
       AllY += Y;
       AllZ += Z;
       Points[PLength - 1] = new Math3D.Point3D(X, Y, Z);
       break;
     case "f ":
       Row = Arr[i].Split(' ');
       string[] Temp;
       int[] F = new int[3];
       for (int k = 1; k <= 3; k++)
       {
         Temp = Row[k].Split('/');
         F[k - 1] = int.Parse(Temp[0]);
       }
       Array.Resize(ref Polygons, ++RLength);
       Polygons[RLength - 1] = new Polygon3D(F[0], F[1], F[2]);
       Array.Resize(ref Edges, ELength + 3);
       ELength += 3;
       Edges[ELength - 3] = new Edge3D(F[0], F[1]);
       Edges[ELength - 2] = new Edge3D(F[1], F[2]);
       Edges[ELength - 1] = new Edge3D(F[2], F[0]);
       break;
       }
       }
       Origin = new Math3D.Point3D(AllX / PLength, AllY / PLength, AllZ / PLength);
 }