2016-06-25 3 views
-2

Итак, у меня есть X & Y Координаты в пределах цикла. Я хочу рассчитать угол (в градусах) в любой точке Точки C (при 40,60 в качестве примера, который будет постоянно изменяться) от точки A и точки B (координаты A + B никогда не будут меняться (45 100) & (55 100)). Я нарисовал изображение в качестве руководства. Как бы я вычислил это питонически, чтобы вычислить его в цикле.Питонический расчет угла в градусах по координатам

Coordinates

ответ

1

Другой вопрос имеет много аккуратных способов на других языках, но ничего в Python. Поэтому я сделаю это.

import math 

bx = 55 
by = 100 

ax = 45 
ay = 100 

cx = 40 
cy = 60 

angle1 = math.atan2(bx-cx, by-cy) 
angle2 = math.atan2(ax-cx, ay-cy) 

degrees = math.degrees(angle1 - angle2) 
if degrees < 0: 
    degrees = 0 - degrees 
if degrees > 180: 
    degrees = 360 - degrees 

print (str)(cx) + ', ' + (str)(cy) + ' makes an angle of ' + (str)(degrees) + ' with 55,100 and 45, 100.'; 

http://www.tutorialspoint.com/python/number_atan2.htm используется как ссылка.

Atan2 имеет чистое отношение, когда ax = cx или bx, например. либо AC, либо BC - это вертикальная линия, которая всегда вызывает беспокойство, так как вы получаете потенциальное деление на нулевые ошибки.

+0

Что это со всеми точками с запятой? Они разрешены в Python, но не требуются, и они просто заставляют ваш код выглядеть загроможденным. BTW, модуль 'math' поставляет удобные радианы <-> градусов функции преобразования. –

+0

Я немного новичок в python. Я отредактирую их. Я должен был углубиться в математический модуль, чтобы посмотреть на преобразование градусов в радианы. Поэтому я исправил точки с запятой, и я также добавил градусы (#) – aschultz

+1

Намного лучше! Хотя вам не нужны круглые скобки вокруг конструктора строк, поэтому вы можете просто сделать «str (cx)» и т. Д. Однако вместо того, чтобы делать эти явные преобразования строк и конкатенации, вы можете передать кучу отдельных аргументов для 'print 'и он выполнит преобразование строки для вас. Или вы можете использовать функцию 'format', которая дает вам намного больше контроля над выходом. Например, 'print ('{} создает угол {} с {} и {}.'. Format ((cx, cy), degrees, (ax, ay), (bx, by)))'. В этом коде я передаю координатные пары как кортежи, просто чтобы строка формата была простой. –

0

Просто используйте формулу косинуса:

from math import acos,sqrt,pi 
def dist(A,B): 
    # you can code the euclidean distance between 2 points A, B 

CA = dist(C,A) 
CB = dist(C,B) 
AB = dist(A,B) 
theta = (180.0/pi)*acos((CA**2 + CB**2 - AB**2)/(2*CA*CB)) 
+1

Ваша [формула косинусного закона] (https://en.wikipedia.org/wiki/Law_of_cosines) не совсем верна: вы потеряли некоторые квадраты. Кроме того, неэффективно вычислять одинаковые расстояния 'dist (C, A)', 'dist (C, B)' дважды. –

+0

Спасибо большое, @ PM2Ring, глупо меня. –

Смежные вопросы