Hi,
this one works with polyline arc segments too
{code}public double PlineAlgebraicArea(Polyline pl)
{
Point2d p0 = pl.GetPoint2dAt(0);
double area = 0.0;
double bulge = pl.GetBulgeAt(0);
int last = pl.NumberOfVertices - 1;
double tmpArea;
if (bulge != 0.0)
{
CircularArc2d arc = pl.GetArcSegment2dAt(0);
double arcRadius = arc.Radius;
double arcAngle = 4.0 * Math.Atan(bulge);
area += ArcAlgebraicArea(arcRadius, arcAngle);
}
for (int i = 1; i < last; i++)
{
area += TriangleAlgebricArea(p0, pl.GetPoint2dAt(i), pl.GetPoint2dAt(i + 1));
bulge = pl.GetBulgeAt(i);
if (bulge != 0.0)
{
CircularArc2d arc = pl.GetArcSegment2dAt(i);
double arcRadius = arc.Radius;
double arcAngle = 4.0 * Math.Atan(bulge);
area += ArcAlgebraicArea(arcRadius, arcAngle);
}
}
bulge = pl.GetBulgeAt(last);
if (bulge != 0.0)
{
CircularArc2d arc = pl.GetArcSegment2dAt(last);
double arcRadius = arc.Radius;
double arcAngle = 4.0 * Math.Atan(bulge);
area += ArcAlgebraicArea(arcRadius, arcAngle);
}
return area;
}
public double TriangleAlgebraicArea(Point2d p0, Point2d p1, Point2d p2)
{
return (((p1.X - p0.X) * (p2.Y - p0.Y)) - ((p2.X - p0.X) * (p1.Y - p0.Y))) / 2.0;
}
public double ArcAlgebraicArea(double rad, double ang)
{
return rad * rad * (ang - Math.Sin(ang)) / 2.0;
}{code}