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()); }
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()); }