Winkelberechnung Messfehler oder Programmfehler?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
init-0
User
Beiträge: 38
Registriert: Samstag 22. Januar 2011, 18:46

Hallo,

Ich versuche winkel von vielecken zu berechnen. dafür hab ich die funktion:

Code: Alles auswählen

from math import atan, pi

def angle(A,B,C):
    try:
        gradAB = (A[1]-B[1])/(A[0]-B[0])
        gradAB = atan(gradAB)
    except ZeroDivisionError:
        gradAB = 0.5*pi

    try:
        gradBC = (C[1]-B[1])/(C[0]-B[0])
        gradBC = atan(gradAB)
    except ZeroDivisionError:
        gradBC = 0.5*pi

    if B[0] > C[0]:
        gradBC = pi + gradBC
    if B[0] > A[0]:
        gradAB = pi + gradAB

    return (gradBC-gradAB)%(2*pi)
Der winkel soll, wenn man von A über B zu C die Line abgeht auf der rechten seite sein.
Hier hab ich aber ein problem von dem ich nicht weiß ob das ein messfehler oder ein fehler in der funktion ist.
Wenn ich die winkel von dem Dreieck A(0,0) B(2,-5) und C(-3,-4) addiere habe ich 4,5% abweichung von pi:

Code: Alles auswählen

>>> for seq in [[(0.0, 0.0), (2.0, -5.0), (-3.0, -4.0)], [(2.0, -5.0), (-3.0, -4.0), (0.0, 0.0)], [(-3.0, -4.0), (0.0, 0.0), (2.0, -5.0)]]:
	print angle(*seq)

	
0.318230501759
0.00250551903374
2.96198973925
>>> 2.96198973925+0.00250551903374+0.318230501759
3.28272576004274
>>> 3.28272576004274/pi
1.0449240630518024
init-0
User
Beiträge: 38
Registriert: Samstag 22. Januar 2011, 18:46

Die neue variante geht auch nicht.

Code: Alles auswählen

def angle(A,B,C):
    pv1 = [A[0]-B[0], A[1]-B[1]]
    pv2 = [C[0]-B[0], C[1]-B[1]]
    v1 = math.atan2(pv1[1], pv1[0])
    v2 = math.atan2(pv2[1], pv1[0])
    return v1-v2
Da kommt auch nicht pi raus

Code: Alles auswählen

>>> for seq in [[(0.0, 0.0), (2.0, -5.0), (-3.0, -4.0)], [(2.0, -5.0), (-3.0, -4.0), (0.0, 0.0)], [(-3.0, -4.0), (0.0, 0.0), (2.0, -5.0)]]:
        print angle(*seq)

        
-0.726642340682
-0.872136502073
-0.103081608523
>>> sum([-0.10308160852270021, -0.7266423406817255, -0.8721365020734334])
-1.701860451277859
>>> -1.701860451277859/pi
-0.5417190065469499
Was mach ich denn falsch?
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Das hier sieht irgendwie etwas anders aus...
Lass dir mal die einzelnen Strecken zwischen den AB, AC und BC ausgeben.

Ich habe noch mal weitergebuddelt. Schau dir mal math.hypot an.
I'm not getting paid for being Mr. Nice Guy!
init-0
User
Beiträge: 38
Registriert: Samstag 22. Januar 2011, 18:46

Beim tangenssatz hab ich immer 2 winkel in der gleichung. Da ich keinen von beiden kenne kann ich damit doch höchstens das verhältnis ausrechnen.
Und für die Hypotenuse brauche ich ein Rechtwinkliges dreieck. Dann müsste ich erst ha, hb und hc berechnen. Gibts nicht noch eine einfachere Methode?
init-0
User
Beiträge: 38
Registriert: Samstag 22. Januar 2011, 18:46

Habs mit dem Kosinussatz hinbekommen:

Code: Alles auswählen

def angle(A, B, C):
    a = math.hypot( C[0]-B[0], C[1]-B[1])
    b = math.hypot( A[0]-C[0], A[1]-C[1])
    c = math.hypot( A[0]-B[0], A[1]-B[1])

    beta = acos( (b**2-a**2-c**2) / (-2*a*c) )
    return beta
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

init-0 hat geschrieben:Beim tangenssatz hab ich immer 2 winkel in der gleichung. Da ich keinen von beiden kenne kann ich damit doch höchstens das verhältnis ausrechnen.
Und für die Hypotenuse brauche ich ein Rechtwinkliges dreieck. Dann müsste ich erst ha, hb und hc berechnen. Gibts nicht noch eine einfachere Methode?
Am einfachsten wäre es, zur Berechnung des Winkels zwischen zwei Seiten das Skalarprodukt zu benutzten. Das beschränkt dich auch nicht auf Dreiecke.
Antworten