Python угол наклона прямой

Расчет угла с учетом расположения начала отрезка

Необходимо рассчитать угол наклона отрезка, но с учетом расположения начала и конца.

1 2 3 4 5 6 7 8 9 10 11 12
import math trox = float(3.0) troy = float(3.0) rxox = float(7.0) rxoy = float(5.0) len_line = math.sqrt(((rxox-trox)**2)+((rxoy-troy)**2)) print('%.3f' % len_line) angel = math.degrees(math.atan((rxoy-troy)/(rxox-trox))) print('%.3f' % angel)

В выше приведенном коде начало отрезка ниже и левее чем конец. Потому угол составляет 26 градусов. Вроде все понятно. Но если поменять местами начало и конец отрезка, то значение угла будет точно таким же. А мне необходимо учитывать направление отрезка вокруг его начала. Теоретически значение угла должно быть 206 градусов. Как реализовать это?

Источник

Вычисление угла наклона с использованием координат

Я должен рассчитать угол между двумя точками, скажем, A (x1, y1) и B (x2, y2). И текущий код, который я использую, выглядит следующим образом:

import math direction = math.degrees(math.atan((y2 - y1) / (x2 - x1))) 

Я попытался выполнить тот же код, используя следующий код

x = np.asarray(data['x']) y = np.asarray(data['y']) direction = np.rad2deg(np.arctan2(y, x)) 

Здесь «x» и «y» относятся к двум атрибутам, имеющим координаты.

Однако значения, которые я получаю для вычисления направления с использованием numpy, отличаются от вычислений, полученных с использованием пакета ‘math’.

Просто для предоставления минимальных и максимальных значений

data['x'].min(), data['x'].max() # (25.24, 803.85) data['y'].min(), data['y'].max() # (21.44, 805.76) 

Два дистрибутива для ‘x’ и ‘y’ имеют почти нормальное распределение.

Как реализовать вычисление угла с помощью numpy?

data_d = data = pd.DataFrame(data_d) 

Здесь столбец «direction» рассчитывается с использованием пакета «math», а «direction_np_computation» рассчитывается с использованием кода:

# Reference point- Xr = 0 Yr = 0 # Get 'x' and 'y' attributes from 'data'- x = np.array(data['x']) y = np.array(data['y']) # Compute direction from reference point with the coordinates- direction = np.rad2deg(np.arctan2(Yr - y, Xr - x)) 

Почему между столбцами несовпадение?

Может предоставить 2 конкретных примера того, как оба метода выполняют одни и те же вычисления и разные результаты для каждого?

1 ответ

Мне кажется, что все работает нормально. Из-за того, что я не вижу характер вашего массива координат numpy / pandas, я не могу дать вам точное решение

>>> direction = np.rad2deg(np.arctan((2-1)/(2-1))) >>> direction 45.0 
>>> direction = math.degrees(math.atan((2 - 1) / (2 - 1))) >>> direction 45.0 
>>> direction = np.rad2deg(np.arctan2((2-1),(2-1))) >>> direction 45.0 

С поддельными данными (поскольку я не вижу ваших данных) с использованием вашей функции

Читайте также:  Python args with keyword

Проверьте направление к контрольной точке с помощью этих координат:

>>> Xs = np.array([1,2,3,4,5,6]) >>> Ys = np.array([1,2,3,4,5,6]) 

Я ожидаю, что все они будут иметь направление 45 градусов

>>> direction = np.rad2deg(np.arctan2(Yr-Ys,Xr-Xs)) >>> direction array([45., 45., 45., 45., 45., 45.]) 

На основании предоставленных вами данных:

Похоже, вы были правы, считая, что есть другой результат.

Использование np.arctan должно быть в порядке

>>> direction = np.rad2deg(np.arctan(data.y/data.x)) >>> direction 0 45.819271 1 45.805556 2 45.795956 3 45.790496 4 45.785684 5 45.782246 6 45.771168 7 45.759343 8 45.744059 9 45.724642 10 45.712089 dtype: float64 
>>> for i in range(10): . math.degrees(math.atan((data.y[i]) / (data.x[i]))) . 45.81927143732942 45.805555571378584 45.79595585089821 45.79049607412479 45.78568399098587 45.782246280023934 45.771167675155795 45.75934340359498 45.744059202888714 45.72464168864543 >>> 

