Sie müssen den Hexaeder (Wonky Cube) in einen Einheitswürfel umwandeln. Das folgende Bild zeigt, was ich meine, und gibt uns ein Nummerierungsschema für die Ecken des Hexa. Vertex 2
ist hinter dem Würfel versteckt.
Die Transformation ist von den realen Raum x,y,z
, auf ein neues Koordinatensystem u,v,w
, in dem das hexa ein Einheitswürfel ist. Die typische Funktion, die für Hexa verwendet wird, sieht so aus.
x = A + B*u + C*v + D*w + E*u*v + F*u*w + G*v*w + H*u*v*w
Transformationen für y- und z-Koordinaten haben die gleiche Form. Sie haben 8 Ecken zu Ihrem Würfel, also können Sie diese ersetzen, um Koeffizienten A,B,...
zu lösen. Die Einheitskoordinaten u,v,w
sind entweder 0
oder 1
an jedem Scheitelpunkt, so dass dies die Dinge sehr vereinfacht.
x0 = A // everything = zero
x1 = A + B // u = 1, others = zero
x2 = A + C // v = 1, ...
x4 = A + D // w = 1
x3 = A + B + C + E // u = v = 1
x5 = A + B + D + F // u = w = 1
x6 = A + C + D + G // v = w = 1
x7 = A + B + C + D + E + F + G + H // everything = 1
Sie müssen dann für A,B,...
lösen. Dies ist einfach, weil Sie nur Ersatz austauschen. A
entspricht x0
. B
entspricht x1 - A
, etc ... Sie müssen dies für y
und z
auch tun, aber wenn Ihre Sprache Vektoroperationen unterstützt, kann dies wahrscheinlich in dem gleichen Schritt wie für x
getan werden. Wenn Sie die Koeffizienten haben, können Sie einen Punkt u,v,w
in x,y,z
konvertieren. Wenn Sie jetzt ein Punktgenerierungsschema haben, das auf einem 1x1x1-Würfel funktioniert, können Sie das Ergebnis in das ursprüngliche Hex transformieren. Sie könnten die gleiche Triple-Loop-Struktur in Ihrem geposteten Code beibehalten und u,v,w
zwischen 0
und 1
variieren, um ein Raster von Punkten innerhalb des Hex zu erstellen.
Ich fürchte, ich weiß nicht r
, so kann ich Ihnen keinen Beispielcode in dieser Sprache geben. Hier ist ein schnelles python3
Beispiel, nur um zu beweisen, dass es funktioniert.
import matplotlib.pyplot as pp
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
np.random.seed(0)
cube = np.array([
[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [1.0, 1.0, 0.0],
[0.0, 0.0, 1.0], [1.0, 0.0, 1.0], [0.0, 1.0, 1.0], [1.0, 1.0, 1.0]])
hexa = cube + 0.5*np.random.random(cube.shape)
edges = np.array([
[0, 1], [0, 2], [1, 3], [2, 3],
[0, 4], [1, 5], [2, 6], [3, 7],
[4, 5], [4, 6], [5, 7], [6, 7]])
def cubeToHexa(hexa, u, v, w):
A = hexa[0]
B = hexa[1] - A
C = hexa[2] - A
D = hexa[4] - A
E = hexa[3] - A - B - C
F = hexa[5] - A - B - D
G = hexa[6] - A - C - D
H = hexa[7] - A - B - C - D - E - F - G
xyz = (
A +
B*u[...,np.newaxis] +
C*v[...,np.newaxis] +
D*w[...,np.newaxis] +
E*u[...,np.newaxis]*v[...,np.newaxis] +
F*u[...,np.newaxis]*w[...,np.newaxis] +
G*v[...,np.newaxis]*w[...,np.newaxis] +
H*u[...,np.newaxis]*v[...,np.newaxis]*w[...,np.newaxis])
return xyz[...,0], xyz[...,1], xyz[...,2]
fg = pp.figure()
ax = fg.add_subplot(111, projection='3d')
temp = np.reshape(np.append(hexa[edges], np.nan*np.ones((12,1,3)), axis=1), (36,3))
ax.plot(temp[:,0], temp[:,1], temp[:,2], 'o-')
u, v, w = np.meshgrid(*[np.linspace(0, 1, 6)]*3)
x, y, z = cubeToHexa(hexa, u, v, w)
ax.plot(x.flatten(), y.flatten(), z.flatten(), 'o')
pp.show()
Ich kann nicht die genaue justificiation für diese Form der Transformation wieder zu verwenden. Es ist sicherlich leicht zu lösen, und es hat keine quadrierten Terme, so dass Linien in den Richtungen der u,v,w
Achsen zu geraden Linien in x,y,z
zuordnen. Das bedeutet, dass Ihre Würfelkanten und -flächen sowie die Ecken garantiert übereinstimmen. Mir fehlen jedoch die Berechnungen, um dies zu beweisen, und ich konnte auch keine googlefähigen Informationen finden. Mein Wissen kommt aus einer fernen Erinnerung an Lehrbücher über Finite-Elemente-Methoden, wo diese Art von Transformationen üblich sind.Wenn Sie weitere Informationen benötigen, schlage ich vor, dass Sie dort nachsehen.
Könnten Sie bitte erläutern, was Sie mit einem "systematischen Punkt-Raster" meinen? Ich habe deine Frage wie gefragt, wie man einen verzerrten Würfel in NxNxN kleinere Würfel aufteilt. Ist das richtig? – Bill
@Bill Ja ich denke du hast es verstanden. Das Ergebnis des Algorithmus sollte eine Liste von Punkten sein, die innerhalb der Grenzen des verzerrten Würfels liegen. Die Punkte könnten zufällig verteilt sein, aber ich würde es vorziehen, dass sie äquidistant sind. Die Aufteilung in NxNxN kleinere Würfel könnte ein Weg sein, dies zu erreichen. Aber wie? – nevrome