Ejemplo n.º 1
0
 public static FacetVertex Transform(this FacetVertex facetVertex, Matrix matrix)
 {
     return(new FacetVertex(
                matrix * facetVertex.Position,
                matrix.Rotation * facetVertex.Normal
                ));
 }
        public static void InitializeGraphics()
        {
            Point unit = Point.Origin + Direction.DirZ.UnitVector;
            int   jMax = sphereFacets / 2 + 1;

            for (int i = 0; i < sphereFacets; i++)
            {
                for (int j = 0; j < jMax; j++)
                {
                    Point point =
                        Matrix.CreateRotation(Frame.World.AxisZ, (double)i / sphereFacets * tau) *
                        Matrix.CreateRotation(Frame.World.AxisY, (double)j / sphereFacets * tau) *
                        unit;

                    facetVertices[i * jMax + j] = new FacetVertex(point, point.Vector.Direction);
                }
            }

            for (int i = 0; i < sphereFacets; i++)
            {
                for (int j = 0; j < jMax - 1; j++)
                {
                    int ii = (i + 1) % sphereFacets;
                    int jj = j + 1;

                    facets.Add(new Facet(
                                   i * jMax + j,
                                   ii * jMax + j,
                                   ii * jMax + jj
                                   ));
                    facets.Add(new Facet(
                                   i * jMax + j,
                                   i * jMax + jj,
                                   ii * jMax + jj
                                   ));
                }
            }
        }
        public MeshPrimitive GetPrimitive()
        {
            int revolveSteps = 24;

            var profileFacetVertices = new List<FacetVertex>();
            Direction perpendicular = Direction.DirY;
            CurveSegment[] curveSegments = GetProfile().ToArray();
            foreach (CurveSegment curveSegement in curveSegments) {
                if (curveSegement.Geometry is Circle) {
                    int steps = (int)(curveSegement.Bounds.Span / Const.Tau * (revolveSteps + 1));
                    for (int i = 0; i < steps; i++) {
                        double t = curveSegement.Bounds.Start + curveSegement.Bounds.Span * i / steps;
                        var eval = curveSegement.Geometry.Evaluate(t);
                        profileFacetVertices.Add(new FacetVertex(
                            eval.Point,
                            -Direction.Cross(eval.Tangent, perpendicular)
                        ));
                    }
                    continue;
                }

                if (curveSegement.Geometry is Line) {
                    profileFacetVertices.Add(new FacetVertex(
                        curveSegement.StartPoint,
                        -Direction.Cross(((Line)curveSegement.Geometry).Direction, perpendicular)
                    ));
                    profileFacetVertices.Add(new FacetVertex(
                       curveSegement.EndPoint,
                       -Direction.Cross(((Line)curveSegement.Geometry).Direction, perpendicular)
                   ));
                    continue;
                }

                throw new NotImplementedException("Only lines and circles supported in tool profiles");
            }
            profileFacetVertices.Add(new FacetVertex(
                curveSegments.Last().EndPoint,
                Direction.DirZ
            ));

            int count = profileFacetVertices.Count;

            var facetVertices = new FacetVertex[revolveSteps * count];
            for (int i = 0; i < revolveSteps; i++) {
                for (int j = 0; j < count; j++)
                    facetVertices[i * count + j] = profileFacetVertices[j].Transform(Matrix.CreateRotation(Frame.World.AxisZ, (double)i / revolveSteps * Const.Tau));
            }

            var facets = new List<Facet>();
            for (int j = 0; j < count - 1; j++) {
                int jj = j + 1;
                if (facetVertices[j].Position == facetVertices[jj].Position)
                    continue;

                for (int i = 0; i < revolveSteps; i++) {
                    int ii = (i + 1) % revolveSteps;

                    facets.Add(new Facet(
                        i * count + j,
                        ii * count + j,
                        ii * count + jj
                    ));
                    facets.Add(new Facet(
                        i * count + j,
                        i * count + jj,
                        ii * count + jj
                    ));

                }
            }

            return MeshPrimitive.Create(facetVertices, facets);
        }
Ejemplo n.º 4
0
        public MeshPrimitive GetPrimitive()
        {
            int revolveSteps = 24;

            var       profileFacetVertices = new List <FacetVertex>();
            Direction perpendicular        = Direction.DirY;

            CurveSegment[] curveSegments = GetProfile().ToArray();
            foreach (CurveSegment curveSegement in curveSegments)
            {
                if (curveSegement.Geometry is Circle)
                {
                    int steps = (int)(curveSegement.Bounds.Span / Const.Tau * (revolveSteps + 1));
                    for (int i = 0; i < steps; i++)
                    {
                        double t    = curveSegement.Bounds.Start + curveSegement.Bounds.Span * i / steps;
                        var    eval = curveSegement.Geometry.Evaluate(t);
                        profileFacetVertices.Add(new FacetVertex(
                                                     eval.Point,
                                                     -Direction.Cross(eval.Tangent, perpendicular)
                                                     ));
                    }
                    continue;
                }

                if (curveSegement.Geometry is Line)
                {
                    profileFacetVertices.Add(new FacetVertex(
                                                 curveSegement.StartPoint,
                                                 -Direction.Cross(((Line)curveSegement.Geometry).Direction, perpendicular)
                                                 ));
                    profileFacetVertices.Add(new FacetVertex(
                                                 curveSegement.EndPoint,
                                                 -Direction.Cross(((Line)curveSegement.Geometry).Direction, perpendicular)
                                                 ));
                    continue;
                }

                throw new NotImplementedException("Only lines and circles supported in tool profiles");
            }
            profileFacetVertices.Add(new FacetVertex(
                                         curveSegments.Last().EndPoint,
                                         Direction.DirZ
                                         ));

            int count = profileFacetVertices.Count;

            var facetVertices = new FacetVertex[revolveSteps * count];

            for (int i = 0; i < revolveSteps; i++)
            {
                for (int j = 0; j < count; j++)
                {
                    facetVertices[i * count + j] = profileFacetVertices[j].Transform(Matrix.CreateRotation(Frame.World.AxisZ, (double)i / revolveSteps * Const.Tau));
                }
            }

            var facets = new List <Facet>();

            for (int j = 0; j < count - 1; j++)
            {
                int jj = j + 1;
                if (facetVertices[j].Position == facetVertices[jj].Position)
                {
                    continue;
                }

                for (int i = 0; i < revolveSteps; i++)
                {
                    int ii = (i + 1) % revolveSteps;

                    facets.Add(new Facet(
                                   i * count + j,
                                   ii * count + j,
                                   ii * count + jj
                                   ));
                    facets.Add(new Facet(
                                   i * count + j,
                                   i * count + jj,
                                   ii * count + jj
                                   ));
                }
            }

            return(MeshPrimitive.Create(facetVertices, facets));
        }