Message Boards Message Boards

[WSC19] Modeling the Orientation of a Random Polyhedron on Water


Fluid mechanics is a field concerning the forces on fluid, particularly used by ocean engineers in determining the stability or balance of forces on an object. It was only recently that I encountered the topic of fluid mechanics when Dr. Stephen Wolfram suggested modeling the orientation of a wooden polyhedron on water. It was an unfamiliar yet intriguing topic, especially as I explored the blog post by Nick Berry that analyzed the orientation of a cube in water with different density ratios. The vast variations of orientation of a simple cube made me wonder how a complex object like a random polyhedron would react.

The preliminary research was especially challenging, as there were limited sources available online explicitly on the topic of orientation of an object in water at my level of knowledge, and consequently, a large part of my outcome is based on approximations and assumptions. The project was more of an experience and introduction for me to visualize the scope of the Wolfram Language. The objective of this research was to model the orientation at which a random polyhedron floats on water, through determining the balance of buoyant and gravitational forces on a polyhedron. enter image description here

Archimedes' principle

My initial approach to this problem was to determine whether an object, given its density would float or sink in water. According to Archimedes’s Principle, the upward buoyant force is equal to the weight of the liquid that the object displaces. An object would reach equilibrium if the buoyant force and weight balance out, meaning that the weight of the liquid that object displaces equals the weight of the object.

Weight = Volume of object * Density of object * Gravity

Buoyant Force = Volume of the part of the object submerged * Density of water * Gravity,

so if Weight = Buoyant Force, Volume of the part of the object submerged / Volume of the object = Density of object / Density of water

We can get two pieces of information out of this:

  1. The object would sink if its density is greater than the density of water (or any liquid)

  2. Given the density of object and water, and the volume of the object, the volume of the part of the object submerged would be (Density of object/Density of water) * Volume

With this, I generated a function for the height of the water level when an object is in equilibrium, that raises the water level until the volume of the region of intersection between the water and object is equal to the volume of the part of the object submerged in equilibrium. The function “Waterline” selects the last value out of the range of values of height of water level generated until the volume of the part of the object submerged in water is greater than the volume of the object that should be submerged in water for the object to be in equilibrium.

WaterLine[object_, objectdensity_, liquiddensity_] := 
 Last[Select[Range[0, 1, 0.01],
      RegionIntersection[Cuboid[{0, 0, 0}, {1.3, 1.3, #}], object]] <=
      objectdensity/liquiddensity*Volume[object] &]]


The center of mass is a point at which the gravitational force acts on an object, and the center of buoyancy is a point at which the buoyant force acts on an object. If the two points are not vertically aligned, the horizontal displacement between the two forces would create torque, which would cause the rotation of an object. Therefore, now that the water level when an object is in equilibrium was determined, and the magnitude of the two forces was equalized, the object would reach equilibrium if there are no horizontal unbalance of forces that causes the change of orientation.

In an object of uniformly distributed mass, the centroid of the object is equal to the center of gravity, and the centroid of the region of the object submerged in water describes the center of buoyancy. Finding the centroid, intersection, or volume or a random polyhedron often requires lengthy calculations and integrals, but I discovered that Wolfram Alpha provides built in functions “Centroid”, “Intersection”, and “Volume“.

I used the built-in functions to determine the center of gravity and center of buoyancy of an object:


RegionCentroid[buoyancyRegion[object, water]]

buoyancyRegion[object_, water_] := 
     RegionIntersection[objectAfterRotation[object, water], 
      Cuboid[{0, 0, 0}, {1.3, 1.3, water}]]

I then incorporated the RotationTransform function to align the center of gravity with the center of buoyancy.

 RotationTransform[{RegionCentroid[object] - 
     RegionIntersection[Cuboid[{0, 0, 0}, {1.3, 1.3, water}], 
      object]], {0, 0, 1}}, 
   RegionIntersection[Cuboid[{0, 0, 0}, {1, 1, water}], object]]]]

The main problem I encountered with this process was that incorporating the user input “object” in the functions would produce the change of center of gravity and center of buoyancy values in terms of the original unrotated object, rather than calculating new values with each rotation. I couldn't yet find a way to store each rotated value, and therefore had to vastly approximate my calculations by rotating an object twice.


Final Animation

The output is an approximated model of orientation of a random polyhedron placed in water. The center of gravity (red point), and the center of buoyancy (blue point) are vertically aligned, and the water level is manipulated to balance out these vertical forces.

Another significant limitation of the product is that only the horizontal displacement of center of gravity and center of buoyancy was taken into consideration. An object placed in water tends to orient itself to lower the center of gravity relative to the center of buoyancy, among its many possible orientations in which the center of gravity and center of buoyancy are vertically aligned. I was able to model one position of equilibrium of a polyhedron, but disregarded the stability of the equilibrium position. It is highly probable that the model I produced may not correctly describe how a polyhedron reacts in actual water, as a polyhedron would tend to orient to a more stable position based on the vertical placement of the center of gravity.

Future Work

I plan on extending this project after Summer Camp through modeling all orientations in which a polyhedron is in equilibrium by running my code through a table of angles from 0 to 2 Pi, and selecting all orientations in which the center of gravity and center of buoyancy are vertically aligned. With the selected values, I would make a function that determines the most stable equilibrium position by calculating the metacenter and selecting the orientation in which the vertical position of the center of gravity is the lowest relative to the center of buoyancy.


I want to thank my mentor Eryn for guiding me through the project.

Link to My GitHub Repository

POSTED BY: Seojin Yoon

enter image description here -- you have earned Featured Contributor Badge enter image description here Your exceptional post has been selected for our editorial column Staff Picks and Your Profile is now distinguished by a Featured Contributor Badge and is displayed on the Featured Contributor Board. Thank you!

POSTED BY: Moderation Team
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
or Discard

Group Abstract Group Abstract