Dies ist eine alte Version des Dokuments!
18.03.2020
[Lukas] Sondierung der Lage: es werden bereits Zellen korrekt generiert, leider werden immer noch drei große Codeblöcke benötigt:
Fall gegen Ende des Blocktermines der Code funktioniert, werden wir hoffentlich noch genügend Zeit haben, einige Testreihen durchzuführen und die Scutoids in verschiedenen Konstellationen zu generieren und die entsprechenden Daten auszuwerten. Das Endprodukt wäre dann eine Auswertung dieser Daten innerhalb diser Doku.
[UPDATE 18:32 Uhr]
Nach langem hin und her präsentiere ich nun einen Code, der endlich ein sauberes Polygon aus einer gegeben, unsortierten Vertex-Liste generieren kann.
<code python>
# this script is going to create a polygon out of a random set of points
import numpy as np
import bpy
def radianBetweenVectors(v1, v2, n):
# berechnet den Zwischenwinkel zweier Vektoren unter Beachtung eines Normalenwinkels
# (später wird für n die Flächennormale der Zellwand eingesetzt, welche die Verbindung der
# beiden Knotenpunkte ist, zwischen denen sich die Zellwand befindet).
a = v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]
b = v1[0]*v2[1]*n[2] + v2[0]*n[1]*v1[2] + n[0]*v1[1]*v2[2] - v1[2]*v2[1]*n[0] - v2[2]*n[1]*v1[0] - n[2]*v1[1]*v2[0]
rad = np.arctan2(b, a)
if (rad < 0): rad = (2*np.pi) +rad
deg = rad*180/np.pi
#print(„» v02“, rad, deg, „\n“)
return deg
def polySortListNEW(v_list, normal):
# soll eine Liste von Punkten im Kreis herum links herum anordnen
# falls es ein Dreieck ist, ist die Reihenfolge egal
if (len(v_list) == 3):
return v_list
# Startvariablen werden gesetzt
geordnet = []
start = v_list[0]
aktu = start
vv = np.subtract(v_list[0], v_list[1]) # Vergleichswinkel, der zufällig gewählt wird (zeigt immer aus dem Kreis raus)
geordnet.append(start)
while True:
print(„»“, aktu)
# loop start values
min_angle = 360
min_stelle = 0
# suche nach nächstem Punkt
for v in range(0, len(v_list)):
if (aktu[0] != v_list[v][0] or aktu[1] != v_list[v][1] or aktu[2] != v_list[v][2]):
dir = np.subtract(v_list[v], aktu)
deg = radianBetweenVectors(vv, dir, normal) #np.array([0,0,1]))
if (deg < min_angle):
min_angle = deg
min_stelle = v
geordnet.append(v_list[min_stelle])
vv = np.subtract(v_list[min_stelle], aktu)
aktu = v_list[min_stelle]
print(„ >“, aktu)
if (aktu[0] == start[0] and aktu[1] == start[1] and aktu[2] == start[2]): break
return geordnet
def genPoly(liste, normal):
# sortiert die gegebene Vertecie- Liste im Kreis herum und erstellt dann daraus eine saubere Fläche.
geordnet = polySortListNEW(liste, normal)
f = []
for i in range(0, len(geordnet)):
f.append(i)
facelist = []
facelist.append(f)
generateObj(„Poly“, geordnet, facelist)
def generateObj(name, verts, faces, loc = np.array([0,0,0]), col = ( 1.0, 1.0, 1.0, 1.0 )):
# generiert ein Objekt mit den Übergebenen Parametern (Name, Eckpunkte, Seiten)
mymesh = bpy.data.meshes.new(name)
myobject = bpy.data.objects.new(name,mymesh)
mymat = bpy.data.materials.new(„Mesh_mat“)
mymat.diffuse_color = col
mymesh.materials.append(mymat)
myobject.location = loc
bpy.context.collection.objects.link(myobject)
mymesh.from_pydata(verts,[],faces)
mymesh.update(calc_edges=True)
# kleine Testcode: aus den gegebenen Vertex-Punkten wird automatisch ein einflächiges Polygon kreiert.
liste = [np.array([1,0,-2]), np.array([-1.5,0,-1]), np.array([-1,0,2]), np.array([1.5,0,1]), np.array([2,0,-1])]
genPoly(liste, np.array([0,-1,0]))
</code>