Halb volle oder halb leere Gläser?

Will man der Frage auf den Grund gehen, wann ein vorgegebenes Behältnis, zum Beispiel ein Weinglas halb voll ist, so kann diese Fragestellung zu kurzweiliger mathematischer Beschäftigung führen.
Wir gehen der Frage hier auf den Grund. Als ersten brauchen wir dazu das Bild eines Weinglases. Das ist einfach, da eines meiner größten Hobbies die Photographie ist. Ein Weinglas? Bitte sehr!

Stacks Image 4917

Nun muß das Glas sozusagen in Bits und Bytes gegossen werden. Das ist glücklicherweise leichter als man denkt. In Mathematica können Grafiken zum einen rudimentär bearbeitet werden, zum andern ist die Möglichkeit enthalten durch Mausclicks die aktuellen Koordinaten des Mauzszeigers zu speichern: Mausklick rechts und dann "Get Coordinates". Damit werden die aktuellen Koordinaten bei jedem Klick gespeichert und können dann via "Kopieren und Einfügen" direkt einer Variablen in Mathematica zugewiesen werden.
Damit kann man die Konturlinie des Glases abfahren und digitalisieren. Für das hier abgebildete Glas liefert diese Methode die oben angegebenen Koordinaten:

My Image

Danach werden die entsprechenden Interpolationsfunktionen für die Kontour des Glases berechnet. Die Funktion Interpolation berechnet dabei eine Funktion die die gegebnen Punkte durch ein Polynom interpoliert (wobei stets als x-Wert die Werte 1, 2, 3, ... angenommen werden. Dabei wird das jeweilige Minimum (abgerundet, damit der Glasstil nicht verschwindet) von den Koordinaten abgezogen:

My Image

Eine schöne dreidimensionale Darstellung erhält man dann mit der Funktion RevolutionPlot3D. Hier kann man auf einfache Art und Weise dreidimensionale Rotationskörper darstellen.

My Image

Zur Berechnung des Inhalts wird nur derjenige Teil des Glases betrachtet, der die Flüssigkeit aufnimmt, in diesem Falle also den Wein. Dazu werden die entsprechenden Koordinaten aus dem obigen Bild erneut digitalisiert, diesmal aber in der "klassischen" Art und Weise dargestellt, d.h. in der (x,y)-Ebene. Man erhält nach einer kurzen Transformation, die die Grafik in den Koordinatenursprung verlegt folgende Darstellung:

Stacks Image 4992

Stacks Image 4989

Damit können wir eine Funktion angeben, die den Inhalt des Glases bis zu einem beliebigen "Füllstand" angibt:

inhaltBisX[x_] = NIntegrate[contour[t], {t, 0, x}]

Der Rest ist nun einfach, wir suchen nur noch den Punkt, für den der Inhalt bis zu diesemPunkt gerade den halben Glasinhalt entspricht. Als Näherungswert

Stacks Image 5010

Mit nur wenigen weiteren Befehlen kann man dann eine ansprechende dreidimensionale Darstellung mit eingezeichnetem Füllstand erzeugen

Download:

My Image