Given a figure in the plane bounded by the non-selfintersecting piecewise smooth curve. Each segment in the border defined by the list in the following format (variable names in expressions can be arbitrary):

1) If this segment is given by an explicit equation, then ** [f(x), x=x1..x2)]**

2) If it is given in polar coordinates, then **[f(phi), phi=phi1..phi2, polar] **, **phi** is polar angle

3) If the segment is given parametrically, then ** [[f(t), g(t)], t=t1..t2]**

4) If several consecutive segments or entire border is a broken line, then it is sufficient to set vertices the broken line **[ [x1,y1], [x2,y2], .., [xn,yn]]**

The first procedure symbolically finds perimeter of the figure. Global variable ** Q** saves the lengths of all segments.

**Perimeter := proc (L) **# ** L** is the list of all segments of the border

** local i, var, var1, var2, e, e1, e2, P; **

**global Q;**

** for i to nops(L) do if type(L[i], listlist(algebraic)) then P[i] := seq(simplify(sqrt((L[i, j, 1]-L[i, j+1, 1])^2+(L[i, j, 2]-L[i, j+1, 2])^2)), j = 1 .. nops(L[i])-1) else **

**var := lhs(L[i, 2]); var1 := min(lhs(rhs(L[i, 2])), rhs(rhs(L[i, 2]))); var2 := max(lhs(rhs(L[i, 2])), rhs(rhs(L[i, 2])));**

** if type(L[i, 1], algebraic) then e := L[i, 1]; if nops(L[i]) = 3 then P[i] := simplify(int(sqrt(e^2+(diff(e, var))^2), var = var1 .. var2)) else**

** P[i] := simplify(int(sqrt(1+(diff(e, var))^2), var = var1 .. var2)) end if else **

**e1 := L[i, 1, 1]; e2 := L[i, 1, 2]; P[i] := abs(simplify(int(sqrt((diff(e1, var))^2+(diff(e2, var))^2), var = var1 .. var2))) end if end if end do; **

**Q := [seq(P[i], i = 1 .. nops(L))]; **

**add(Q[i], i = 1 .. nops(Q));**

**end proc:**

The second procedure symbolically finds the area of the figure. For correct work of the procedure, all the segments in the list **L** of border must pass sequentially in clockwise or counter-clockwise direction.

**Area := proc (L)**

** local i, var, e, e1, e2, P;**

** for i to nops(L) do **

**if type(L[i], listlist(algebraic)) then P[i] := (1/2)*add(L[i, j, 1]*L[i, j+1, 2]-L[i, j, 2]*L[i, j+1, 1], j = 1 .. nops(L[i])-1) else **

**var := lhs(L[i, 2]);**

** if type(L[i, 1], algebraic) then e := L[i, 1];**

** if nops(L[i]) = 3 then P[i] := (1/2)*(int(e^2, L[i, 2])) else**

** P[i] := (1/2)*simplify(int(var*(diff(e, var))-e, L[i, 2])) end if else**

** e1 := L[i, 1, 1]; e2 := L[i, 1, 2]; P[i] := (1/2)*simplify(int(e1*(diff(e2, var))-e2*(diff(e1, var)), L[i, 2])) end if end if**

** end do; **

**abs(add(P[i], i = 1 .. nops(L)));**

** end proc:**

The third procedure shows this figure. To paint the interior of the boundary polyline approximation is used. Required parameters: **L** - a list of all segments of the border and **C** - the color of the interior of the figure in the format **color = color of the figure**. Optional parameters: **N** - the number of parts for the approximation of each segment (default N = 100) and **Boundary** is defined by a list for special design of the figure's border (the default border is drawed by a thin black line). The border of the figure can be drawn separately without filling the interior by the global variable **Border**.

**Picture := proc (L, C, N::posint := 100, Boundary::list := [linestyle = 1])**

** local i, var, var1, var2, e, e1, e2, P, Q, h; **

**global Border;**

** for i to nops(L) do **

**if type(L[i], listlist(algebraic)) then P[i] := op(L[i]) else **

**var := lhs(L[i, 2]); var1 := lhs(rhs(L[i, 2])); var2 := rhs(rhs(L[i, 2])); h := (var2-var1)/N;**

** if type(L[i, 1], algebraic) then e := L[i, 1];**

** if nops(L[i]) = 3 then P[i] := seq(subs(var = var1+h*i, [e*cos(var), e*sin(var)]), i = 0 .. N) else**

** P[i] := seq([var1+h*i, subs(var = var1+h*i, e)], i = 0 .. N) end if else **

**e1 := L[i, 1, 1]; e2 := L[i, 1, 2]; P[i] := seq(subs(var = var1+h*i, [e1, e2]), i = 0 .. N) end if end if **

**end do; **

**Q := [seq(P[i], i = 1 .. nops(L))];**

** Border := plottools[curve]([op(Q), Q[1]], op(Boundary)); **

**[plottools[polygon](Q, C), Border];**

**end proc:**

Examples of works:

Example 1.

**L := [[sqrt(-x), x = -1 .. 0], [2*cos(t), t = -(1/2)*Pi .. (1/4)*Pi, polar], [[1, 1], [1/2, 0], [0, 3/2]], [[-1+cos(t), 3/2+(1/2)*sin(t)], t = 0 .. -(1/2)*Pi]]; **

**Perimeter(L); Q; evalf(`%%`); evalf(`%%`); Area(L); **

**plots[display](Picture(L, color = grey, [color = "DarkGreen", thickness = 4]), scaling = constrained); **

**plots[display](Border, scaling = constrained);**

Example 2.

The easiest way to use this procedures for polygons.

** L := [[[3, -1], [-2, 2], [5, 6], [2, 3/2], [3, -1]]];**

** Perimeter(L), Q; **

**Area(L); **

**plots[display](Picture(L, color = pink, [color = red, thickness = 3]));**

** **

Example 3 (more complicated )

3 circles on the plane C1, C2 and C3 defined by the parametric equations of their borders. We want to find the perimeter, area, and paint the figure **C3 minus (C1 union C2) . **For details see attached file.

**C1 := {x = -sqrt(7)+4*cos(t), y = 4*sin(t)};**

** C2 := {x = 3*cos(s), y = 3+3*sin(s)}; **

**C3 := {x = 4+5*cos(u), y = 5*sin(u)};**

**L := [[[-sqrt(7)+4*cos(t), 4*sin(t)], t = -arccos((1/4)*(7+4*sqrt(7))/(sqrt(7)+4)) .. -arctan((3*(-23+sqrt(7)*sqrt(55)))/(23*sqrt(7)+9*sqrt(55)))], [[3*cos(s), 3+3*sin(s)], s = -arctan((1/3)*(9+sqrt(7)*sqrt(55))/(-sqrt(7)+sqrt(55))) .. arctan((1/3)*(-9+4*sqrt(91))/(4+sqrt(91)))], [[4+5*cos(u), 5*sin(u)], u = arctan((3*(41+4*sqrt(91)))/(-164+9*sqrt(91)))+Pi .. arctan(3/4)-Pi]];**

**Perimeter(L), Q; evalf(%);**

**Area(L); evalf(%)**

** A := plot([[rhs(C1[1]), rhs(C1[2]), t = 0 .. 2*Pi], [rhs(C2[1]), rhs(C2[2]), s = 0 .. 2*Pi], [rhs(C3[1]), rhs(C3[2]), u = 0 .. 2*Pi]], color = black);**

** B := Picture(L, color = green, [color = black, thickness = 4]); **

**plots[display](A, B, scaling = constrained);**

More examples and all codes see in attached file

**Plane_figure.mw**