Exemplo n.º 1
0
    public static MeshPrimitive GetCircularTabMesh(Point p0, Point p1, Direction normal, double angle, bool isMale)
    {
        Circle circle = GetCircularTabCircle(p0, p1, normal, angle, isMale);

        double centerParam = Math.PI / 2;

        if (!isMale)
        {
            angle       *= -1;
            centerParam += Math.PI;
        }

        ITrimmedCurve circleSegment = CurveSegment.Create(circle, Interval.Create(centerParam - angle / 2, centerParam + angle / 2));
        IList <Point> points        = circleSegment.GetPolyline();

        Debug.Assert(points.Count > 3, "Not enough points for tab faceting.");

        var facets = new List <Facet>();

        for (int i = 1; i < points.Count - 1; i++)
        {
            facets.Add(new Facet(0, i, i + 1));
        }

        return(MeshPrimitive.Create(points, normal, facets));
    }
Exemplo n.º 2
0
        public override void GenerateGeometry(string scenePath, List <PrimitiveBase> output)
        {
            var    fileInfo = new System.IO.FileInfo(scenePath);
            string p        = System.IO.Path.Combine(fileInfo.DirectoryName, Path);

            //List<Mesh> meshes = null;
            Mesh[] meshArray = null;
            if (meshes.ContainsKey(p))
            {
                meshArray = meshes[p];
            }
            else
            {
                meshArray = Mesh.CreateFromFile(p);
                if (meshArray != null)
                {
                    meshes[p] = meshArray;
                }
            }

            if (meshArray != null)
            {
                for (int i = 0; i < meshArray.Length; i++)
                {
                    MeshPrimitive meshprimitive = MeshPrimitive.Create();
                    meshprimitive.position = Position;
                    meshprimitive.euler    = Euler;
                    meshprimitive.scale    = Scale;
                    meshprimitive.mesh     = meshArray[i];
                    meshprimitive.material = shaders[0];

                    output.Add(meshprimitive);
                }
            }
        }
Exemplo n.º 3
0
        public static Graphic GetGraphic(double p, double q, double circleAngle, Vector inverseOffset)
        {
            var graphics = new List <Graphic>();

            int    bandCount = 2;
            int    iSteps = bandCount * 32; //32
            int    jSteps = 34;             //34
            double uStep = 2 * Math.PI / iSteps;
            double vStep = 2 * Math.PI / jSteps;
            bool   uSwap = false, vSwap = false;

            for (int j = 0; j < jSteps; j++)
            {
                double v = 2 * Math.PI * j / jSteps;

                for (int i = 0; i < iSteps; i++)
                {
                    double u = 2 * Math.PI * i / iSteps;

                    Direction n00, n10, n11, n01;
                    Point     p00 = Lawson.Evaluate(PointUV.Create(u, v), p, q, circleAngle, inverseOffset, true, out n00);
                    Point     p10 = Lawson.Evaluate(PointUV.Create(u + uStep, v), p, q, circleAngle, inverseOffset, true, out n10);
                    Point     p11 = Lawson.Evaluate(PointUV.Create(u + uStep, v + vStep), p, q, circleAngle, inverseOffset, true, out n11);
                    Point     p01 = Lawson.Evaluate(PointUV.Create(u, v + vStep), p, q, circleAngle, inverseOffset, true, out n01);

                    var facetVertices = new List <FacetVertex>();
                    facetVertices.Add(new FacetVertex(p00, n00));
                    facetVertices.Add(new FacetVertex(p10, n10));
                    facetVertices.Add(new FacetVertex(p11, n11));
                    facetVertices.Add(new FacetVertex(p01, n01));

                    var facets = new List <Facet>();
                    facets.Add(new Facet(0, 1, 2));
                    facets.Add(new Facet(0, 2, 3));

                    HSBColor hsbFill = new HSBColor(Window.ActiveWindow.ActiveLayer.GetColor(null));
                    hsbFill.H = (float)(u / 2 / Math.PI * 360);
                    hsbFill.A = vSwap ? 127 : 255;

                    HSBColor hsbLine = new HSBColor(System.Drawing.Color.MidnightBlue);
                    hsbLine.H = (float)(u / 2 / Math.PI * 360);

                    var style = new GraphicStyle {
                        EnableDepthBuffer = true,
                        LineColor         = hsbLine.Color,
                        LineWidth         = 1,
                        FillColor         = hsbFill.Color
                    };

                    graphics.Add(Graphic.Create(style, MeshPrimitive.Create(facetVertices, facets)));

                    uSwap = !uSwap;
                }
                vSwap = !vSwap;
            }

            return(Graphic.Create(null, null, graphics));
        }
