Python - math.asin

0

Witam,
Mam, zdawało by się trywialny, problem dotyczący obliczania przez Python wartości podawanej dla matematycznej funkcji math.asin(x) - gdzie x to podawany parametr

import math
Ax = float(input("Ax: "))
Ay = float(input("Ay: "))
Bx = float(input("Bx: "))
By = float(input("By: "))
Cx = float(input("Cx: "))
Cy = float(input("Cy: "))
AB = ((Bx-Ax)**2+(By-Ay)**2)**0.5
BC = ((Cx-Bx)**2+(Cy-By)**2)**0.5
AC = ((Cx-Ax)**2+(Cy-Ay)**2)**0.5
sinAlfa = (BC/AC + BC/AB)/2.0
sinBeta = (AC/AB + AC/BC)/2.0
sinGamma = (AB/AC + AB/BC)/2.0
katA = math.degrees(math.asin(sinAlfa))
katB = math.degrees(math.asin(sinBeta))
katC = math.degrees(math.asin(sinGamma))
print "kat alfa:",katA,", kat beta:",katB,", kat gamma:",katC

dodam że w języku JAVA nie ma z tym problemu a w Python-ie wyrzuca mi coś takiego:

Traceback (most recent call last):
  File "I:\wrokspace\PythonProject\src\zadania0\1.py", line 42, in <module>
    katA = math.degrees(math.asin(sinAlfa))
ValueError: math domain error
1

Skąd wziąłeś te wzory:

sinAlfa = (BC/AC + BC/AB)/2.0
sinBeta = (AC/AB + AC/BC)/2.0
sinGamma = (AB/AC + AB/BC)/2.0

One są niepoprawne i dają wartości spoza przedziału [-1,1]. A argument funkcji asin() musi być z tego przedziału.

0

ahh, no przecież :)
wzory sam wymyśliłem - wiem, bez sensu, usunę = wzorów nie wymyśla sie samemu :)
ale chciałem dzięki temu rozwiązać problem:
chodzi o to że program ma wyliczać kąty w trójkącie zdefiniowanym wg podanych punktów
problem pojawia się gdy trójkąt na różne długości boków i nie wiadomo która to przyprostokątna kąta (zakładając że trójkąt jest dowolnie usytuowany w przestrzeni 2D)
(chyba lepiej będzie obliczyć stosunku długości boków i kąt wyliczyć przez działania z kątem 180)

rozwiązane :) i nie ma potrzeby używania sin i asin

Ax = float(input("Ax: "))
Ay = float(input("Ay: "))
Bx = float(input("Bx: "))
By = float(input("By: "))
Cx = float(input("Cx: "))
Cy = float(input("Cy: "))
AB = ((Bx-Ax)**2+(By-Ay)**2)**0.5
BC = ((Cx-Bx)**2+(Cy-By)**2)**0.5
AC = ((Cx-Ax)**2+(Cy-Ay)**2)**0.5
suma = AB+BC+AC
kat1 = (AB/suma)*180.0
kat2 = (BC/suma)*180.0
kat3 = (AC/suma)*180.0
print "kat 1:",kat1,", kat 2:",kat2,", kat 3:",kat3
1

Można skorzystać z dwóch wzorów na pole trójkąta: wzór Herona i \frac{1}{2}ab sin(\alpha) (kąt \alpha leży między bokami a i b).

import math
Ax = float(input("Ax: "))
Ay = float(input("Ay: "))
Bx = float(input("Bx: "))
By = float(input("By: "))
Cx = float(input("Cx: "))
Cy = float(input("Cy: "))
AB = ((Bx-Ax)**2+(By-Ay)**2)**0.5
BC = ((Cx-Bx)**2+(Cy-By)**2)**0.5
AC = ((Cx-Ax)**2+(Cy-Ay)**2)**0.5
p = (AB + BC + AC)/2.0
pole = (p*(p-AB)*(p-BC)*(p-AC))**0.5
sinAlfa = (2.0*pole)/(AB*AC)
sinBeta = (2.0*pole)/(AB*BC)
sinGamma = (2.0*pole)/(BC*AC)
katA = math.degrees(math.asin(sinAlfa))
katB = math.degrees(math.asin(sinBeta))
katC = math.degrees(math.asin(sinGamma))
print "kat alfa:",katA,", kat beta:",katB,", kat gamma:",katC
0

racja, u mnie liczy proporcje i średnio ma się to do kątów... dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1