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);
        }
Beispiel #2
0
        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);
        }