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