Будьте осторожны со знаком + -. Y2-Y1 / X2-X1 и Y1-Y2 / X1-X2 могут дать разные результаты, но на самом деле оба правильные. В нашем случае это 45 градусов или -135 градусов. Они оба правильные, только один из них по часовой стрелке.

Источник

Расчет углов между отрезками (Python) с помощью math.atan2

Я работаю над проблемой пространственного анализа, и часть этого рабочего процесса заключается в вычислении угла между соединенными отрезками линии. Каждый сегмент линии состоит только из двух точек, и каждая точка имеет пару координат XY (декартова). Вот изображение от GeoGebra. Я всегда заинтересован в получении положительного угла в диапазоне от 0 до 180. Однако я получаю всевозможные углы в зависимости от порядка вершин во входных линейных сегментах. Входные данные, с которыми я работаю, представлены в виде наборов координат. В зависимости от порядка создания вершин последняя / конечная точка для каждого сегмента линии может быть разной. Вот некоторые из случаев в коде Python. Порядок сегментов линии, в котором я их получаю, является случайным, но в кортеже кортежей первый элемент является начальной точкой, а второй — конечной точкой. Например, линейный сегмент DE будет иметь ((1,1.5),(2,2)) , а (1,1.5) — это начальная точка, поскольку он занимает первую позицию в кортеже координат. Однако мне нужно убедиться, что я получу одинаковый угол между DE,DF и ED,DF и так далее.

vertexType = "same start point; order 1" #X, Y X Y coords lineA = ((1,1.5),(2,2)) #DE lineB = ((1,1.5),(2.5,0.5)) #DF calcAngle(lineA, lineB,vertexType) #flip lines order vertexType = "same start point; order 2" lineB = ((1,1.5),(2,2)) #DE lineA = ((1,1.5),(2.5,0.5)) #DF calcAngle(lineA, lineB,vertexType) vertexType = "same end point; order 1" lineA = ((2,2),(1,1.5)) #ED lineB = ((2.5,0.5),(1,1.5)) #FE calcAngle(lineA, lineB,vertexType) #flip lines order vertexType = "same end point; order 2" lineB = ((2,2),(1,1.5)) #ED lineA = ((2.5,0.5),(1,1.5)) #FE calcAngle(lineA, lineB,vertexType) vertexType = "one line after another - down; order 1" lineA = ((2,2),(1,1.5)) #ED lineB = ((1,1.5),(2.5,0.5)) #DF calcAngle(lineA, lineB,vertexType) #flip lines order vertexType = "one line after another - down; order 2" lineB = ((2,2),(1,1.5)) #ED lineA = ((1,1.5),(2.5,0.5)) #DF calcAngle(lineA, lineB,vertexType) vertexType = "one line after another - up; line order 1" lineA = ((1,1.5),(2,2)) #DE lineB = ((2.5,0.5),(1,1.5)) #FD calcAngle(lineA, lineB,vertexType) #flip lines order vertexType = "one line after another - up; line order 2" lineB = ((1,1.5),(2,2)) #DE lineA = ((2.5,0.5),(1,1.5)) #FD calcAngle(lineA, lineB,vertexType) 

Я написал крошечную функцию, которая принимает комбинации линий как аргументы и вычисляет угол между ними. Я использую math.atan2 , который, как мне показалось, лучше всего подходит для этого.

