We want to find the volume and the surface area of a cone cut by a plane in the particular case when the plane doesn't intersect the base of the cone. First we will find explicit formulas and then write a program calculating volume and area of convex polyhedrons in order to check our results.

We will consider a cone with circle as its base and such that the projection of the cone's apex onto the base is the center of the circle. The shape of the cut will be an ellipse. We can assume that the base is oriented horizontally. Then, if the section plane is not horizontal, the ellipse will 
have one highest and one lowest point. If we cut this truncated cone again by the horizontal plane containing the lowest point, the lower part will be a frustum (a truncated cone with circles as bases). The formulas for it are well-known and so we only need to deal with the upper part of the body. In other words, we can assume that the section plane has one common point with the base of the original cone.

Let's choose the coordinate system so that the cone's base lies on the xy plane and its apex lies on positive z semiaxis. Then for any point (x, y, z) of the lateral surface of the cone z = H - (H/R) (Sqrt[(x^2) + (y^2)]), (x^2) + (y^2) ≤ (R^2) (where R is the radius of the base and H is the height). Also, the coordinate system can be rotated so that the 
point common to the base and the section plane will lie on the positive x semiaxis. Then the section plane will contain the tangent to the base at 
this point, which is parallel to y axis, and thus the plane will be parallel to y axis too. The equation of the plane will be x + z ctg(α) = R, where α is the smaller angle it forms with the xy plane.

Again, it will be more convenient for us to consider the upper part of the  truncated cone (one can get the lower part as the complement to full cone).  Let F be the lateral surface of the resulting truncated cone and ellipse D the base. The equation for F will obviously remain the same equation of the cone, only the domain D' over which x and y change will be different. D' is the vertical projection of D onto the horizontal plane. It is an ellipse too (lying inside the circle  of radius R), and if (x, y) ∈ D', (x, y, z) belongs to F (that's why we chose the upper part).

To define D it is enough to find only the coordinates of the ends of its axes. Their 
projections will give us the axes of D'. We can find the large axis noticing that by simmetry it lies on the 
plane y = 0.

\(Solve[


      	{\(\((H - z)\)\^2\) R\^2 == \(H\^2\) \((x\^2 + y\^2)\), 
		

        x + Cot[α]\ z == R, 
		y == 0}, 
	{x, y, z}]\)

{pt1, pt2} = {x, y, z} /. %;

This is the large axis

