Seite 1 von 1

Umkreis von Dreieck

Verfasst: Dienstag 8. Juni 2010, 17:08
von CoB
hiho,

ich will mit hilfe des tkinter moduls einen Kreis um die 3 Spitzen eines Dreiecks zeichnen. Wie geht das??


hier mein code:

Code: Alles auswählen

from Tkinter import *
from math import *
blatt = Canvas(width=800,height=800,bg='white')
blatt.pack()
#Eingaben
x1=input("x-Koordinate von Punkt A")
y1=input("Y-Koordinate von Punkt A")
x2=input("x-Koordinate von Punkt B")
y2=input("Y-Koordinate von Punkt B")
x3=input("x-Koordinate von Punkt C")
y3=input("Y-Koordinate von Punkt C")

#Dreieck
ab=blatt.create_line(x1,y1,x2,y2)
bc=blatt.create_line(x2,y2,x3,y3)
ca=blatt.create_line(x3,y3,x1,y1)

#Mittelpunkte
def mitte(c,d):
    mittelwert=(c+d)/2.0
    return mittelwert

#Steigung
def steigung(a1,b1,a2,b2):
    steigung = (1.0*b2-b1)/(a2-a1)
    return steigung

#Y-Abschnitt
def y1bschnitt(x,y,m):
    abschnitt=1.0*y-m*x
    return abschnitt

#Mittelsenkrechte berechnen
def gibMittelsenkrechte(xa,ya,xb,yb):
    global msenkrechte
    global bsenkrechte
    if ya==yb:# if paralel x:
        xm=mitte(xa,xb)
        print "-----------------------------------------------------"
        print 'Die Mittelsenkrechte hat die Gleichung x=', xm
        strecke=blatt.create_line(xm,0,xm,400)
    elif xa==xb:#if paralel y:
        ym=mitte(ya,yb)
        print "-----------------------------------------------------"
        print 'Die Mittelsenkrechte hat die Gleichung y=', ym
        strecke=blatt.create_line(0, ym, 400, ym)
    else:# andere:
        xm=mitte(xa,xb)
        ym=mitte(ya,yb)
        mstrecke=steigung (xa,ya,xb,yb)
        msenkrechte=-1.0/mstrecke
        bsenkrechte=yAbschnitt(xm,ym,msenkrechte)
        print "-----------------------------------------------------"
        print 'Die Mittelsenkrechte hat die Gleichung y=',msenkrechte, '*x+',bsenkrechte
        strecke=blatt.create_line(xm+800,msenkrechte*(xm+800)+bsenkrechte,xm-800,msenkrechte*(xm-800)+bsenkrechte)
#m+b
m=steigung(x1,y1,x3,y3)
b=y1bschnitt(x1,y1,m)

#Mittelsenkrechten:
def testDreieck():
    if x1==x2 and x2==x3:#alle 3 paralel
        print 'Das ist kein Dreieck!'
    else:#ok
        m=steigung(x1,y1,x3,y3)
        b=yAbschnitt(x1,y1,m)
        if y2==m*x2+b:
            print 'Das ist kein Dreieck!'
        else:
            gibMittelsenkrechte(x1,y1,x2,y2)
            ms1=msenkrechte
            bs1=bsenkrechte
            gibMittelsenkrechte(x1,y1,x3,y3)
            ms2=msenkrechte
            bs2=bsenkrechte
            gibMittelsenkrechte(x2,y2,x3,y3)
            xs=(bs1-bs2)/(ms1-ms2)
            ys=ms1*xs+bs1
#Scheitelpunkte
testDreieck()
print "----------------------------------------------------"
print "Scheitelpunkt(x)=",xs,"Scheitelpunkt(y)=",ys

#Kreis
#1.Abstand von Scheitelpkt zu A
radius=sqrt(((ys-y1)*(ys-y1))+((xs-x1)*(xs-x1)))
ich hoffe es kann mir nun einer sagen, wie ich jetzt meinen Kreis um das Dreieck bekomme und vllt sogar den code posten ;)

Mfg

Re: Umkreis von Dreieck

Verfasst: Dienstag 8. Juni 2010, 17:28
von EyDu

Re: Umkreis von Dreieck

Verfasst: Dienstag 8. Juni 2010, 17:31
von DaMutz

Code: Alles auswählen

