8
$\begingroup$

I want to find the volume of a torus

torus = RevolutionPlot3D[{2 + Cos[t], Sin[t]}, {t, 0, 2 Pi}] 

enter image description here

dtorus = DiscretizeGraphics[Cases[Normal @ torus, _GraphicsGroup, -1][[1]]] 

enter image description here

The Documentation for RegionMeasure states:

"RegionMeasure is also known as count (0D), length (1D), area (2D), volume (3D)..."

{Area @ dtorus, RegionMeasure @ dtorus, Volume @ dtorus} 

{78.6557, 78.6557, 0}

Next, I want to find the volume of the torus' bounding cuboid

bounds = RegionBounds[dtorus] 

{{-3., 3.}, {-3., 3.}, {-1., 1.}}

cuboid = Graphics3D[{Green, Opacity @ 0.2, Cuboid @@ Transpose[bounds]}]; Show[torus, cuboid, Boxed -> False, Axes -> False] 

enter image description here

Now find the volume of the cuboid

dcuboid = DiscretizeGraphics @ cuboid 

enter image description here

{Area @ dcuboid, RegionMeasure @ dcuboid, Volume @ dcuboid} 

{Infinity, 72., 72.}

Questions

How can it be that the Volume of the bounding cuboid, 72, is lower than the "Volume" of the torus, 78 .6557?

What do I overlook here?

What other options do I have to find the volume of my torus?

$\endgroup$
8
  • $\begingroup$ But isn't the volume of your torus 0? {Area @ dtorus, RegionMeasure @ dtorus, Volume @ dtorus}->{78.6557, 78.6557, 0}. As I understand, RevolutionPlot3D plots a surface. A surface itself has 0 volume, for instance, a sphere. $\endgroup$ Commented Sep 17, 2014 at 12:39
  • $\begingroup$ @GregoryRut A sphere has volume 4/3 Pi * radius^3, hasn't it? $\endgroup$ Commented Sep 17, 2014 at 12:48
  • $\begingroup$ No, it's somehing different. A ball has a volume. You could define an interior volume of a sphere. $\endgroup$ Commented Sep 17, 2014 at 12:49
  • 5
    $\begingroup$ If you do RegionDimension[dtorus], you'll see why. In this case RegionMeasure is giving you the surface area of the torus since you have a 2D region. $\endgroup$ Commented Sep 17, 2014 at 14:43
  • 6
    $\begingroup$ @RahulNarain, the truth is, DiscretizeGraphics will almost always give a surface discretization regardless of how the graphics was generated, which will result in a 2D region in general. $\endgroup$ Commented Sep 17, 2014 at 20:31

3 Answers 3

10
$\begingroup$

As I have mentioned in my comment, in order to define a torus with a volume, you need an inequality. Just like you would define the interior of a sphere: $x^2+y^2+z^2<R^2$. The interior of the torus is defined by an inequality $\left(R - \sqrt{x^2 + y^2}\right)^2 + z^2 < r^2 $, where R and r are the major and minor radii, respectively.

tor[R_, r_, x_, y_, z_] := (R - Sqrt[x^2 + y^2])^2 + z^2 < r^2 Volume@DiscretizeRegion[ ImplicitRegion[ tor[2, 1, x, y, z], {x, y, z}], {{-3, 3}, {-3, 3}, {-3, 3}}] (*38.30219*) 

The formula for interior volume of a torus reads $ V = 2 \pi^2 R r^2.$ In our case the volume would be roughly $V\approx $39.5.

It seems that Volume could be applied for 'derived regions' (like tor, for instance) yet it seems that it works only for selected types of areas.

$\endgroup$
2
  • $\begingroup$ Why do you use 6 instead of 2 Pi ? 2 Piwould give 305.657 $\endgroup$ Commented Sep 17, 2014 at 12:59
  • $\begingroup$ There was an error with def. of tor function (R^2 instead of R). It's fixed now. The range of variables has been modified as well. $\endgroup$ Commented Sep 17, 2014 at 13:18
9
$\begingroup$

I'm not 100% sure on this, but I think you can construct a torus as a Cartesian product of a disk and a circle. Unfortunately you can't visualise it because the embedding dimension is 4, but the volume seems to come out correct:

Volume @ RegionProduct[Disk[{0, 0}, 1], Circle[{0, 0}, 2]] (* 4 π^2 *) 

or with symbolic radii:

Volume @ RegionProduct[Disk[{0, 0}, r], Circle[{0, 0}, R]] (* 2 π^2 r^2 R *) 
$\endgroup$
2
$\begingroup$

Now we can set

Mesh -> None, Method -> {"BoundaryOffset" -> False} 

Thanks @MichaelE2

https://mathematica.stackexchange.com/a/92557/72111

https://mathematica.stackexchange.com/a/226367/72111

torus2 = RevolutionPlot3D[{2 + Cos[t], Sin[t]}, {t, 0, 2 Pi}, Mesh -> None, Method -> {"BoundaryOffset" -> False}, PlotPoints -> 60]; reg = torus2 // BoundaryDiscretizeGraphics FindMeshDefects[reg] Volume[reg] 

enter image description here

39.3297

$\endgroup$

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.