def calcAngle(lineA,lineB,vertexType): line1Y1 = lineA[0][1] line1X1 = lineA[0][0] line1Y2 = lineA[1][1] line1X2 = lineA[1][0] line2Y1 = lineB[0][1] line2X1 = lineB[0][0] line2Y2 = lineB[1][1] line2X2 = lineB[1][0] #calculate angle between pairs of lines angle1 = math.atan2(line1Y1-line1Y2,line1X1-line1X2) angle2 = math.atan2(line2Y1-line2Y2,line2X1-line2X2) angleDegrees = (angle1-angle2) * 360 / (2*math.pi) print angleDegrees, vertexType 
> -299.744881297 same start point; order 1 > 299.744881297 same start point; order 2 > 60.2551187031 same end point; order 1 > -60.2551187031 same end point; order 2 > -119.744881297 one line after another - down; order 1 > 119.744881297 one line after another - down; order 2 > -119.744881297 one line after another - up; line order 1 > 119.744881297 one line after another - up; line order 2 

Как видите, я получаю разные значения в зависимости от порядка вершин в линейном сегменте и порядка линейных сегментов. Я попытался постобработать углы, выяснив, какое отношение имела исходная линия, и переворачивал линии, редактировал угол и т. Д. Я закончил с дюжиной таких случаев, и в какой-то момент они начинают перекрываться, и я больше не может определить, должно ли -119,744 стать 60,255 (острый угол) или оставить 119,744 (тупой угол) и т. д. Есть ли какой-либо дискретный способ обработки значений угла на выходе, которые я получаю от math.atan2 , чтобы получить только положительное значение в диапазоне от 0 до 180? Если нет, то какой другой подход мне следует использовать?

Читайте также:  На каком паттерне основана иерархия потоков ввода вывода java

Источник

Метод, который вычисляет наклон в Python

Я пытаюсь изучить объектно-ориентированное программирование на Python. Для этого мне нужно создать метод, который вычисляет наклон линии, соединяющей начало координат с точкой. (Я думаю), мы предполагаем, что начало координат (0,0). Например:

Point(4, 10).slopeFromOrigin() 2.5 Point(12, -3).slopeFromOrigin() -0.25 Point(-6, 0).slopeFromOrigin() 0 

И мы используем уравнение slope = (Y2 — Y1) / (X2 — X1) для вычисления наклона. Кроме того, поскольку деление на 0 не разрешено, нам нужно вернуть None , когда метод завершился с ошибкой. Вот что я пробовал:

class Point: #Point class for representing and manipulating x,y coordinates def __init__(self, initX, initY): #Create a new point at the given coordinates self.x = initX self.y = initY def getX(self): return self.x def getY(self): return self.y def distanceFromOrigin(self): return ((self.x ** 2) + (self.y ** 2)) ** 0.5 #define a method called slopeFromOrigin here def slopeFromOrigin(self): #set origin values for x and y (0,0) self.x = 0 self.y = 0 #slope = (Y2 - Y1) / (X2 - X1) if (Point(x) - self.x) == 0: return None else: return (Point(y) - self.y) / (Point(x) - self.x) #some tests to check our code from test import testEqual testEqual( Point(4, 10).slopeFromOrigin(), 2.5 ) testEqual( Point(5, 10).slopeFromOrigin(), 2 ) testEqual( Point(0, 10).slopeFromOrigin(), None ) testEqual( Point(20, 10).slopeFromOrigin(), 0.5 ) testEqual( Point(20, 20).slopeFromOrigin(), 1 ) testEqual( Point(4, -10).slopeFromOrigin(), -2.5 ) testEqual( Point(-4, -10).slopeFromOrigin(), 2.5 ) testEqual( Point(-6, 0).slopeFromOrigin(), 0 ) 

Как вы можете видеть, я пытаюсь сказать, что нам нужен первый параметр Point для x2, а второй параметр Point — y2. Я попробовал это так и получил NameError: name ‘y’ is not defined on line 32 . Я также попытался получить значения индекса Point следующим образом: return (Point[0] — self.y / (Point[1] — self.x) Но это также дало мне сообщение об ошибке: TypeError: ‘Point’ does not support indexing on line 32 Я не уверен, как получить значение параметров x и y из Point , чтобы метод работал, когда он тестировался. Пожалуйста, поделитесь своими предложениями, если у вас есть. Спасибо.

Читайте также:  Python re sub with groups

Источник

Оцените статью