Exemplo n.º 4
0
        public static Graphic GetGraphic()
        {
            var graphics = new List <Graphic>();

            int    iSteps = 64;          //32
            int    jSteps = 64;          //34
            double uStep = (double)1 / iSteps;
            double vStep = (double)2 * Math.PI / jSteps;
            bool   uSwap = false, vSwap = false;

            for (int i = 0; i < iSteps; i++)
            {
                double u = (double)i * uStep;

                for (int j = 0; j < jSteps; j++)
                {
                    double v = (double)j * vStep;

                    Direction n00, n10, n11, n01;
                    Point     p00 = BoySurface.Evaluate(Complex.CreatePolar(u, v), out n00);
                    Point     p10 = BoySurface.Evaluate(Complex.CreatePolar(u + uStep, v), out n10);
                    Point     p11 = BoySurface.Evaluate(Complex.CreatePolar(u + uStep, v + vStep), out n11);
                    Point     p01 = BoySurface.Evaluate(Complex.CreatePolar(u, v + vStep), out n01);

                    var facetVertices = new List <FacetVertex>();
                    facetVertices.Add(new FacetVertex(p00, n00));
                    facetVertices.Add(new FacetVertex(p10, n10));
                    facetVertices.Add(new FacetVertex(p11, n11));
                    facetVertices.Add(new FacetVertex(p01, n01));

                    var facets = new List <Facet>();
                    facets.Add(new Facet(0, 1, 2));
                    facets.Add(new Facet(0, 2, 3));

                    HSBColor hsbFill = new HSBColor(Window.ActiveWindow.ActiveLayer.GetColor(null));
                    hsbFill.H = (float)(u / 2 / Math.PI * 360);
                    hsbFill.A = vSwap ? 127 : 255;

                    HSBColor hsbLine = new HSBColor(System.Drawing.Color.MidnightBlue);
                    hsbLine.H = (float)(u / 2 / Math.PI * 360);

                    var style = new GraphicStyle {
                        EnableDepthBuffer = true,
                        LineColor         = hsbLine.Color,
                        LineWidth         = 1,
                        FillColor         = hsbFill.Color
                    };

                    graphics.Add(Graphic.Create(style, MeshPrimitive.Create(facetVertices, facets)));

                    vSwap = !vSwap;
                }
                uSwap = !uSwap;
            }

            return(Graphic.Create(null, null, graphics));
        }
        public static Graphic GetGraphics(Point[] positions, double radius)
        {
            var meshPrimitive = MeshPrimitive.Create(facetVertices, facets);

            var graphics = new Graphic[positions.Length];

            for (int i = 0; i < positions.Length; i++)
            {
                graphics[i] = Graphic.Create(null, new[] { meshPrimitive }, null,
                                             Matrix.CreateTranslation(positions[i].Vector) *
                                             Matrix.CreateScale(radius)
                                             );
            }

            return(Graphic.Create(null, null, graphics));
        }
Exemplo n.º 6
0
        public static ICollection <Primitive> GetMesh(this Body body, double surfaceDeviation, double angleDeviation)
        {
            IDictionary <Face, FaceTessellation> tessellationMap = body.GetTessellation(null, FacetSense.RightHanded, new TessellationOptions(surfaceDeviation, angleDeviation));

            var primitives = new List <Primitive>();

            foreach (FaceTessellation faceTessellation in tessellationMap.Values)
            {
                var facets = new List <Facet>();
                foreach (FacetStrip facetStrip in faceTessellation.FacetStrips)
                {
                    facets.AddRange(facetStrip.Facets);
                }

                primitives.Add(MeshPrimitive.Create(faceTessellation.Vertices, facets));
            }

            return(primitives);
        }
