/***************************************************/ 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?? } }
/***************************************************/ private static Polyline Divide(this Arc arc, double angleTolerance, double baseTolerance, int maxDivisionsPerSegment = 200) { return(arc.CollapseToPolyline(Soften(arc.Radius, angleTolerance, baseTolerance), maxDivisionsPerSegment)); }