Ich beschloss, dieses fünfeckige Programm programmgesteuert am Boden einer kohlensäurehaltigen PET-Flasche herzustellen, die jeder schon immer gesehen hat.
Aus der Schlussfolgerung wurden etwa 70 Punkte durch Selbstbewertung gemacht. Wenn Sie an dem Ergebnis interessiert sind, scrollen Sie zuerst nach unten, um das fertige Bild zu sehen, und entscheiden Sie dann, ob Sie weiterlesen möchten.
Dies ist eine fünfeckige.
Diese Form wird allgemein als ** Petaloid ** bezeichnet. Es bedeutet "Blütenblatt-Oid". Es wird so genannt, weil es von unten betrachtet wie ein Blütenblatt aussieht.
Wenn Sie zu Hause eine kohlensäurehaltige PET-Flasche haben, schauen Sie bitte unten nach.
Es gibt viele Formen für PET-Flaschen, aber im Grunde haben nur kohlensäurehaltige Getränke diese Bodenform. Kohlensäurehaltige Getränke haben einen starken Innendruck. Wenn sie also die Form einer Teeflasche haben, schwillt der Boden an. Es wird gesagt, dass Petaloide verwendet werden, um die Festigkeit aufrechtzuerhalten, da Probleme wie Rollen und Platzen so auftreten, wie sie sind.
Ich möchte ein Experiment vorstellen, bei dem Backpulver tatsächlich in eine PET-Flasche Tee gegeben wurde, um seine Stärke zu testen.
Es gibt ein tiefes Geheimnis in Form von Haustierflaschen - Diamond Online
Das Ziel dieses Artikels ist die programmgesteuerte Erzeugung von Blütenblattformen. Streben Sie nach Qualität, wie sie ist (erwarten Sie nicht zu viel, weil mein Urteil schlampiger ist als die der Öffentlichkeit).
Ich fragte mich, ob es leicht mit einer einzigen Formel ausgedrückt werden könnte, aber ich bekam keine Ergebnisse. Obwohl Drucktestdaten herauskommen werden ...
Vielleicht entwerfe ich mit CAD.
Wenn Sie sich nicht auf das Internet verlassen können, müssen Sie es selbst tun. Zum Glück habe ich so viele echte Dinge wie ich. Schneiden Sie zuerst mit einem Cutter nur den Boden der PET-Flasche aus.
Versuchen Sie außerdem, sich vertikal von der Mitte aus zu halbieren. Von der 12-Uhr-Richtung zur 6-Uhr-Richtung im obigen Bild.
Wie Sie auf einen Blick sehen können, sind zunächst fünf gleiche Formen am Umfang aufgereiht. Wenn Sie also eine davon reproduzieren können, können Sie sehen, dass Sie das Ziel erreichen können, indem Sie fünf kopieren und anordnen.
In Bezug auf die Form gibt es abwechselnde Spitzen und Täler, und die Täler sind ungefähr 6 bis 7 mm breit und scheinen Linien zu haben, die parallel von der Mitte zum Außenumfang verlaufen. Die Form des Berges ist ziemlich kompliziert, aber von direkt oben (oder direkt unten) wie ein Fächer und von der Seite gesehen wie ein Trapez. Um genau zu sein, gibt es eine glatte Kurve zwischen den Gipfeln und Tälern.
Mit Blick auf den Querschnitt ist der Querschnitt des Talteils eine intelligente Kurve, die wie ein Viertel einer elliptischen Kurve aussieht. Andererseits ist der Querschnitt des Gebirgsteils etwas kompliziert.
Auch dies ist für den Artikel nicht sehr relevant, aber der untere Teil war ziemlich dick, ungefähr 3 mm. Zuerst fragte ich mich, ob ich es mit einer Schere schneiden könnte, aber ich musste eine Fadensäge verwenden, weil das Sägeblatt nicht zahnig war.
Überlegen Sie anhand dieser Informationen, wie die Form reproduziert werden soll.
Zunächst werden wir als grundlegende Richtlinie Dinge betrachten, die auf der Mitte der Flasche basieren. Insbesondere werden wir, wie in der folgenden Abbildung gezeigt, versuchen, den Festkörper zu reproduzieren, indem wir die Querschnittsform jedes Mal in Richtung des Azimutwinkels θ mit dem Zentrum als Referenz berechnen und akkumulieren.
In Bezug auf die Reproduktion der Querschnittsform müssen als nächstes die folgenden drei verschiedenen Arten von Kurven erzeugt werden.
Vielleicht könnte es in einer Formel zusammengefasst werden, aber ich kann mir das nicht vorstellen. Deshalb habe ich mich dieses Mal entschlossen, die Spline-Kurve zu verwenden (Spline bei Problemen).
Wie oben erwähnt, betrachten wir, wie drei verschiedene Arten von Kurven basierend auf einer Variablen erzeugt werden, die als Azimutwinkel $ θ $ bezeichnet wird.
Ziehen Sie zunächst in Betracht, die Kurve des Talteils mit einer Spline-Funktion auszudrücken. Wie Sie sehen können, hat diese Kurve ungefähr die Form eines Bogens auf einer Ellipse, sodass es nicht schwierig ist, sie mit einem Spline darzustellen.
Der Einfachheit halber verwenden wir es als perfekten Kreis anstelle einer Ellipse. Wenn Sie es auf eine Ellipse zurücksetzen möchten, können Sie es vertikal vergrößern oder verkleinern.
Zeichnen Sie einen Kreis wie oben gezeigt. Ordnen Sie $ N $ Kontrollpunkte in gleichen Intervallen auf dem Bogen im 4. Quadranten (unten rechts) an und zeichnen Sie eine kubische Spline-Kurve, die sie verbindet. Diese Kurve wird durch alle Kontrollpunkte geführt. Es passt nicht genau zum Bogen, aber es ist eine Kurve, die für das menschliche Auge nicht zu unterscheiden ist. Außerdem ist $ N = 9 $.
Als nächstes mache ich eine Kurve für den Bergteil. Hier werde ich die Kurve des Tals verarbeiten und die Kurve des Berges nachahmen, wie sie grob beobachtet wird.
Insbesondere wird der Kontrollpunkt $ (x_i, y_i) $ auf dem Bogen durch Multiplizieren von $ k_i $ mit dem Mittelpunkt $ (0,0) $ des Kreises ($ 1 \ leq i \ leq N $) erweitert. Machen Sie einen groben Umriss, wie in der folgenden Abbildung gezeigt.
x'_i = x_i * k_i \\
y'_i = y_i * k_i
Passen Sie den Wert von $ k_i $ so an, dass er fast gleich aussieht, während Sie einen Blick auf das aufgenommene Bild werfen. Der letzte Parameter ist
\begin{align}
K &= [k_1, k_2, k_3, ... , k_9] \\
&= [1.00, 1.05, 1.18, 1.46, 1.36, 1.18, 1.07, 1.01, 1.00]
\end{align}
Es wurde gemacht. Die Endpunkte (k1 und k9) müssen 1,0 sein, sonst ist das Ergebnis seltsam.
Das Erhöhen der Anzahl der Kontrollpunkte $ N $ zur Wiedergabe einer genaueren Kurve kann die Qualität verbessern, ist jedoch recht schwierig einzustellen. Nach der Fertigstellung wäre es möglicherweise besser gewesen, ein oder zwei weitere Punkte hinzuzufügen, um die Genauigkeit des unteren Teils zu verbessern (vierter Punkt von links).
Die Spline-Interpolation dieser Gliederung ergibt Folgendes. Ich habe $ k_i $ angepasst, während ich die echte PET-Flasche von der Seite betrachtet habe, also sieht es sehr ähnlich aus.
Erstellen Sie schließlich eine Kurve für die Steigung zwischen den Gipfeln und Tälern. Dies erfolgt durch Mischen der Peak- und Valley-Kurven mit einer Variablen, die als Verformungsverhältnis $ D $ bezeichnet wird (Sie tun lediglich lineare Interpolation. % B7% 9A% E5% BD% A2% E8% A3% 9C% E9% 96% 93)).
\begin{align}
x''_i &= x_i * D + x'_i * (1-D) \\
&= x_i * (D + k_i - Dk_i) \\
y''_i &= y_i * D + y'_i * (1-D) \\
&= y_i * (D+k_i - Dk_i)
\end{align}
\quad (0 \leq D \leq 1)
Das Bild oben zeigt die Kurve des geneigten Teils von 0,0 bis 1,0 in Schritten von 0,2. D = 0 ist die rotviolette Linie und D = 1 ist die gelblichgrüne Linie. Sie können eine Kurve erstellen, die die Lücke zwischen Gipfeln und Tälern, z. B. Konturlinien, reibungslos ausfüllt.
Bei der Entscheidung für die Richtlinie habe ich beschlossen, eine Kurve des Querschnitts für jeden der mehreren Azimutwinkel $ θ $ zu erstellen. Da wir eine Variable namens Verformungsverhältnis $ D $ eingeführt haben, um eine Kurve zu erstellen, müssen wir den Wert von $ D $ basierend auf dem Wert von $ θ $ ermitteln.
Ich werde einen Graphen von θ (0 bis 360 Grad) auf der horizontalen Achse und D (0 bis 1) auf der vertikalen Achse zeichnen, um diese Beziehung zu verdeutlichen. Setzen Sie zuerst für die Spitze des Berges $ D = 1 $. Der Winkelbereich, der als oben betrachtet wird, beträgt 22 Grad von der visuellen Messung (ungefähr).
Setzen Sie außerdem $ D = 0 $ für den Talboden. Das sind ungefähr 10 Grad. Da es schwer zu verstehen war, weil es nicht in der Grafik angezeigt wurde, wird die Untergrenze der Y-Achse auf -0,2 festgelegt.
Der weiße Teil der Lücke zwischen Orange und Blau ist der Hang zwischen dem Gipfel und dem Tal. Dieser Teil wird zwischen 0 und 1 mit einer Kurve gefüllt, aber wie sollen wir ihn füllen? Es ist cool zu sagen, dass es mathematisch so ist, aber ich bin nicht so schlau. Ich werde die Beschleunigungsfunktion hier verwenden, um sie gut auszufüllen.
Referenz: Easing Function Cheet Sheet
Nachdem ich verschiedene Dinge ausprobiert hatte, entschied ich mich für "easyInOutQuad", weil es gut aussah.
\begin{align}
y &= easeInOutQuad(x) \\
&=
\begin{cases}
2x^2 &(0 \leq x < \frac{1}{2}) \\
-2x^2 + 4x - 1 &(\frac{1}{2} \leq x \leq 1)
\end{cases}
\end{align}
Das endgültige Diagramm sieht folgendermaßen aus: Beachten Sie, dass der Bereich auf der vertikalen Achse von 0 auf 1 geändert wurde.
Nachdem wir die Kurven in alle Richtungen haben, werden wir sie verwenden, um ein 3D-Modell zu erstellen.
Zunächst wird der Azimutwinkel & thgr; in gleichen Intervallen (zum Beispiel alle 1 °) geschnitzt, um eine Kurve zu erzeugen. Berechnen Sie für die Kurve die an M Punkten diskreten Koordinaten. Konzentrieren Sie sich auf die Punkte auf den beiden Kurven und wählen Sie die drei Punkte aus, um ein dreieckiges Polygon zu bilden.
Sie können direkt mit OpenGL usw. zeichnen, aber dieses Mal werde ich die Datei im DXF-Format exportieren und mit einer 3D-Modellierungssoftware anzeigen.
Da ich den Code dieses Mal in Python geschrieben habe, habe ich die Bibliothek ezdxf verwendet, die das DXF-Format in Python verarbeiten kann. Das folgende Bild zeigt die Ausgabedatei mit der Software Modo.
Hier ist das Ergebnis der Zuweisung von Materialien und des Renderns [^ 1].
Dies ist das Ergebnis, das in Blender angezeigt wird. Das AutoCAD DXF-Import-Plug-In muss aktiviert sein.
Es sieht von der Seite gut aus, sieht aber von unten nicht sehr ähnlich aus. Vielleicht liegt es daran, dass die Unebenheiten nicht ausreichen oder dass sie nicht gerundet sind. Hmm ...
Ich glaube nicht, dass die meisten Leute es lesen werden, also werde ich es zusammenfalten.
Benötigt NumPy-, SciPy- und ezdxf-Bibliotheken.
petaloid.py
from typing import List, Tuple
import math
import numpy as np
from scipy.interpolate import splprep, splev
import ezdxf
#Definition des Typhinweises
Point2D = Tuple[float, float]
Point3D = Tuple[float, float, float]
def mix(a: float, b: float, x: float) -> float:
"""Lineare interne Teilung x=Wenn 0 a, x=Wenn 1 b"""
return b * x + a * (1.0 - x)
def easeInOutQuad(x: float) -> float:
"""Lockerungsfunktion"""
if x < 0.5:
return 2.0 * x * x
else:
return -2 * x * x + 4 * x - 1
def calcDeformRate(t: float) -> float:
"""
Finden Sie das Kurvenverformungsverhältnis D, das dem Azimutwinkel t entspricht
:param t:Richtungswinkel(Die Einheit ist Grad).. Wenn der durch 72 geteilte Rest 0 ist, entspricht er dem Tal, und wenn er 36 ° beträgt, entspricht er dem konvexen Teil.
:return:Verformungsverhältnis D.(0~1)
"""
t = math.radians(math.fmod(t, 72.0))
M = math.radians(72.0) #Winkelbereich für einen Vorsprung
k = math.radians(5.0) #Winkelbereich des Tals
tL = math.radians(25.0) - k #Eine Seitengrenze des Berges
tR = (M - k) - tL #Die andere Seite des Berges
if t < k or t > M - k:
return 0.0 #Talteil
elif t < k + tL:
return easeInOutQuad((t-k) / tL) #Geneigt
elif t < tR:
return 1.0 #Bergteil
else:
return easeInOutQuad(((M-k) - t) / tL) #Geneigt(Umkehren)
def curve(angle: float, div_num: int) -> List[Point2D]:
"""
Berechnen Sie die äußere Kurve gemäß dem angegebenen Azimutwinkel
:param angle:Richtungswinkel(0~360°)
:param div_num:Die Anzahl der Punkte, aus denen die Kurve besteht. Je mehr es ist, desto glatter ist es
:return:Eine Folge von Punkten, die eine Kurve darstellen
"""
# degree -> radian
angle = math.fmod(angle, 360.0 / 5) #Da es sich um ein Fünfeck handelt, werden 360 Grad in 5 gleiche Teile geteilt.
#Finden Sie das Verformungsverhältnis D, das dem Azimutwinkel entspricht(D im Tal=0, D in den Bergen=1)
D = calcDeformRate(angle)
#Finden Sie das Verformungsverhältnis jedes Kontrollpunkts
#Im Talteil befinden sich alle Kontrollpunkte auf der linken Seite(1.0)Und es wird ein Bogen
#Im Gebirgsteil zeichnen alle Kontrollpunkte eine bestimmte Kurve mit dem Verhältnis rechts
#Andere Teile(Berghang)Zeichnet nun eine interpolierte Kurve gemäß dem Wert von D.
r_rate = [
mix(1.00, 1.00, D),
mix(1.00, 1.05, D),
mix(1.00, 1.18, D),
mix(1.00, 1.46, D),
mix(1.00, 1.36, D),
mix(1.00, 1.18, D),
mix(1.00, 1.07, D),
mix(1.00, 1.01, D),
mix(1.00, 1.00, D)]
#Finden Sie die Position des Kontrollpunkts
xs = []
ys = []
n = len(r_rate)
for i in range(n):
deg = i * 90.0 / (n - 1)
rad = math.radians(deg)
x = r_rate[i] * math.sin(rad)
y = r_rate[i] * math.cos(rad)
xs.append(x)
ys.append(y)
#Zeichnen Sie eine kubische Spline-Kurve, um alle Kontrollpunkte zu durchlaufen
spline = splprep([xs, ys], s=0, k=3)[0]
detail = np.linspace(0, 1, num=div_num, endpoint=True)
ix, iy = splev(detail, spline)
points = list(zip(ix, iy))
return points
def main():
#Machen Sie einen kleinen Vorsprung in der Mitte unten
num_bottom_point = 8 #Punktzahl der Mikroprojektionen in der Mitte unten
bottom_width = 0.2 #Mittlere Bodengröße
bottom_height = 0.05 #Zentrale Bodenhöhe
bottom_points = []
for i in range(num_bottom_point):
n = i / num_bottom_point
angle = n * math.pi
x = n * bottom_width
#Y mit cos=[1.0,1.0+height]Mach eine Kurve
y = 1.0 + (math.cos(angle) + 1) / 2 * bottom_height
bottom_points.append((x, y))
#Erstellen Sie eine dreidimensionale Liste von Eckpunkten, die Blütenblattfiguren darstellen
num_curve: int = 180 #Anzahl der Azimutunterteilungen(360 jedes Mal,180 ist alle 2 mal)
num_point: int = 50 #Ungefähre Anzahl von Kurven in einer Richtung(Einschließlich des Mittelpunkts)
num_point_curve = num_point - num_bottom_point # (Ohne den Mittelpunkt)
aspect_adjust: float = 0.75 #Einstellwert für das Seitenverhältnis
vertices: List[Point3D] = []
for i in range(num_curve):
#Finden Sie die Kurve für jede Richtung
theta_deg = 360.0 / num_curve * i
theta_rad = math.radians(theta_deg)
points1 = curve(theta_deg, num_point_curve)
#Verbinden Sie sich mit dem kleinen Vorsprung in der Mitte
points2: List[Point2D] = [*bottom_points]
for p in points1:
#Über die Kurve(X)Drücken Sie ein wenig in die Richtung und machen Sie den freien Teil zu einer ebenen Fläche(Was für ein heikler Prozess ...)
x = bottom_width + p[0] * (1.0 - bottom_width)
y = p[1]
points2.append((x, y))
#In 3D-Koordinaten konvertieren
c = math.cos(theta_rad)
s = math.sin(theta_rad)
for p in points2:
x2 = p[0]
y2 = p[1]
x3 = x2 * c
y3 = y2 * aspect_adjust #Passen Sie das Seitenverhältnis an
z3 = x2 * s
vertices.append((x3, y3, z3))
#In Dreiecke teilen
indices: List[Tuple[int, int, int]] = []
for angle in range(num_curve):
a0 = angle
a1 = (angle + 1) % num_curve
for i in range(num_point - 1):
i00 = a0 * num_point + i
i01 = a0 * num_point + i + 1
i10 = a1 * num_point + i
i11 = a1 * num_point + i + 1
if i != 0: #Nur die Mitte ist ein Dreieck. Schließen Sie es daher aus, damit es sich nicht überlappt
indices.append((i00, i10, i11))
indices.append((i11, i01, i00))
#Ausgabe mit dxf
#Ich habe es in Scheitelpunkt und Index unterteilt, aber da das 3D-Gesicht von dxf nur Scheitelpunkte hat,
#Synthetisieren Sie eine Liste von Eckpunkten
triangles: List[Tuple[Point3D, Point3D, Point3D]] = []
for i in indices:
v1 = vertices[i[0]]
v2 = vertices[i[1]]
v3 = vertices[i[2]]
triangles.append((v3, v2, v1))
doc = ezdxf.new('R2010') # MESH requires DXF R2000 or later
msp = doc.modelspace()
for t in triangles:
msp.add_3dface(t)
doc.saveas("petaloid.dxf")
if __name__ == '__main__':
main()
Ich bin nicht mehr motiviert. Wenn Sie eine fremde Person haben, die ein vollständigeres Blütenblatt herausfordern möchte, beziehen Sie sich bitte darauf.
Q. Warum nur der Boden? Was ist mit dem Körper? A. Ich bin erschöpft \ _ (: 3 "∠) \ _
[^ 1]: Nach dem Import von DXF wird Mesh CleanUp ausgeführt, um Polygone zu kombinieren. Zusätzlich wird eine Unterteilungsfläche verwendet, um die Form zu glätten.
Recommended Posts