/// <summary> /// Truncate a vertex by building a pentagon /// </summary> /// <param name="p0"></param> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="p3"></param> /// <param name="p4"></param> /// <param name="p5"></param> private void BuildPentagon(Point3D p0, Point3D p1, Point3D p2, Point3D p3, Point3D p4, Point3D p5) { Vector3D v1 = Point3D.Subtract(p1, p0); Point3D p1a = Point3D.Add(p0, Vector3D.Multiply(v1, _truncRate)); Vector3D v2 = Point3D.Subtract(p2, p0); Point3D p2a = Point3D.Add(p0, Vector3D.Multiply(v2, _truncRate)); Vector3D v3 = Point3D.Subtract(p3, p0); Point3D p3a = Point3D.Add(p0, Vector3D.Multiply(v3, _truncRate)); Vector3D v4 = Point3D.Subtract(p4, p0); Point3D p4a = Point3D.Add(p0, Vector3D.Multiply(v4, _truncRate)); Vector3D v5 = Point3D.Subtract(p5, p0); Point3D p5a = Point3D.Add(p0, Vector3D.Multiply(v5, _truncRate)); this.Points.Add(p1a); this.Points.Add(p2a); this.Points.Add(p3a); this.Points.Add(p4a); this.Points.Add(p5a); PolygonSculptor pv = new PolygonSculptor(p1a, p2a, p3a, p4a, p5a); pv.BuildTriangles(); foreach (Point3DTriplet tpl in pv.Triangles) { this.Triangles.Add(tpl); } this._pentagonList.Add(pv); }
/// <summary> /// Initializes the Points and Triangles collections. /// Called By Sculptor.BuildMesh() /// </summary> protected override void CreateTriangles() { _ps1 = new PolygonSculptor(_circumferenceSideCount, _initialAngle); _ps1.RoundingRate = _roundingRate; _ps1.BuildTriangles(TriangleSideKind.Back); foreach (Point3DTriplet tpl in _ps1.Triangles) { this.Triangles.Add(tpl); } foreach (Point3D p in _ps1.Points) { this.Points.Add(p); } _ps2 = new PolygonSculptor(_circumferenceSideCount, _initialAngle); _ps2.RoundingRate = _roundingRate; _ps2.Center = new Point3D( _ps2.Center.X, _ps2.Center.Y, _ps2.Center.Z + 1.0); this.Points.Add(_ps2.Center); _ps2.BuildTriangles(TriangleSideKind.Front); foreach (Point3DTriplet tpl in _ps2.Triangles) { this.Triangles.Add(tpl); } }
/// <summary> /// Initializes the Points and Triangles collections. /// Called By Sculptor.BuildMesh() /// </summary> protected override void CreateTriangles() { IsocahedronSculptor sculptor = new IsocahedronSculptor(); sculptor.BuildMesh(); foreach (Point3DTriplet tpl in sculptor.Triangles) { Point3D p1 = tpl.Points[0]; Point3D p2 = tpl.Points[1]; Point3D p3 = tpl.Points[2]; // troncature des sommets du triangle => 1 hexagone (= 4 triangles) Vector3D v1 = Point3D.Subtract(p2, p1); Point3D pA = Point3D.Add(p1, Vector3D.Multiply(v1, _truncRate)); Point3D pB = Point3D.Add(p1, Vector3D.Multiply(v1, 1 - _truncRate)); Vector3D v2 = Point3D.Subtract(p3, p2); Point3D pC = Point3D.Add(p2, Vector3D.Multiply(v2, _truncRate)); Point3D pD = Point3D.Add(p2, Vector3D.Multiply(v2, 1 - _truncRate)); Vector3D v3 = Point3D.Subtract(p1, p3); Point3D pE = Point3D.Add(p3, Vector3D.Multiply(v3, _truncRate)); Point3D pF = Point3D.Add(p3, Vector3D.Multiply(v3, 1 - _truncRate)); this.Points.Add(pA); this.Points.Add(pB); this.Points.Add(pC); this.Points.Add(pD); this.Points.Add(pE); this.Points.Add(pF); PolygonSculptor hv = new PolygonSculptor(pA, pB, pC, pD, pE, pF); hv.BuildTriangles(); foreach (Point3DTriplet tpl2 in hv.Triangles) { this.Triangles.Add(tpl2); } _hexagonList.Add(hv); } BuildPentagon(sculptor.P1a, sculptor.P3a, sculptor.P2d, sculptor.P1d, sculptor.P2a, sculptor.P3d); BuildPentagon(sculptor.P1b, sculptor.P3a, sculptor.P3d, sculptor.P2b, sculptor.P1c, sculptor.P2c); BuildPentagon(sculptor.P1c, sculptor.P3b, sculptor.P2c, sculptor.P1b, sculptor.P2b, sculptor.P3c); BuildPentagon(sculptor.P1d, sculptor.P1a, sculptor.P2d, sculptor.P3b, sculptor.P3c, sculptor.P2a); BuildPentagon(sculptor.P2a, sculptor.P1a, sculptor.P1d, sculptor.P3c, sculptor.P2b, sculptor.P3d); BuildPentagon(sculptor.P2b, sculptor.P3d, sculptor.P2a, sculptor.P3c, sculptor.P1c, sculptor.P1b); BuildPentagon(sculptor.P2c, sculptor.P2d, sculptor.P3a, sculptor.P1b, sculptor.P1c, sculptor.P3b); BuildPentagon(sculptor.P2d, sculptor.P3a, sculptor.P2c, sculptor.P3b, sculptor.P1d, sculptor.P1a); BuildPentagon(sculptor.P3a, sculptor.P2c, sculptor.P2d, sculptor.P1a, sculptor.P3d, sculptor.P1b); BuildPentagon(sculptor.P3b, sculptor.P2d, sculptor.P2c, sculptor.P1c, sculptor.P3c, sculptor.P1d); BuildPentagon(sculptor.P3c, sculptor.P2b, sculptor.P2a, sculptor.P1d, sculptor.P3b, sculptor.P1c); BuildPentagon(sculptor.P3d, sculptor.P1a, sculptor.P2a, sculptor.P2b, sculptor.P1b, sculptor.P3a); }
/// <summary> /// Initializes the Points and Triangles collections. /// Called By Sculptor.BuildMesh() /// </summary> protected override void CreateTriangles() { Vector3D radiusVector = new Vector3D(_radius, 0, 0); PolygonSculptor pv1 = new PolygonSculptor(_circumferenceSideCount, _initialAngle); pv1.RoundingRate = _roundingRate; pv1.RoundCorner(); int circumferencePointCount = pv1.Points.Count; foreach (Point3D p in pv1.Points) { Point3D p1 = new Point3D(p.X, p.Y, p.Z) + radiusVector; this.Points.Add(p1); } double thetaStep = 2 * Math.PI / _segmentCount; double theta = 0.0; for (int i = 1; i <= _segmentCount; i++) { theta = (thetaStep * i); Vector3D thetaVector = new Vector3D( Math.Cos(theta), 0, Math.Sin(theta)); for (int i1 = 0; i1 < circumferencePointCount; i1++) { Point3D p2 = Helper3D.RotatePoint(Points[i1], theta, AxisDirection.Y); this.Points.Add(p2); } for (int j = 0; j < circumferencePointCount; j++) { int index1Min = (i - 1) * circumferencePointCount; int index1 = index1Min + j; int index2Min = i * circumferencePointCount; int index2 = index2Min + j; int indexLimit = index2Min + circumferencePointCount - 1; if (index2 < indexLimit) { this.Triangles.Add(new Point3DTriplet(Points[index2], Points[index2 + 1], Points[index1])); this.Triangles.Add(new Point3DTriplet(Points[index2 + 1], Points[index1 + 1], Points[index1])); } else { this.Triangles.Add(new Point3DTriplet(Points[index2], Points[index2Min], Points[index1])); this.Triangles.Add(new Point3DTriplet(Points[index2Min], Points[index1Min], Points[index1])); } } } }
/// <summary> /// Initializes the Points and Triangles collections. /// Called By Sculptor.BuildMesh() /// </summary> protected override void CreateTriangles() { PolygonSculptor ps1 = new PolygonSculptor(_circumferenceSideCount, _initialAngle); ps1.RoundingRate = _roundingRate; ps1.BuildTriangles(TriangleSideKind.Back); foreach (Point3D p in ps1.Points) { this.Points.Add(p); } foreach (Point3DTriplet tpl in ps1.Triangles) { this.Triangles.Add(tpl); } PolygonSculptor ps2 = new PolygonSculptor(_circumferenceSideCount, _initialAngle); ps2.Center = new Point3D( ps2.Center.X, ps2.Center.Y, ps2.Center.Z + 1.0); for (int i = 0; i < ps2.Points.Count; i++) { ps2.Points[i] = new Point3D( ps2.Points[i].X, ps2.Points[i].Y, ps2.Points[i].Z + 1.0); this.Points.Add(ps2.Points[i]); } ps2.RoundingRate = _roundingRate; ps2.BuildTriangles(TriangleSideKind.Front); foreach (Point3D p in ps2.Points) { this.Points.Add(p); } foreach (Point3DTriplet tpl in ps2.Triangles) { this.Triangles.Add(tpl); } for (int i = 0; i < ps1.Points.Count; i++) { if (i < ps1.Points.Count - 1) { this.Triangles.Add(new Point3DTriplet(ps1.Points[i], ps2.Points[i + 1], ps2.Points[i])); this.Triangles.Add(new Point3DTriplet(ps1.Points[i], ps1.Points[i + 1], ps2.Points[i + 1])); } else { this.Triangles.Add(new Point3DTriplet(ps1.Points[i], ps2.Points[0], ps2.Points[i])); this.Triangles.Add(new Point3DTriplet(ps1.Points[i], ps1.Points[0], ps2.Points[0])); } } }