Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1920:cd_04

Code: Arbeitstermin 04

19.12.2019

<< | Home | Text | >>

Aktuelle Programmversion Stand 14:39 Uhr

# -*- 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()
ws1920/cd_04.txt · Zuletzt geändert: 2020/03/25 16:56 von Zetraeder