Umkreis von Dreieck

Fragen zu Tkinter.
Antworten
CoB
User
Beiträge: 11
Registriert: Montag 10. Mai 2010, 09:56

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das Leben ist wie ein Tennisball.
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
CoB
User
Beiträge: 11
Registriert: Montag 10. Mai 2010, 09:56

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
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

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.
CoB
User
Beiträge: 11
Registriert: Montag 10. Mai 2010, 09:56

ähhhm doch?!?

Code: Alles auswählen

msenkrechte=-1.0/mstrecke
in line 51
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.
CoB
User
Beiträge: 11
Registriert: Montag 10. Mai 2010, 09:56

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
Zuletzt geändert von CoB am Dienstag 8. Juni 2010, 18:15, insgesamt 1-mal geändert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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
Antworten