Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1920:04_arbeitstermin

Vierter Arbeits-Termin

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

  1. einzelne Linien fehlen ohne ersichtlichen Grund FIXME
  2. Linien kreuzen sich trotz Schnittpunkt-Ermittlung FIXME

Wir werden nun versuchen, statt der Zufallskerne eine Kernliste festzulegen, innerhalb derer beide Fehler auftauchen und anhand dieser die beiden Fehler auszumerzen.

(bisheriger Generationsstand)

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/


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