Получить угол со знаком точки относительно отрезка.

Автор Doom, 01.09.23, 13:58:42

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Doom

Добрый день!

Есть отрезок который может вращаться относительно конечной его точки(А). Нужно найти угол со знаком(+ или -) относительного его и заданной точки(С или Е).
Координаты всех точек известны.

Как найти угол знаю, НО как получить знак относительно отрезка AB ?


Doom

#  получить угол между координатами
def get_ugol(xc, yc, x1, y1, x2, y2, returned):

    xr1 = x1 - xc
    yr1 = y1 - yc

    xl1 = x2 - xc
    yl2 = y2 - yc

    ma = math.sqrt(xr1 * xr1 + yr1 * yr1)
    mb = math.sqrt(xl1 * xl1 + yl2 * yl2)
    sc = xr1 * xl1 + yr1 * yl2
    # начальный угол
    PI = math.pi
   
    if returned == 'grad':
        return (math.acos(sc / ma / mb)*180/PI)
   
    elif returned == 'rad':
        return (math.acos(sc / ma / mb))

Doom

#2
Я думал привязаться к четвертям, но есть ряд примеров где это не сработает..
Сами углы не могут превышать 180 град. И равны 180 тоже не могут. Относительно отрезка АВ.

lavgirb

Цитата: Doom от 01.09.23, 13:58:42Добрый день!

Есть отрезок который может вращаться относительно конечной его точки(А). Нужно найти угол со знаком(+ или -) относительного его и заданной точки(С или Е).
Координаты всех точек известны.

Как найти угол знаю, НО как получить знак относительно отрезка AB ?


Можно определить все углы относительно оси OX. А потом просто сравнить.
Если угол больше чем угол XAB, искомый с плюсом.
Если угол меньше, чем угол XAB, искомый с минусом.

Doom

lavgirb, это не работает.  Точка С может уйти в 3 четверть  и угол будет больше.

lavgirb


Doom

Цитата: lavgirb от 01.09.23, 14:49:34Пояснить можете?

Еще случай:
АВ может близко повернута к ОХ и ЕА тоже а АС ближе к переходу с 4 четверти на 3 и тут как ?

lavgirb

Цитата: Doom от 01.09.23, 14:54:32Еще случай:
АВ может близко повернута к ОХ и ЕА тоже а АС ближе к переходу с 4 четверти на 3 и тут как ?
Лучше со скриншотом, если не трудно. Чтоб была определенность.

Doom





lavgirb

Цитата: Doom от 01.09.23, 15:05:17



А угол XAC здесь не со знаком минус?
Да и Yc < Yb. Тоже может быть критерием.

Doom

Сравнение координат не может быть критерием.


Doom

#11
В трех соснах заблудится - дела..

Решение:

import math

# координаты центра А
xc = 0
yc = 0

# координаты точки В (АВ)
x1 = 15
y1 = 0

# координаты точки С
x2 = -17.7425
y2 = -3.1285

# координаты точки В (АВ)
xA1 = x1 - xc
yA2 = y1 - yc

# координаты точки С
xC1 = x2 - xc
yC2 = y2 - yc


# высчитываем длины отрезков
lAB = math.sqrt((xA1-xc)**2 + (yA2-yc)**2)
lAC = math.sqrt((xC1-xc)**2 + (yC2-yc)**2)

print('длина lAB:',lAB)
print('длина lAC:',lAC)

# находим наименьший и это будет радиусом "окружности"

if lAC < lAB:
    print(1)
       
    s = lAB/lAC
    lamda_ = 1/(s-1)
   
    # обновляем координаты точки С
    xC1 = (xc + xC1*lamda_)/(1 + lamda_)
    yC2 = (yc + yC2*lamda_)/(1 + lamda_)
   
    # lAC = math.sqrt((kxC1-xc)**2 + (kyC2-yc)**2)
    # print('длина lAC:',lAC, "=>", lAC*s)
   
elif lAB < lAC:
    print(2)
   
    s = lAC/lAB
    lamda_ = 1/(s-1)
   
    # обновляем координаты точки В
    xA1 = (xc + xA1*lamda_)/(1 + lamda_)
    yA2 = (yc + yA2*lamda_)/(1 + lamda_)
   
    # lAB = math.sqrt((kxA1-xc)**2 + (kyA2-yc)**2)
    # print('длина lAB:', lAB, "=>", lAB*s)
   
elif lAB == lAC:
    print(3)
    pass


ma = math.sqrt(xA1**2 + yA2**2)
mc = math.sqrt(xC1**2 + yC2**2)

sc = xA1 * xC1 + yA2 * yC2
# начальный угол
PI = math.pi
res = math.acos(sc / ma / mc)*180/PI

if res != 180:
   
    if xA1 > xC1 and yA2 < yC2:
        print('угол CAB:', res)
       
    elif xC1 > xA1 and yC2 < yA2:
        print('угол CAB:', -1*res)
   
    elif xC1 > xA1 and yC2 > yA2:
        print('угол CAB:', res)
   
    elif xA1 > xC1 and yA2 > yC2:
        print('угол CAB:', -1*res)
   
    elif xC1 < xA1 and yC2 > yA2:
        print('угол CAB:', -1*res)
   
    elif xA1 < xC1 and yA2 > yC2:
        print('угол CAB:', res)
   
    elif xC1 > xA1 and yC2 > yA2:
        print('угол CAB:', -1*res)
   
    elif xA1 > xC1 and yA2 > yC2:
        print('угол CAB:', res)

    else:
        print('не учтено')
else:
    res = 0