Geometrie(Berechnung von Dreiecken)

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

Hallo an alle!

Ich müsste von einem normalen Dreieck A B C, die drei Mittelsenkrechten und deren Schnittpunkt berechnen, sowie den Umkreis der drei Punkte einzeichnen. Dafür wiederum bräuchte ich als erstes die Mittelpunkte der Dreiecksseiten. Als nächstes müsste ich dann den Schnittpunkt berrechnen, wozu ich wiederum die Steigung brache. Die Mittelsenkrechten sollen als Grade eingezeichnet werden. Um den Umkreis zu zeichnen, muss ich zuerst den Radius r berechnen. Dieser ist gleich dem Abstand des Schnittpunktes S zu einem der drei Eckpunkte, z. B. A. Es gilt (Pythagoras) . Wennich r habe, muss ich den Kreis in ein Quadrat mit der Seitenlänge 2r einbetten, um ihn zu zeichnen.

Jetzt ist meine Frage wie ich das mit den Tkinter-Modul aufschreiben muss....
Hierbei würde ich gerne anmerken, dass ich am liebsten keine kommplette Lösung haben will, sonder nur ein paar Hinweise auf den Lösungsweg ;)


Mfg,
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Was Tkinter angeht: Deine gesamte Zeichnung besteht ja - abgesehen vom Umkreis selbst - nur aus Strecken. Auf einem Tkinter-Canvas kannst du Strecken (im Grunde sogar Polygonzüge) zeichnen (mit der create_line()-Methode), wenn du die entsprechenden Eckpunkte kennst. Einen Kreis zeichnest du mit create_oval() über die Eckpunkte des umschreibenden Quadrats. Kennst du Kreismittelpunkt und Radius, sind die einfach zu ermitteln.

Der Rest ist Mathematik. Wenn du mit Vektoren vertraut bist, ist das IMHO der einfachste Weg. Ansonsten geht es aber auch elementargeometrisch über Geradengleichungen der Form y=mx+n. Dann musst du allerdings vertikale Strecken bzw. Geraden extra behandeln.
CoB
User
Beiträge: 11
Registriert: Montag 10. Mai 2010, 09:56

ok, erstmal danke für deine schnelle Antwort.

"Vektoren", sowie "IMHO" sind für mich Fremdwörter....

Gibt es einen Befehl, um direkt eine Grade zu zeichen, oder muss ich erst die Steigung berechnen, um diese zu zeichnen?
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

IMHO = „In My Humble/Honest Opinion“


einfach mal googeln ;)
CoB
User
Beiträge: 11
Registriert: Montag 10. Mai 2010, 09:56

Hmmm ein weiteres Prob: Wenn ich das Programm starten will kommt da, dass es kein Modul names Tkinter gibt.... Wie/wo muss ich das installieren?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

CoB hat geschrieben:Hmmm ein weiteres Prob: Wenn ich das Programm starten will kommt da, dass es kein Modul names Tkinter gibt.... Wie/wo muss ich das installieren?
Am besten ist es (immer!), wenn du die original Fehlermeldung und den zugehörigen Code(ausschnitt) zeigst.

Eine mögliche Fehlerquelle hier: Du verwendest Python 2.x und hast Tkinter statt tkinter geschrieben ...
CoB
User
Beiträge: 11
Registriert: Montag 10. Mai 2010, 09:56

ok danke funktioniert jetzt :D
CoB
User
Beiträge: 11
Registriert: Montag 10. Mai 2010, 09:56

Hmmmm wieso wird wenn ich f5 drücke, nicht das Fenster geöffnet? Es passiert einfach garnichts -.-

Code: Alles auswählen

from tkinter import *
blatthoehe=input("blatthoehe")
blattbreite=input("blattbreite")
blatt = Canvas(width=blattbreite,height=blatthoehe,bg='white')
blatt.pack()

x1=input("erste X-Koordinate")
x2=input("zweite X-Koordinate")
y1=input("erste Y-Koordinate")
y2=input("zweite Y-Koordinate")
z1=input("erste Z-Koordinate")
z2=input("zweite Z-Koordinate")

def Dreieck():
    blatt.create_line(x1,x2,y1,y2)
    blatt.create_line(x1,x2,z1,z2)
    blatt.create_line(z1,z2,y1,y2)
Dreieck()
    
Hier in der Konsole:

Code: Alles auswählen

blatthoehe500
blattbreite500
erste X-Koordinate312
zweite X-Koordinate421
erste Y-Koordinate134
zweite Y-Koordinate135
erste Z-Koordinate193
zweite Z-Koordinate376
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du wirst es schwer haben, ein Tkinter-Programm zu schreiben, ohne mit den Grundlagen(!) von Tkinter vertraut zu sein.

http://infohost.nmt.edu/tcc/help/pubs/tkinter/
http://effbot.org/tkinterbook/tkinter-index.htm
CoB
User
Beiträge: 11
Registriert: Montag 10. Mai 2010, 09:56

das soltle ich eig hinbekommen, das Problem is halt, es öffnet sich garkein Fenster, wie es im normalfall sein sollte?!?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

CoB hat geschrieben:das soltle ich eig hinbekommen, das Problem is halt, es öffnet sich garkein Fenster, wie es im normalfall sein sollte?!?
Wenn du es hinbekämst, würde dein Programm laufen ... :D
Der gezeigte Code ist so überhaupt nicht lauffähig, und wenn du das nicht auf den ersten Blick selbst feststellen kannst, dann fehlen dir die Tkinter-Grundlagen.
CoB
User
Beiträge: 11
Registriert: Montag 10. Mai 2010, 09:56

Bin ja grad dabei die zu lernen...
und es läuft auch alles, wenn ich das auf nen Pc von nem Freund abspiele, nur auf meinem net -.-
problembär

Brauchte neulich mal'n Dreieck:

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: iso-8859-1 -*-

import math

import tkinter
from tkconstants import *
 
# Screen resolution:

RESX = 640
RESY = 480

class TkWindow:

    def __init__(self):

        self.mw = tkinter.Tk()
        self.mw.option_add("*font", ("Arial", 12, "normal"))
        self.mw.title("Triangle")
        self.mw.geometry("+175+90")

        self.cv = tkinter.Canvas(self.mw,
                                 bg = "white",
                                 width = RESX,
                                 height = RESY)

        self.cv.pack()

        self.drawTriangle()

        self.btn = tkinter.Button(self.mw,
                                  text = "Ok",
                                  command = self.mw.destroy)

        self.btn.bind(sequence = "<Return>", func = self.bindFunc)
        self.btn.focus()

        self.btn.pack(side = RIGHT,
                      padx = 10,
                      pady = 10)

        self.mw.mainloop()


    def bindFunc(self, a):
        self.mw.destroy()


    def drawTriangle(self):

        w = 160

        a = (240, 320)
        b = (a[0] + w / 2, a[1] - math.floor(w / 2 / math.cos(math.radians(45))))
        c = (a[0] + w, a[1])

        self.cv.create_line(a, c)
        self.cv.create_line(a, b)
        self.cv.create_line(b, c)


if __name__ == "__main__":
   app = TkWindow()
War jetzt für 2.4; hab' Tkinter in tkinter umbenannt, Tkconstants in tkconstants. Bei letzterem bin ich bzgl. 3.x nicht sicher.
Ach so, der "bindFunc()"-Kram ist (persönlich) veraltet (objektiv schon immer (lambda)); hatte aber keinen Bock, das zu ändern.

However

P.S: Ist der Code nur bei mir so übergroß?
Antworten