Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
ws1920:arbeitstermin_04 [2020/02/09 21:01] Zetraeder [Vierter Arbeits-Termin] |
ws1920:arbeitstermin_04 [2020/03/25 16:22] (aktuell) Zetraeder |
||
---|---|---|---|
Zeile 4: | Zeile 4: | ||
**19.12.2019** | **19.12.2019** | ||
- | [[ws1920:arbeitstermin_03|<<]] | [[ws1920:scutoids|Home]] | [[ws1920:arbeitstermin_05|>>]] | + | [[ws1920:arbeitstermin_03|<<]] | [[ws1920:scutoids|Home]] | [[ws1920:cd_04|Code]] | [[ws1920:arbeitstermin_05|>>]] |
Heute haben wir uns damit beschäftigt, die Schnittpunkt-Erkennung zu integrieren und mehr oder weniger alle Linien zu löschen, die nicht in unser Diagramm passen. Hierzu haben wir in rot alle möglichen Verbindungen zwischen den Kernen dargestellt und in dick schwarz diejenigen Linien überzeichnet, die letztendlich stehen bleiben würden. Leider gibt es hierbei noch zwei populäre Fehler | Heute haben wir uns damit beschäftigt, die Schnittpunkt-Erkennung zu integrieren und mehr oder weniger alle Linien zu löschen, die nicht in unser Diagramm passen. Hierzu haben wir in rot alle möglichen Verbindungen zwischen den Kernen dargestellt und in dick schwarz diejenigen Linien überzeichnet, die letztendlich stehen bleiben würden. Leider gibt es hierbei noch zwei populäre Fehler | ||
Zeile 18: | Zeile 18: | ||
'Merry Christmas 🎅🎄🎁' wünscht https://emojipedia.org/christmas/ | 'Merry Christmas 🎅🎄🎁' wünscht https://emojipedia.org/christmas/ | ||
- | |||
- | Aktueller Code: | ||
- | |||
- | <code python> | ||
- | |||
- | # -*- coding: utf-8 -*- | ||
- | """ | ||
- | Created on Thu Dec 19 15:31:18 2019 | ||
- | |||
- | @author: Lukas | ||
- | """ | ||
- | |||
- | import numpy as np | ||
- | import math | ||
- | import turtle | ||
- | import random as rn | ||
- | |||
- | turtle.speed(100) | ||
- | turtle.ht() | ||
- | |||
- | # VARIABLEN | ||
- | |||
- | anzahlKerne = 6 | ||
- | |||
- | |||
- | |||
- | # KLASSEN | ||
- | |||
- | class Gerade(object): | ||
- | ov = (0,0,0) #Ortsvektor | ||
- | rv = (0,0,0) #Richtungsvektor | ||
- | l = 0; #Laenge | ||
- | |||
- | |||
- | |||
- | # METHODEN | ||
- | | ||
- | def generiereKernListe(n,maxx,maxy,abstand): | ||
- | # generiert eine Liste von Punkten im R^2 | ||
- | liste=[] | ||
- | for c in range(n): | ||
- | x = rn.randint(-maxx,maxx)#rn.uniform(0,maxx) | ||
- | y = rn.randint(-maxy,maxy)#rn.uniform(0,maxy) | ||
- | | ||
- | liste.append((x,y)) | ||
- | return liste | ||
- | |||
- | def zeichneLinie(start,ende): | ||
- | # zeichnet eine Linie zwischen start und ende mithilfe einer turtle | ||
- | turtle.penup() | ||
- | turtle.goto(start) | ||
- | turtle.pendown() | ||
- | turtle.goto(ende) | ||
- | | ||
- | def richtungLinie(start,ende): | ||
- | # gibt den Richtungsvektor von start nach ende aus | ||
- | richtung = np.subtract(ende,start) | ||
- | return richtung | ||
- | |||
- | def schnittTest(g1,g2): | ||
- | # testetm ob g1 und g2 sich schneiden | ||
- | return np.linalg.solve([[g2.rv[0],-g1.rv[0]],[g2.rv[1],-g1.rv[1]]],[[g1.ov[0]-g2.ov[0]],[g1.ov[1]-g2.ov[1]]]) | ||
- | |||
- | def vektorLänge(v2): | ||
- | # errechnet die Laenge eines Vektors | ||
- | v1 = np.array([0,0]) | ||
- | return math.sqrt((abs(v1[0]-v2[0])**2)+(abs(v1[1]-v2[1])**2)) | ||
- | |||
- | def vektorNorm(v): | ||
- | # normiert einen Vektor | ||
- | return(1/math.sqrt(v[0]**2+v[1]**2)*v) | ||
- | | ||
- | def punktAufLinie(p,o,r): | ||
- | # liegt punkt p auf der geraden g = o + m*r? | ||
- | if(np.array_equal(p,o)): return False | ||
- | elif(np.array_equal(r,[0,0])): return False | ||
- | elif(r[1] == 0): | ||
- | a = (p[0]-o[0])/r[0] | ||
- | if (o[1]+a*r[1] == p[1]): | ||
- | if(a<1 and a>0): return True | ||
- | else: return False | ||
- | else: return False | ||
- | else: | ||
- | a = (p[1]-o[1])/r[1] | ||
- | if (o[0]+a*r[0] == p[0]): | ||
- | if(a<1 and a >0): return True | ||
- | else: return False | ||
- | else: return False | ||
- | |||
- | |||
- | |||
- | # MAIN | ||
- | | ||
- | # genriert die Liste der Kerne | ||
- | ker = generiereKernListe(anzahlKerne,300,300,0.1) | ||
- | print("Kerne : ",ker) | ||
- | |||
- | # ** Fehlerhafte Kernliste zum Testen!! ** | ||
- | #ker = [(-151, 245), (170, 0), (-78, 171), (-48, 122), (-6, -199), (-13, -162)] | ||
- | #ker = [(-260, 261), (271, 107), (-127, -218), (239, -245), (181, 256), (115, -293)] | ||
- | |||
- | |||
- | listeGeraden = [] | ||
- | |||
- | # generiert alle Linien zwischen den Kernen | ||
- | for i in range(0,anzahlKerne): | ||
- | for k in range(i,anzahlKerne): | ||
- | if (i!=k): | ||
- | | ||
- | eineGerade = Gerade() | ||
- | eineGerade.ov = np.array(ker[i]) | ||
- | eineGerade.rv = np.subtract(ker[k],ker[i]) | ||
- | eineGerade.l = vektorLänge(eineGerade.rv) | ||
- | | ||
- | listeGeraden.append(eineGerade) | ||
- | |||
- | # zeichnet alle Linien zwischen allen Punkten | ||
- | turtle.color("red") | ||
- | for i in range(0, len(listeGeraden)): | ||
- | zeichneLinie(listeGeraden[i].ov,listeGeraden[i].ov+listeGeraden[i].rv) | ||
- | turtle.color("black") | ||
- | turtle.pensize(2) | ||
- | |||
- | |||
- | schnitt = 0 | ||
- | l = len(listeGeraden) | ||
- | |||
- | #testet, welche geraden gelöscht werden sollen | ||
- | for i in range(0, l): | ||
- | for k in range(i+1, l): | ||
- | z = [0,0] | ||
- | if(i!=k): | ||
- | #for k in range(i+1, l): | ||
- | try: | ||
- | # schneiden sich die Linien? | ||
- | z = schnittTest(listeGeraden[i],listeGeraden[k]) | ||
- | | ||
- | if (z[0]<1 and z[0]>0 and z[1]<1 and z[1]>0): | ||
- | print("\n\n ",i," OV ",listeGeraden[i].ov," ",i," RV ",listeGeraden[i].rv," ",k," OV ",listeGeraden[k].ov," ",k," RV ",listeGeraden[k].rv) | ||
- | print("vergleiche ",i," und ", k) | ||
- | print("Schnitt\n",z) | ||
- | schnitt=schnitt+1 | ||
- | #del listeGeraden[i] #ACHTUNG: EIGENTLICH SOLL DIE LÄNGERE GELÖSCHT WERDEN | ||
- | | ||
- | print("laenge a : ",listeGeraden[i].l," laenge b : ",listeGeraden[k].l,"\n",10*" - ") | ||
- | if (listeGeraden[i].l < listeGeraden[k].l): | ||
- | del listeGeraden[k] | ||
- | else: | ||
- | del listeGeraden[i] | ||
- | except: | ||
- | #print("# end of this iteration") | ||
- | break | ||
- | |||
- | print("Schnitte : ", schnitt) | ||
- | |||
- | for i in range(0, len(listeGeraden)): | ||
- | zeichneLinie(listeGeraden[i].ov,listeGeraden[i].ov+listeGeraden[i].rv) | ||
- | |||
- | |||
- | |||
- | turtle.done() | ||
- | |||
- | </code> | ||
---- | ---- | ||