====== Dritter Arbeits-Termin ====== **12.12.2019** Wir haben heute versucht, die Methode für Schnittpunkte in unser Hauptprogramm zu implementieren, was leider noch nicht funktioniert hat. Es wurden mehrere andere Probleme aufgeworfen, zum Beispiel dass Geraden nicht aus der Geradenliste gelöscht werden, selbst wenn sie als sich schneidend erkannt wurden. Zu nächster Woche haben wir uns vorgenommen, eine Methode zu schreiben, die testen kann, ob ein Punkt x auf einer Geraden g liegt. # -*- coding: utf-8 -*- """ Created on Thu Nov 28 15:22:24 2019 @author: Lukas """ import numpy as np import math from math import * import turtle import random as rn from scipy.spatial import distance turtle.speed(100) turtle.ht() # anzahlKerne = 4 class Gerade(object): ov = (0,0,0) #Ortsvektor rv = (0,0,0) #Richtungsvektor l = 0; #Laenge ### Zuerst sollen n mal random punkte (x,y) in einem Feld maxx*maxy generiert werden und einer Liste zugewiesen werden def generiereKernListe(n,maxx,maxy,abstand): liste=[] for c in range(n): x = rn.randint(-maxx,maxx)#rn.uniform(0,maxx) y = rn.randint(-maxy,maxy)#rn.uniform(0,maxy) #if (len(liste) > 0): # try: # for x in len(liste): # if (distance.euclidean(liste[x],(x,y)) < abstand == True): # print("good") # else: # raise Exception("Fehler") # liste.append((x,y)) # except: # x = rn.uniform(0,maxx) # y = rn.uniform(0,maxy) # continue # break #else: liste.append((x,y)) liste.append((x,y)) return liste ker = generiereKernListe(anzahlKerne,300,300,0.1) print("Kerne : ",ker) ### Zunächst werden Funktionen deklariert, mit deren Hilfe das Programm Linien zwischen den Punkten untersucht 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): 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): #Wir erwarten Start- und Endpunkt eines Vektors # errechnet die Laenge eines Vektors v1 = np.array([0,0]) math.sqrt((abs(v1[0]-v2[0])**2)+(abs(v1[1]-v2[1])**2)) def vektorNorm(v): return(1/sqrt(v[0]**2+v[1]**2)*v) def punktAufG(p, g): return np.roots([g.rv[0],g.ov[0]-p[0]]) #z = np.zeros(2) #print(np.array([1,2])) a = (0,0) b = (30,30) c = (50,0) d = (50,70) #Linien = [a,b,c,d] #zeichneLinie(a,b) #zeichneLinie(c,d) #print(richtungLinie(c,b)) listeGeraden = [] for i in range(anzahlKerne): for k in range(anzahlKerne): if (i!=k): #zeichneLinie(ker[i],ker[k]) #name = str(i)+" und "+str(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) #print(name) print(listeGeraden) print(listeGeraden[0].ov) print(listeGeraden[0].rv) print(listeGeraden[0].rv[0]) #print("Gerade 0 und 1 schneiden sich bei",schnittTest(listeGeraden[0],listeGeraden[49])) counter = 0 schnitt = 0 #testet, welche geraden gelöscht werden sollen for i in range(0, len(listeGeraden)): for k in range(0, len(listeGeraden)): counter=counter+1 # parallele Richtungsvektoren aussortieren MUSS NOCH GEMACHT WERDEN #if (vektorNorm(listeGeraden[i].rv) == vektorNorm(listeGeraden[k].rv)): # try: # punktAufG(listeGerade[i].ov,listeGeraden[k]) # dann testen ob ov des einen auf der anderten gerade liegt # Werte der gerade ausgeben print("\ni.rv",listeGeraden[i].rv) print("i.ov",listeGeraden[i].ov) print("k.rv",listeGeraden[k].rv) print("k.ov",listeGeraden[k].ov) # schneiden sich die Linien? z = schnittTest(listeGeraden[i],listeGeraden[k]) print(z) if (z[0]<1 and z[0]>0 and z[1]<1 and z[1]>0): schnitt=schnitt+1 #del listeGeraden[i] #ACHTUNG: EIGENTLICH SOLL DIE LÄNGERE GELÖSCHT WERDEN #if (listeGeraden[i].l < listeGeraden[k].l): # del listeGeraden[k] #else: del listeGeraden[i] print(counter, " Schnitte : ", schnitt) print(listeGeraden) for i in range(0, len(listeGeraden)): zeichneLinie(listeGeraden[i].ov,listeGeraden[i].ov+listeGeraden[i].rv) #zeichneLinie(ker[0],ker[1]) #zeichneLinie(ker[1],ker[2]) #zeichneLinie(ker[2],ker[0]) #zeichneLinie((10,40),(50,150)) ### das eigentlihe programm turtle.done() [Hung] Code für Normieren von Vektoren import numpy as np from math import sqrt v=np.array([3,4]) v1=np.array([4,3]) print(1/sqrt(v[0]**2+v[1]**2)*v) print(1/sqrt(v1[0]**2+v1[1]**2)*v) ---- ====== Code - Schnipsel ====== [Lukas] punktAufLinie - Methode 18.12.2019 # liegt punkt p auf der geraden g = o + m*r? def punktAufLinie(p,o,r): if(np.array_equal(p,o)): return True 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 ----