19.12.2019
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
Wir werden nun versuchen, statt der Zufallskerne eine Kernliste festzulegen, innerhalb derer beide Fehler auftauchen und anhand dieser die beiden Fehler auszumerzen.
Außerdem haben wir unseren Code aufgeräumt und unnötiges gelöscht, sodass wir mit sauberem Code in das neue Jahr starten können.
# -*- 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()
'Merry Christmas 🎅🎄🎁' wünscht https://emojipedia.org/christmas/