Пример #1
0
        /***************************************************/

        private static double IntegrateRegion(Arc arc, int powX, double tol = Tolerance.Distance)
        {
            Point  centre = arc.CoordinateSystem.Origin;
            double r      = arc.Radius;
            Point  start  = arc.StartPoint();
            Point  end    = arc.EndPoint();

            double a = Vector.XAxis.Angle(start - centre, Plane.XY);

            double k = Math.Abs(arc.Angle());

            if ((start - centre).CrossProduct(arc.StartDir()).Z < 0)
            {
                k *= -1;
            }

            switch (powX)
            {
            case 0:
                return(
                    centre.X * r * (-Math.Sin(a) + Math.Sin(a + k)) +
                    (r * r * (2 * k - Math.Sin(2 * a) + Math.Sin(2 * (a + k)))
                    ) / 4);

            /********************/
            case 1:
                return((r * (
                            (Math.Sin(3 * (k + a)) + 9 * Math.Sin(k + a) -
                             Math.Sin(3 * a) - 9 * Math.Sin(a)) * r * r +
                            6 * (Math.Sin(2 * (k + a)) + 2 * k - Math.Sin(2 * a)) * centre.X * r +
                            12 * (Math.Sin(k + a) - Math.Sin(a)) * centre.X * centre.X
                            )) / 24);

            /********************/
            case 2:
                return((r * (
                            (Math.Sin(4 * (k + a)) + 8 * Math.Sin(2 * (k + a)) + 12 * k - Math.Sin(4 * a) -
                             8 * Math.Sin(2 * a)) * r * r * r -
                            32 * (Math.Sin(k + a) * (Math.Sin(k + a) * Math.Sin(k + a) - 3) +
                                  (Math.Cos(a) * Math.Cos(a) + 2) * Math.Sin(a)) * centre.X * r * r +
                            24 * (Math.Sin(2 * (k + a)) + 2 * k - Math.Sin(2 * a)) * centre.X * centre.X * r +
                            32 * (Math.Sin(k + a) - Math.Sin(a)) * centre.X * centre.X * centre.X
                            )) / 96);

            /********************/
            default:
                return(IntegrateRegion(arc.CollapseToPolyline(0.01), powX, tol));    //TODO is this good value??
            }
        }
Пример #2
0
        /***************************************************/

        private static Polyline Divide(this Arc arc, double angleTolerance, double baseTolerance, int maxDivisionsPerSegment = 200)
        {
            return(arc.CollapseToPolyline(Soften(arc.Radius, angleTolerance, baseTolerance), maxDivisionsPerSegment));
        }