public List <Triangle> GetSurface(int numberOfFaces) { if (this.ellipse_0 == null | this.ellipse_1 == null) { throw new InvalidOperationException("Bottom or top ellipse is null!"); } if ((double)numberOfFaces / 2.0 != Math.Ceiling((double)numberOfFaces / 2.0)) { throw new ArgumentException("Number of faces on surface is odd. Must be even!"); } if (numberOfFaces < 6) { throw new ArgumentException("Number of faces on surface must be at least 12!"); } Ellipse ellipse = this.ellipse_0.DeepCopy(); Ellipse ellipse2 = this.ellipse_1.DeepCopy(); if (Vector3d.Dot(ellipse.NormalVector, ellipse2.NormalVector) < 0.0) { ellipse.SemiminorAxisVector = -1.0 * ellipse.SemiminorAxisVector; } Point pointAtParameter = ellipse2.GetPointAtParameter(0.0); Point endPoint = pointAtParameter.PerpendicularOnPerimeter(ellipse).EndPoint; int int_ = (int)((double)numberOfFaces / 2.0); if (this.bool_0) { int_ = (int)((double)numberOfFaces / 4.0) + 1; } PointSet pointSet = this.method_0(ellipse2, pointAtParameter, int_); PointSet pointSet2 = this.method_0(ellipse, endPoint, int_); List <Triangle> list = new List <Triangle>(); Triangle item; Triangle item2; for (int i = 0; i < pointSet.Count - 1; i++) { item = new Triangle(pointSet[i], pointSet2[i], pointSet[i + 1]); item2 = new Triangle(pointSet[i + 1], pointSet2[i], pointSet2[i + 1]); list.Add(item); list.Add(item2); } item = new Triangle(pointSet[pointSet.Count - 1], pointSet2[pointSet.Count - 1], pointSet2[0]); item2 = new Triangle(pointSet[pointSet.Count - 1], pointSet2[0], pointSet[0]); list.Add(item); list.Add(item2); if (this.bool_0) { for (int j = 0; j < pointSet.Count - 2; j++) { item = new Triangle(pointSet[0], pointSet[j + 1], pointSet[j + 2]); item2 = new Triangle(pointSet2[0], pointSet2[j + 1], pointSet2[j + 2]); list.Add(item); list.Add(item2); } } return(list); }
public Edge PerpendicularOnPerimeter(Ellipse ellipse) { Class12.point_0 = new Point(this.double_0, this.double_1, this.double_2); Class12.ellipse_0 = ellipse.DeepCopy(); LineSearch.ObjectiveFunction function = new LineSearch.ObjectiveFunction(Class12.smethod_0); double parameterAtPoint = ellipse.GetParameterAtPoint(Class12.point_0); double tetha; if (parameterAtPoint <= 3.1415926535897931) { tetha = LineSearch.GoldenSection(0.001 * Global.AbsoluteEpsilon, 0.0, 3.1415926535897931, function); } else { tetha = LineSearch.GoldenSection(0.001 * Global.AbsoluteEpsilon, 3.1415926535897931, 6.2831853071795862, function); } return(new Edge(this, ellipse.GetPointAtParameter(tetha))); }
private PointSet method_0(Ellipse ellipse_2, Point point_0, int int_0) { PointSet pointSet = new PointSet(); double parameterAtPoint = ellipse_2.GetParameterAtPoint(point_0); double num = 6.2831853071795862 / (double)int_0; for (int i = 0; i < int_0; i++) { double num2 = parameterAtPoint + (double)i * num; if (num2 > 6.2831853071795862) { num2 -= 6.2831853071795862; } Point pointAtParameter = ellipse_2.GetPointAtParameter(num2); pointSet.Add(pointAtParameter); } return(pointSet); }