Seite 1 von 1

Winkelberechnung Messfehler oder Programmfehler?

Verfasst: Samstag 6. August 2011, 22:00
von init-0
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

Re: Winkelberechnung Messfehler oder Programmfehler?

Verfasst: Sonntag 7. August 2011, 11:23
von init-0
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?

Re: Winkelberechnung Messfehler oder Programmfehler?

Verfasst: Sonntag 7. August 2011, 11:41
von querdenker
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.

Re: Winkelberechnung Messfehler oder Programmfehler?

Verfasst: Sonntag 7. August 2011, 14:34
von init-0
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?

Re: Winkelberechnung Messfehler oder Programmfehler?

Verfasst: Sonntag 7. August 2011, 15:17
von init-0
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

Re: Winkelberechnung Messfehler oder Programmfehler?

Verfasst: Sonntag 7. August 2011, 16:43
von Darii
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.