x-Koordinate von Punkt A4
Y-Koordinate von Punkt A4
x-Koordinate von Punkt B4
Y-Koordinate von Punkt B10
x-Koordinate von Punkt C10
Y-Koordinate von Punkt C6
Traceback (most recent call last):
  File "umkreis_von_dreieck.pyw", line 80, in <module>
    testDreieck()
  File "umkreis_von_dreieck.pyw", line 66, in testDreieck
    b=yAbschnitt(x1,y1,m)
NameError: global name 'yAbschnitt' is not defined
Du willst ja wohl nicht das wir für dich dein Problem lösen, wenn dein Code schon gar nicht läuft...
Dein gemische von Code und Funktionsdefinitionen ist recht unübersichtlich.

Den Umkreismittelpunkt kannst du laut Wikipedia mit den Mittelsenkrechten bestimmen. Den Radius ist dan auch kein Problem mehr.

Re: Umkreis von Dreieck

Verfasst: Dienstag 8. Juni 2010, 17:32
von numerix
Warum fängst du einen neuen Thread - du hast doch hier schon einmal gefragt und Antworten bekommen. Das ist kein Programmierproblem, sondern ein mathematisches. Nimm dir Papier und Bleistift und entwickle ein Berechnungsverfahren, das dir anhand der Eckpunktkoordinaten den Mittelpunkt des Umkreises liefert. Den Kreis dann zu zeichnen, ist das kleinste Problem.

Re: Umkreis von Dreieck

Verfasst: Dienstag 8. Juni 2010, 17:38
von CoB
hmm der script läuft bei mir problemlos...

Code: Alles auswählen

>>> 
x-Koordinate von Punkt A100
Y-Koordinate von Punkt A200
x-Koordinate von Punkt B200
Y-Koordinate von Punkt B100
x-Koordinate von Punkt C50
Y-Koordinate von Punkt C150
-----------------------------------------------------
Die Mittelsenkrechte hat die Gleichung y= 1.0 *x+ 0.0
-----------------------------------------------------
Die Mittelsenkrechte hat die Gleichung y= -1.0 *x+ 250.0
-----------------------------------------------------
Die Mittelsenkrechte hat die Gleichung y= 3.0 *x+ -250.0
----------------------------------------------------
Scheitelpunkt(x)= -125.0 Scheitelpunkt(y)= -125.0
übersichtlichkeit naja hast recht ;)
naja mit der mathematik.... ich komm halt nicht damit klar, das ganze mit in koordinaten umzusetzen.
wie gesagt, wäre nett wenn mir einer einfach den script dafür posten könnte

Mfg

Re: Umkreis von Dreieck

Verfasst: Dienstag 8. Juni 2010, 17:52
von DaMutz
du hast ja die Gleichungen. Diese musst du nur noch lösen. Dies geschieht mit dem Gaußsches_Eliminationsverfahren Wie dies im detail funktioniert weiss ich auch nicht, aber dies wird bei Wikipedia sicher gut erklärt, oder du findest ein fertiges Skript...

Und dein Code funktioniert definitiv nicht den 'yAbschnitt != y1bschnitt'. Aber wenn man diesen Fehler behebt kommt der nächste:

Code: Alles auswählen

NameError: global name 'msenkrechte' is not defined
und damit ist mir die Fehlersuche definitiv verleidet.

Re: Umkreis von Dreieck

Verfasst: Dienstag 8. Juni 2010, 17:55
von CoB
ähhhm doch?!?

Code: Alles auswählen

msenkrechte=-1.0/mstrecke
in line 51

Re: Umkreis von Dreieck

Verfasst: Dienstag 8. Juni 2010, 18:04
von BlackJack
@CoB: Die Zeile muss nicht nur irgendwo stehen, sondern auch ausgeführt werden. Die Zeile wird aber nur ausgeführt, wenn der ``else``-Zweig genommen wird.

Mal ganz davon abgesehen, dass ``global`` zu unübersichtlichem Quelltext und nicht voneinander unabhängigen Funktionen führt und deshalb nicht verwendet werden sollte.

Re: Umkreis von Dreieck

Verfasst: Dienstag 8. Juni 2010, 18:08
von CoB
edit: ja ok, man sollte schon die koordinaten von einem Dreieck eingeben....
und ich bitte euch jetzt einfach falls möglich mir einen funktionierenden vorschlag/script für den umkreis zu posten und nicht an meinen fehler zu suchen, die im moment keinen stören...

Mfg

Re: Umkreis von Dreieck

Verfasst: Dienstag 8. Juni 2010, 18:10
von numerix
CoB hat geschrieben:wie gesagt, wäre nett wenn mir einer einfach den script dafür posten könnte
Wenn die Bezahlung stimmt, ließe sich da sicher was machen ... :D