Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1920:03_arbeitstermin

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

ws1920/03_arbeitstermin.txt · Zuletzt geändert: 2020/02/09 19:51 von Zetraeder