Exemplo n.º 7
0
        //private Point GetFivePointNurbsAverage(int[,] indices) {
        //    var knots = new Knot[] {
        //                new Knot(0, 4),
        //                new Knot(1, 4)
        //            };

        //    var controlPoints = new ControlPoint[] {
        //                new ControlPoint(Point.Create(tabAngles[indices[0,0]][indices[0,1]], GetSpanAt(indices[0,0], indices[0,1]),0), 1),
        //                new ControlPoint(Point.Create(tabAngles[indices[1,0]][indices[1,1]], GetSpanAt(indices[1,0], indices[1,1]),0), 1),
        //                new ControlPoint(Point.Create(tabAngles[indices[2,0]][indices[2,1]], GetSpanAt(indices[2,0], indices[2,1]),0), 1),
        //                new ControlPoint(Point.Create(tabAngles[indices[3,0]][indices[3,1]], GetSpanAt(indices[3,0], indices[3,1]),0), 1),
        //                new ControlPoint(Point.Create(tabAngles[indices[4,0]][indices[4,1]], GetSpanAt(indices[4,0], indices[4,1]),0), 1)
        //            };

        //    NurbsData data = new NurbsData(5, false, false, knots);
        //    NurbsCurve curve = NurbsCurve.CreateFromControlPoints(data, controlPoints);

        //    Point midpoint = curve.Evaluate(0.5).Point;
        //    return midpoint;
        //}

        //private Circle GetTabFromPoints(bool swap, int i, int j, int iOther) {
        //    Point p0 = points[i,j];
        //    Point p1 = points[i,j + 1];
        //    Point pn = (new Point[] { points[iOther,j], points[iOther,j + 1] }).Average();
        //    Direction normal = Vector.Cross(p0 - pn, p1 - pn).Direction;
        //    return Tabs.GetCircularTabCircle(p0, p1, normal, tabAngles[i,j], swap);
        //}

        //private double GetSpanAt(int i, int j) {
        //    return (vParameters[i][j + 1] - vParameters[i][j] + Math.PI * 2) % (Math.PI * 2);
        //}

        public Graphic GetGraphic()
        {
            var graphics = new List <Graphic>();

            int iSteps = points.GetLength(0);
            int jSteps = points.GetLength(1);

            bool swap = false;

            for (int i = 0; i < iSteps - 1; i++)
            {
                var facetVertices   = new List <FacetVertex>();
                var facets          = new List <Facet>();
                var tabMeshes       = new List <MeshPrimitive>();
                var porcupineCurves = new List <CurvePrimitive>();
                for (int j = 0; j < jSteps - 1; j++)
                {
                    int facetOffset = facetVertices.Count;
                    // Main ring
                    Point p00 = points[i, j];
                    Point p01 = points[i, j + 1];
                    Point p10 = points[i + 1, j];
                    Point p11 = points[i + 1, j + 1];

                    Vector    n0 = Vector.Cross(p00 - p01, p00 - p10);
                    Vector    n1 = Vector.Cross(p11 - p10, p11 - p01);
                    Direction n  = (n0 + n1).Direction;

                    facetVertices.Add(new FacetVertex(p00, n));
                    facetVertices.Add(new FacetVertex(p01, n));
                    facetVertices.Add(new FacetVertex(p10, n));
                    facetVertices.Add(new FacetVertex(p11, n));

                    if ((p00 - p11).Magnitude < (p10 - p01).Magnitude)
                    {
                        facets.Add(new Facet(0 + facetOffset, 1 + facetOffset, 3 + facetOffset));
                        facets.Add(new Facet(0 + facetOffset, 3 + facetOffset, 2 + facetOffset));
                    }
                    else
                    {
                        facets.Add(new Facet(0 + facetOffset, 2 + facetOffset, 1 + facetOffset));
                        facets.Add(new Facet(1 + facetOffset, 3 + facetOffset, 2 + facetOffset));
                    }

                    tabMeshes.Add(MeshPrimitive.Create(facetVertices, facets));

                    Point basePoint = points[i, j];
                    Point endPoint  = basePoint + Gradient(basePoint) / 10;
                    if (basePoint != endPoint)
                    {
                        porcupineCurves.Add(CurvePrimitive.Create(CurveSegment.Create(basePoint, endPoint)));
                    }

                    swap = !swap;
                }

                HSBColor hsbFill = new HSBColor(255, (float)i / iSteps * 360, 122, 88);
                HSBColor hsbLine = new HSBColor(System.Drawing.Color.MidnightBlue);
                hsbLine.H = (float)i / iSteps * 360;

                var style = new GraphicStyle {
                    EnableDepthBuffer = true,
                    LineColor         = hsbLine.Color,
                    LineWidth         = 1,
                    FillColor         = hsbFill.Color,

                    EnableCulling = false
                };

                //		graphics.Add(Graphic.Create(style, MeshPrimitive.Create(facetVertices, facets)));
                foreach (MeshPrimitive mesh in tabMeshes)
                {
                    graphics.Add(Graphic.Create(style, mesh));
                }

                foreach (CurvePrimitive curve in porcupineCurves)
                {
                    graphics.Add(Graphic.Create(style, curve));
                }
            }

            return(Graphic.Create(null, null, graphics));
        }