a0 = (1/2) (Sqrt[#.#])&[pt1 - pt2];

And the center of D

cent = ((pt1 + pt2)/2);

We get the small axis using the fact that it is perpendicular to the y plane and therefore horizontal (and obviously contains the center).

\(\(Solve[


      	{\(\((H - z)\)\^2\) R\^2 == \(H\^2\) \((x\^2 + y\^2)\), 
		

        x + Cot[α]\ z == R, 
		z == cent[\([3]\)]}, 
	{x, y, z}]; 

    \)\)

{pt1, pt2} = {x, y, z} /. %;

b0 = (1/2) (Sqrt[#.#])&[pt1 - pt2];

And it is easy to find the axes of D'

\(a = a0\ Cos[α]; 
b = b0; \)

Now we will use the formula for the area of a surface in space: if z = z(x, y), (x, y) ∈ D' then

                                                                               S = ∫∫(Sqrt[1 + 
                        (((∂(z/∂)x))^2) + 
                        (((∂(z/∂)y))^2)]) 
                  dx dy          D'

To parametrize the figure D' we change to generalized polar coordinates x = a ρ cos(ϕ) + (Subscript[x, 0]), 
      y = b ρ sin(ϕ) + (Subscript[y, 0]). The jacobian \(TraditionalForm
      \`J = \(∂\((x, y)\)\/∂\((ρ, ϕ)\) = 
          a\ b\ ρ\)\), and finally our problem is reduced to finding the value of the multiple  integral                                                                  

                                                                     \(TraditionalForm
      \`S = ∫\+0\%\(2  π\)\ \ 
          \(∫\+0\%1\ \ 
            \(\@\(1 + \((∂z\/∂x)\)\^2 + 
                    \((∂z\/∂y)\)\^2\)\) \(abs(J)\) 
              dρ dϕ\)\)

\(Block[
	{z = H - \(H\/R\) \@\(x\^2 + y\^2\)}, 


      \@\(1 + \((∂\_x z)\)\^2 + \((∂\_y z)\)\^2\) // 

        Simplify]\)

We see that the function is constant and since the jacobian depends only 
on a and b we don't need to find (Subscript[x, 0]) and (Subscript[y, 0]) (in our case (Subscript[x, 0]) ≠ 0, (Subscript[y, 0]) = 0).

S = 

      (∫_0

            ^(2  π))(∫_0^1) % a b ρ 

              \[DifferentialD]ρ \[DifferentialD]ϕ // Simplify

The formulas can be simplified considerably if we choose as the parameter 
not the angle α but the minimal height h of F (i.e. height of the full cone minus height of the highest point of D). We found above that the bottom point of D is {R, 0, 0} (that's how the coordinate system was chosen) and the top point has 
coordinates {(Subscript[x, top]), 0, (Subscript[z, top])}. Then \(TraditionalForm

      \`h = \(H - z\_top = 

          H - \(2  R\ H\)\/\(R + H\ \(ctg(α)\)\)\)\) (see above).

Together//@

      (S /. α -> ArcCot[((R (H + h))/(H (H - h)))])

The expressions R, H, H + h are non-negative and we can use PowerExpand

S = PowerExpand[%]

To find the volume, we cut F by planes parallel to D. We choose the parameter ξ as the distance from D to the plane. ξ changes from 0, where the plane contains D, to H cos(α) - R sin(α), where it contains the apex of the cone. The shape of each cut is an 
ellipse and again we need to find axes. One way to do it is to write equation 
for each plane (which will be \(TraditionalForm

      \`x + z\ \(ctg(α)\) = R + ξ\ \(csc(α)\)\)) in order to find the axes of ellipse for each ξ in the same way as above. But it can be easily shown geometrically (from 
the similarity of triangles) that the lengths of the axes depend on ξ linearly.

Note that we just keep the same symbols a, b for axes but now they don't refer to D'.

\(ξ0 = H\ Cos[α] - R\ Sin[α]; 

    
{a, b} = \(\(ξ0 - ξ\)\/ξ0\) {a0, b0}; \)

Finally, the area of each ellipse is S(ξ) = π a(ξ) b(ξ), an if we know the areas S(ξ) of cross-sections of a figure by planes normal to the axis ξ we can find the volume of the figure as \(TraditionalForm

      \`V = ∫\_ξ\_1\%ξ\_2\( S(ξ)\) 

            dξ\).

V = 

      (∫_0^ξ)0 π a b \[DifferentialD]ξ // Simplify

Together//@

      (V /. α -> ArcCot[((R (H + h))/(H (H - h)))])

V = PowerExpand[%]

And now we have the volume of the truncated cone too. We can easily check 
that the results are correct for boundary values of h

{S, V} /. {{h -> 0}, {h -> H}}

Alternative ways to calculate the volume would be to take sections by 
horizontal planes and calculate the areas of the resulting circular segments, 
or to use the formula \(TraditionalForm

      \`V = ∫\(∫\((\(z\_1\)(x, y) - \(z\_2\)(x, y))\) 

              dx dy\)\)        D', where (Subscript[z, 1]) corresponds to the cone and (Subscript[z, 2]) to the section plane. But in those cases the expressions to integrate 
would be more complicated.

Our formulas can be rewritten like this
                                                                                             S = (Subscript[S, 0]) (1/2) ((((h/H)))^(1/2)) (1 + (h/H))
                                                                                      
                                                                                                       V = (((Subscript[V, 0])((h/H)))^(3/2))
where (Subscript[S, 0]), (Subscript[V, 0]) correspond to the full cone.

Now we want to check our results numerically. We'll need program for creating the sections (the module is in the development stage right now).

Type the correct path to section.m  here

\(<< \math\section.m\)

Let's create a cone with base radius 3 and height 4

<< graphics`shapes`

gr = Level[Cone[3, 2, 200], {2}];

Add the base polygon

\(\(base = 

      Union[Cases[gr, {_, _, \(-2.\)}, {2}]\ ] // 
		

        Sort[#, ArcTan\ @@\ Take[#1, 2] < ArcTan\ @@\ Take[#2, 2]&]&; \)\)

AppendTo[gr, base];

And cut it by the plane 4  x + 5  z - 2 = 0. We get \(TraditionalForm

      \`h = \(H - \(2  R\ H\)\/\(R + H\ \(ctg(α)\)\) = 1\)\)

gr2 = cut[gr, -4 #1 - 5  #3 + 2&];

This is what the figure looks like

\(Show[Graphics3D[Polygon\ /@\ gr2], 
	

      ViewPoint -> {\(-2.4\), \(-2.4\), 1.0}]\)

Now we define the function for calculating surface area and volume of 
closed convex polyhedral bodies. The main idea is to take a point inside the 
body as a center and then break the body into pyramids with this point as the 
apex and each face of the figure as base. Next, each pyramid is rotated so 
that its base becomes oriented horizontally. Then we use the formula for the 
(oriented) area of a polygon on a plane
                                     
                                       \(TraditionalForm

      \`S = \(1\/2\) 

          \(∑\+\(k = 1\)\%n\((

              \(x\_k\) y\_\(k + 1\) - \(x\_\(K + 1\)\) y\_k)\)\)\),
 where ((Subscript[x, i, ]) (Subscript[y, i])), \(TraditionalForm\`i = \(1, n\)\&_\) are polygon's vertices and \(TraditionalForm

      \`\((x\_\(n + 1\), y\_\(n + 1\))\) = \((x\_1, y\_1)\)\).

\(area[poly_] := 
	

      Abs[Plus\ @@
			

            MapThread[Dot, 


              				{poly, 
					

                \({#[\([2]\)], \(-#[\([1]\)]\)}&\)\ /@
						

                  RotateLeft[poly]}\ ]\ ]/2\)

rotm[{x, y, z} gives matrix A such that det(A) = 1 and A (({{x}, {y}, {z}}))=(({{0}, {0}, {z'}}))

rotm[{x_, y_, z_}]:=Module[
		{α, β},
		\({α, β} = 

              If[y === z === 0, 
				{0, ArcTan[0, x]}, 


                				{ArcTan[z, y], ArcTan[\@\(y\^2 + z\^2\), x]}\ ]\);
		(({{Cos[β], 0, -Sin[β]}, {0, 1, 0}, {Sin[β], 0, Cos[β]}})).(({{1, 0, 0}, {0, Cos[α], -Sin[α]}, {0, Sin[α], Cos[α]}}))]

sqvol returns surface area and volume

\(sqvol[polys_] := 

      Module[
		{pyrsv, cent}, 
		
		

        pyrsv[poly_, pt_] := 

          Module[
				{base, apex, norm, matr, sq, ht}, 


            				{base, apex} = {poly, pt}; 
				

            norm = Cross[base[\([3]\)] - base[\([1]\)], 
						

                base[\([2]\)] - base[\([1]\)]\ ]; 
				

            matr = rotm[norm]; 
				base = \(matr.#&\)\ /@\ base; 


            				apex = matr.apex; 
				

            ht = Abs[base[\([1, 3]\)] - apex[\([3]\)]\ ]; 
				

            base = \(Take[#, 2]&\)\ /@\ base; 
				sq = area[base]; 


            				{sq, sq*ht/3}\ ]; 
		
		

        cent = \(\((Plus\ @@\ #)\)/Length[#]&\)[
				Union\ @@\ polys]; 

        
		Plus\ @@\ \((\(pyrsv[#, cent]&\)\ /@\ polys)\)\ ]\)

sqvol[gr2]

Vappr = %[[2]];

To get the area of the lateral surface, we drop the base polygon (the volume value will be wrong)

sqvol[Drop[gr2, -1]]

Sappr = %[[1]];

And now we can do a check

{S, V} /. {R -> 3, H -> 4, h -> 1}

% - {Sappr, Vappr}

Copyright © 1999, Maxim Rytin