Example #1
0
        private static Model3D[] CreateIcons_Rotate(double arcRadius, double arcThickness, double arrowThickness, double sphereRadius)
        {
            const int NUMSIDES_TOTAL = 13;
            const int NUMSIDES_USE   = 9;

            #region create triangles

            Point[] pointsTheta = Math2D.GetCircle_Cached(NUMSIDES_TOTAL);

            var circlePoints = pointsTheta.
                               Select(o => GetCirclePoints(o, arcRadius, arcThickness, sphereRadius)).
                               ToArray();

            List <Triangle> triangles = new List <Triangle>();

            for (int cntr = 0; cntr < NUMSIDES_USE - 1; cntr++)
            {
                triangles.Add(new Triangle(circlePoints[cntr].inner, circlePoints[cntr].outer, circlePoints[cntr + 1].inner));
                triangles.Add(new Triangle(circlePoints[cntr].outer, circlePoints[cntr + 1].outer, circlePoints[cntr + 1].inner));
            }

            int i1 = NUMSIDES_USE - 1;
            int i2 = NUMSIDES_USE;

            var arrowBase = GetCirclePoints(pointsTheta[i1], arcRadius, arrowThickness, sphereRadius);
            var arrowTip  = GetCirclePoints(pointsTheta[i2], arcRadius, arcThickness * .75, sphereRadius);       //NOTE: Not using mid, because that curls the arrow too steeply (looks odd).  So using outer as a comprimise between pointing in and pointing straight

            triangles.Add(new Triangle(arrowBase.inner, circlePoints[i1].inner, arrowTip.outer));
            triangles.Add(new Triangle(circlePoints[i1].inner, circlePoints[i1].outer, arrowTip.outer));
            triangles.Add(new Triangle(circlePoints[i1].outer, arrowBase.outer, arrowTip.outer));

            // It would be more efficient to build the link triangles directly, but a lot more logic
            ITriangleIndexed[] indexedTriangles = TriangleIndexed.ConvertToIndexed(triangles.ToArray());

            #endregion

            List <Model3D> retVal = new List <Model3D>();

            MaterialGroup material = new MaterialGroup();
            material.Children.Add(new DiffuseMaterial(new SolidColorBrush(WorldColors.ImpulseEngine_Icon_Color)));
            material.Children.Add(WorldColors.ImpulseEngine_Icon_Specular);
            material.Children.Add(WorldColors.ImpulseEngine_Icon_Emissive);

            foreach (Transform3D transform in GetRotations_Tetrahedron(sphereRadius))
            {
                GeometryModel3D geometry = new GeometryModel3D();
                geometry.Material     = material;
                geometry.BackMaterial = material;
                geometry.Geometry     = UtilityWPF.GetMeshFromTriangles(indexedTriangles);
                geometry.Transform    = transform;

                retVal.Add(geometry);
            }

            return(retVal.ToArray());
        }
Example #2
0
        private static Model3D[] CreateIcons_Translate(double lineRadius, double lineThickness, double arrowThickness, double sphereRadius)
        {
            #region define points

            Vector[] cores1 = new[]
            {
                new Vector(1, 0),
                new Vector(0, 1),
                new Vector(-1, 0),
                new Vector(0, -1),
            };

            var cores2 = cores1.
                         Select(o =>
                                (
                                    o * lineThickness / 2,
                                    o * lineRadius * 2d / 3d,
                                    o * lineRadius
                                )).
                         ToArray();

            var lines = cores2.
                        Select(o => new
            {
                from = Math3D.ProjectPointOntoSphere(o.Item1.X, o.Item1.Y, sphereRadius),
                to   = Math3D.ProjectPointOntoSphere(o.Item2.X, o.Item2.Y, sphereRadius),
                tip  = Math3D.ProjectPointOntoSphere(o.Item3.X, o.Item3.Y, sphereRadius),
                bar  = GetLinePoints(o.Item1, o.Item2, lineThickness, arrowThickness, sphereRadius),
            }).
                        ToArray();

            Point3D origin = Math3D.ProjectPointOntoSphere(0, 0, sphereRadius);

            #endregion
            #region create triangles

            List <Triangle> triangles = new List <Triangle>();

            foreach (var line in lines)
            {
                triangles.Add(new Triangle(origin, line.bar.fromRight, line.bar.fromLeft));

                triangles.Add(new Triangle(line.bar.fromLeft, line.bar.fromRight, line.bar.toRight));
                triangles.Add(new Triangle(line.bar.toRight, line.bar.toLeft, line.bar.fromLeft));

                triangles.Add(new Triangle(line.bar.baseLeft, line.bar.toLeft, line.tip));
                triangles.Add(new Triangle(line.bar.toLeft, line.bar.toRight, line.tip));
                triangles.Add(new Triangle(line.bar.toRight, line.bar.baseRight, line.tip));
            }

            ITriangleIndexed[] indexedTriangles = TriangleIndexed.ConvertToIndexed(triangles.ToArray());

            #endregion

            List <Model3D> retVal = new List <Model3D>();

            MaterialGroup material = new MaterialGroup();
            material.Children.Add(new DiffuseMaterial(new SolidColorBrush(WorldColors.ImpulseEngine_Icon_Color)));
            material.Children.Add(WorldColors.ImpulseEngine_Icon_Specular);
            material.Children.Add(WorldColors.ImpulseEngine_Icon_Emissive);

            foreach (Transform3D transform in GetRotations_Tetrahedron(sphereRadius))
            {
                GeometryModel3D geometry = new GeometryModel3D();
                geometry.Material     = material;
                geometry.BackMaterial = material;
                geometry.Geometry     = UtilityWPF.GetMeshFromTriangles(indexedTriangles);
                geometry.Transform    = transform;

                retVal.Add(geometry);
            }

            return(retVal.ToArray());
        }