Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws1920:cd_10

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
ws1920:cd_10 [2020/03/25 16:49]
Zetraeder angelegt
ws1920:cd_10 [2020/03/25 16:51] (aktuell)
Zetraeder
Zeile 1: Zeile 1:
 ----- -----
  
-====== ​Aktueller ​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>​
ws1920/cd_10.1585151351.txt.gz · Zuletzt geändert: 2020/03/25 16:49 von Zetraeder