Exemplo n.º 8
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));
        }
Exemplo n.º 9
0
        public static ICollection <Primitive> CreateCylinderMesh(Point point1, Point point2, double diameter, int sides)
        {
            Vector heightVector = point2 - point1;

            Circle circle1 = Circle.Create(Frame.Create(point1, heightVector.Direction), diameter / 2);
            Circle circle2 = Circle.Create(Frame.Create(point2, heightVector.Direction), diameter / 2);

            var cylinderVertices = new List <FacetVertex>();
            var end1Vertices     = new List <FacetVertex>();
            var end2Vertices     = new List <FacetVertex>();

            var tempVertices = new List <Point>();  //TBD remove when we can do seletction on meshes

            double angle = 2 * Math.PI / (double)sides;

            for (int i = 0; i < sides; i++)
            {
                CurveEvaluation eval1 = circle1.Evaluate((double)i * angle);
                CurveEvaluation eval2 = circle2.Evaluate(((double)i + 0.5) * angle);

                cylinderVertices.Add(new FacetVertex(eval1.Point, (eval1.Point - circle1.Frame.Origin).Direction));
                cylinderVertices.Add(new FacetVertex(eval2.Point, (eval2.Point - circle2.Frame.Origin).Direction));

                end1Vertices.Add(new FacetVertex(eval1.Point, heightVector.Direction));
                end2Vertices.Add(new FacetVertex(eval2.Point, -heightVector.Direction));

                tempVertices.Add(eval1.Point);
                tempVertices.Add(eval2.Point);
            }

            var cylinderFacets = new List <Facet>();

            for (int i = 0; i < sides; i++)
            {
                int f00 = 2 * i;
                int f01 = f00 + 1;
                int f10 = f00 + 2 >= sides * 2 ? 0 : f00 + 2;
                int f11 = f10 + 1;

                cylinderFacets.Add(new Facet(f00, f10, f01));
                cylinderFacets.Add(new Facet(f10, f11, f01));
            }

            var end1Facets = new List <Facet>();
            var end2Facets = new List <Facet>();

            for (int i = 1; i < sides - 1; i++)
            {
                end1Facets.Add(new Facet(0, i + 1, i));
                end2Facets.Add(new Facet(0, i, i + 1));
            }

            var primitives = new List <Primitive>();

            primitives.Add(MeshPrimitive.Create(cylinderVertices, cylinderFacets));
            primitives.Add(MeshPrimitive.Create(end1Vertices, end1Facets));
            primitives.Add(MeshPrimitive.Create(end2Vertices, end2Facets));

            primitives.Add(PolylinePrimitive.Create(tempVertices)); //TBD remove

            return(primitives);
        }