Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1920:cd_10 [2020/03/25 16:49] Zetraeder |
ws1920:cd_10 [2020/03/25 16:51] (aktuell) Zetraeder |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
----- | ----- | ||
- | ====== 10: Code ====== | + | ====== Code: Arbeitstermin 10 ====== |
- | **09.02.2020** | + | **14.02.2020** |
[[ws1920:cd_u03|<<]] | [[ws1920:scutoids|Home]] | [[ws1920:arbeitstermin_10|Text]] | [[ws1920:cd_u03|<<]] | [[ws1920:scutoids|Home]] | [[ws1920:arbeitstermin_10|Text]] | ||
- | Hier ist der aktuelle Code für Blender 3D: | + | Code Einzeltest: |
+ | |||
+ | <code python> | ||
+ | import bpy | ||
+ | import numpy as np | ||
+ | import random | ||
+ | |||
+ | # soll jetzt die richtige Reihenfolge auswählen und dann das | ||
+ | # entsprechende Polygon ausgeben | ||
+ | |||
+ | # muss nicht testen, ob die Punkte in einer Ebene liegen, da | ||
+ | # dies auf jeden Fall der Fall ist. | ||
+ | |||
+ | class Gerade(object): | ||
+ | ov = (0,0,0) | ||
+ | rv = (0,0,0) | ||
+ | kreuzt = False | ||
+ | kerne = [0,0] | ||
+ | |||
+ | def __init__(self,ov,rv,kerne): | ||
+ | self.ov = ov | ||
+ | self.rv = rv | ||
+ | self.kerne = kerne | ||
+ | |||
+ | def punktAn(self,k): | ||
+ | punkt = np.add(self.ov,(self.rv[0]*k,self.rv[1]*k,self.rv[2]*k)) | ||
+ | return punkt | ||
+ | |||
+ | def generateObj(name, verts, faces, loc = np.array([0,0,0]), col = ( 1.0, 1.0, 1.0, 1.0 )): | ||
+ | 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) | ||
+ | |||
+ | def zeichnePunkt(pos, name = "Punkt"): | ||
+ | verts = [(0.1,0.1,0.1),(-0.1,0.1,0.1),(-0.1,-0.1,0.1),(0.1,-0.1,0.1) | ||
+ | ,(0.1,0.1,-0.1),(-0.1,0.1,-0.1),(-0.1,-0.1,-0.1),(0.1,-0.1,-0.1)] | ||
+ | faces = [(0,1,2,3),(4,5,6,7),(0,1,5,4),(1,2,6,5),(2,3,7,6),(3,0,4,7)] | ||
+ | generateObj(name,verts,faces,pos) | ||
+ | |||
+ | def schnittTest(g1,g2): | ||
+ | a = [[g2.rv[0],-g1.rv[0]],[g2.rv[1],-g1.rv[1]]] | ||
+ | b = [[g1.ov[0]-g2.ov[0]],[g1.ov[1]-g2.ov[1]]] | ||
+ | |||
+ | c = [[g2.rv[2],-g1.rv[2]],[g2.rv[1],-g1.rv[1]]] | ||
+ | d = [[g1.ov[2]-g2.ov[2]],[g1.ov[1]-g2.ov[1]]] | ||
+ | |||
+ | e = [[g2.rv[2],-g1.rv[2]],[g2.rv[0],-g1.rv[0]]] | ||
+ | f = [[g1.ov[2]-g2.ov[2]],[g1.ov[0]-g2.ov[0]]] | ||
+ | |||
+ | #print("Det :",np.linalg.det(a)) | ||
+ | if (np.linalg.det(a) != 0): | ||
+ | return np.linalg.solve(a,b)[0][0] | ||
+ | elif (np.linalg.det(c) != 0): | ||
+ | print(">> ERGEBNIS") | ||
+ | return np.linalg.solve(c,d)[0][0] | ||
+ | elif (np.linalg.det(e) != 0): | ||
+ | print(">> SINBEGRE") | ||
+ | return np.linalg.solve(e,f)[0][0] | ||
+ | else: return None | ||
+ | |||
+ | def swap(liste): | ||
+ | if (len(liste) == 2): | ||
+ | zw = liste[0] | ||
+ | liste[0] = liste[1] | ||
+ | liste[1] = zw | ||
+ | return liste | ||
+ | else: return None | ||
+ | |||
+ | def genMesh(liste): | ||
+ | # alle Möglichen Geraden berechnen und in eine Liste speichern | ||
+ | if (len(liste) > 2): | ||
+ | gerListe = [] | ||
+ | for i in range(0, len(liste)): | ||
+ | for j in range(i+1, len(liste)): | ||
+ | gerListe.append(Gerade(liste[i], liste[j]-liste[i], [i,j])) | ||
+ | |||
+ | # alle kreuzenden markieren | ||
+ | for i in range(0, len(gerListe)): | ||
+ | for j in range(i+1, len(gerListe)): | ||
+ | z = schnittTest(gerListe[i], gerListe[j]) | ||
+ | print(z) | ||
+ | if (z != None): | ||
+ | if (z < 1 and z > 0): | ||
+ | gerListe[i].kreuzt = True | ||
+ | gerListe[j].kreuzt = True | ||
+ | |||
+ | # alle markierten löschen | ||
+ | i = 0 | ||
+ | while (i < len(gerListe)): | ||
+ | if (gerListe[i].kreuzt == True): | ||
+ | del gerListe[i] | ||
+ | i = i-1 | ||
+ | else: i = i+1 | ||
+ | |||
+ | # erste gerade der Liste auswählen, von Gerade zu gerade springen und | ||
+ | # die Indices speichern | ||
+ | face = [] | ||
+ | |||
+ | for i in range(0, len(gerListe)): | ||
+ | if (len(face) > 0): | ||
+ | if (gerListe[i].kerne[0] in face): | ||
+ | swap(gerListe[i].kerne) | ||
+ | face.append(gerListe[i].kerne[0]) | ||
+ | print(face) | ||
+ | for i in range(0, len(gerListe)): | ||
+ | print(gerListe[i].kerne) | ||
+ | |||
+ | face = [] | ||
+ | |||
+ | #swap(gerListe[1].kerne) | ||
+ | #gerListe.append(gerListe[1]) | ||
+ | #del gerListe[1] | ||
+ | |||
+ | for i in range(0, len(gerListe)): | ||
+ | print("Gerade",i,"Kerne",gerListe[i].kerne) | ||
+ | |||
+ | current = 0 | ||
+ | while (True): | ||
+ | face.append(gerListe[current].kerne[0]) | ||
+ | if (gerListe[current].kerne[1] != gerListe[0].kerne[0]): | ||
+ | for i in range(0, len(gerListe)): | ||
+ | if (gerListe[current].kerne[1] == gerListe[i].kerne[0]): | ||
+ | current = i | ||
+ | break | ||
+ | else: break | ||
+ | print(face) | ||
+ | |||
+ | generateObj("Fläche", liste, [face]) | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | # CODE | ||
+ | |||
+ | |||
+ | # Punkte einlesen | ||
+ | #liste = [np.array([1,0,0]), np.array([1,4,0]), np.array([2,3.6,0]), np.array([3,3,0]), np.array([4,2,0]), np.array([0,2,0]), np.array([4,1,0]), np.array([2,0,0])] | ||
+ | liste = [np.array([0,0,1]), np.array([0,2,0]), np.array([0,-2,1]), np.array([0,-3,-2]), np.array([0,-5,-1]), np.array([0,-5,0])] | ||
+ | for i in range(0, len(liste)): | ||
+ | zeichnePunkt(liste[i]) | ||
+ | |||
+ | genMesh(liste) | ||
+ | </code> |