Что нового

[Математика] Определение угла по координатам

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Помогите переделать функцию определения угла. При таком запросе:
Код:
be_CoordsToRotation($tX, $tY, $cX, $cY)*45/ATan(1)

Сама функция:
Код:
Func be_CoordsToRotation($bectr_X1, $bectr_Y1, $bectr_X2, $bectr_Y2) ;Author: dwerf
    Local $bectr_DX = $bectr_X2-$bectr_X1
    Local $bectr_DY = $bectr_Y2-$bectr_Y1
    Local $bectr_AXY = Abs(ATan($bectr_DX/$bectr_DY))
    Local $bectr_AYX = Abs(ATan($bectr_DY/$bectr_DX))
    Local $bectr_hpi = ATan(1)*2
    Local $bectr_Angle = 0
   If $bectr_X1 > $bectr_X2 Then
        $bectr_Angle += 2*$bectr_hpi
        If $bectr_Y1 > $bectr_Y2 Then
            $bectr_Angle += $bectr_AXY
        ElseIf $bectr_Y1 = $bectr_Y2 Then
            $bectr_Angle += $bectr_hpi
        ElseIf $bectr_Y1 < $bectr_Y2 Then
            $bectr_Angle += $bectr_hpi
            $bectr_Angle += $bectr_AYX
        EndIf
    ElseIf $bectr_X1 = $bectr_X2 Then
        If $bectr_Y1 > $bectr_Y2 Then
            $bectr_Angle += 2*$bectr_hpi
;~      ElseIf $bectr_Y1 = $bectr_Y2 Then
;~      ElseIf $bectr_Y1 < $bectr_Y2 Then
        EndIf
    ElseIf $bectr_X1 < $bectr_X2 Then
        If $bectr_Y1 > $bectr_Y2 Then
            $bectr_Angle += $bectr_hpi
            $bectr_Angle += $bectr_AYX
        ElseIf $bectr_Y1 = $bectr_Y2 Then
            $bectr_Angle += $bectr_hpi
        ElseIf $bectr_Y1 < $bectr_Y2 Then
            $bectr_Angle += $bectr_AXY
        EndIf
    EndIf
    Return $bectr_Angle
EndFunc

Возвращает такой вид координат:
Код:
         180
270     я        90
          0
А нужен такой вид:
Код:
           0
270      я       90
         180
С математикой совсем туго. Наверно координаты нужно сдвинуть на 2пи, но никак не могу вспомнить каким образом.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
а какие координаты передаешь? я проверил на простом примере, вроде правильно угол возвращает
 
Автор
D

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Код:
     x  1  2  3  4  5
y
1
2
3
4
5
а какие координаты передаешь? я проверил на простом примере, вроде правильно угол возвращает
Правильно, то правильно возвращает.... Только вот нулевая координата, относительно точки, внизу, а должна быть в верху.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Уравнения координат для твоего случая выглядят так:

Код:
$tX = $cX + $R * Sin($A)
$tY = $cY - $R * Cos($A)


где

Код:
$R = Sqrt(($cX - $tX) ^ 2 + ($cY - $tY) ^ 2)


Откуда легко получить значение угла:

Код:
$A = ASin(($tX - $cX) / $R)


или

Код:
$A = ACos(($cY - $tY) / $R)


Ну и с учетом знака и плоскости:

Код:
$cX = 0
$cY = 0
$tX = 1
$tY = 1

$Pi = 4 * ATan(1)
$R = Sqrt(($cX - $tX) ^ 2 + ($cY - $tY) ^ 2)
$A = ASin(($tX - $cX) / $R)
If $tY > $cY Then
	$A = $Pi - $A
EndIf
If $A < 0 Then
	$A += 2 * $Pi
EndIf

ConsoleWrite(($A * 180 / $Pi) & @CR)


P.S

Я так и не понял откуда в твоей функции взялось столько нагромождений...
 

Arei

Скриптер
Сообщения
938
Репутация
115
OffTopic:
Отвечаю за автора темы.
OffTopic:
С математикой совсем туго.
его слова.
:smile:
 

running-frag

why me?
Сообщения
441
Репутация
60
а где это используется?

ps: навод на мысль что ты хочешь сделать расчёт по окружности
 

lirikmel

Продвинутый
Сообщения
226
Репутация
84
как ни странно так
Код:
Func be_CoordsToRotation($bectr_X1, $bectr_Y1, $bectr_X2, $bectr_Y2) ;Author: dwerf
    Local $bectr_DX = $bectr_X2-$bectr_X1
    Local $bectr_DY = $bectr_Y2-$bectr_Y1
    Local $bectr_AXY = Abs(ATan($bectr_DX/$bectr_DY))
    Local $bectr_AYX = Abs(ATan($bectr_DY/$bectr_DX))
    Local $bectr_hpi = ATan(1)*2
    Local $bectr_Angle = 0
   If $bectr_X1 > $bectr_X2 Then
        $bectr_Angle += 2*$bectr_hpi
        If $bectr_Y1 < $bectr_Y2 Then
            $bectr_Angle += $bectr_AXY
        ElseIf $bectr_Y1 = $bectr_Y2 Then
            $bectr_Angle += $bectr_hpi
        ElseIf $bectr_Y1 > $bectr_Y2 Then
            $bectr_Angle += $bectr_hpi
            $bectr_Angle += $bectr_AYX
        EndIf
    ElseIf $bectr_X1 = $bectr_X2 Then
        If $bectr_Y1 < $bectr_Y2 Then
            $bectr_Angle += 2*$bectr_hpi
;~      ElseIf $bectr_Y1 = $bectr_Y2 Then
;~      ElseIf $bectr_Y1 > $bectr_Y2 Then
        EndIf
    ElseIf $bectr_X1 < $bectr_X2 Then
        If $bectr_Y1 < $bectr_Y2 Then
            $bectr_Angle += $bectr_hpi
            $bectr_Angle += $bectr_AYX
        ElseIf $bectr_Y1 = $bectr_Y2 Then
            $bectr_Angle += $bectr_hpi
        ElseIf $bectr_Y1 > $bectr_Y2 Then
            $bectr_Angle += $bectr_AXY
        EndIf
    EndIf
    Return $bectr_Angle
EndFunc


OffTopic:
а где это используется?
ps: навод на мысль что ты хочешь сделать расчёт по окружности

одна из наиглавнейших функция для ботов -))

....хммм Dellroc мне кажется мы уже это обсуждали http://autoit-script.ru/index.php/topic,4334.60.html :scratch:

PS // тока сейас увидел дату создания темы
 
Автор
D

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Вот под такой вид:
Код:
         180
270     я        90
          0
Переделать вот эту функцию:
Код:
$cX = 0
$cY = 0
$tX = 1
$tY = 1

$Pi = 4 * ATan(1)
$R = Sqrt(($cX - $tX) ^ 2 + ($cY - $tY) ^ 2)
$A = ASin(($tX - $cX) / $R)
If $tY > $cY Then
    $A = $Pi - $A
EndIf
If $A < 0 Then
    $A += 2 * $Pi
EndIf

ConsoleWrite(($A * 180 / $Pi) & @CR)
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Dellroc
Нужно с самого начала правильно ставить вопрос.

Код:
Const $__PI = 4 * ATan(1)

Func _PointToPoint_Angle($x0, $y0, $x, $y)
	If $x0 = $x And $y0 = $y Then Return 0
	; ---
	Local $difX = $x - $x0
	Local $difY = $y - $y0
	Local $tmp = Abs(ATan($difY / $difX))
	; ---
	If $difX < 0 Then $tmp = $__PI - $tmp
	If $difY < 0 Then $tmp = $__PI + ($__PI - $tmp)
	; ---
	Return __GeometryReduceAngle($tmp / ($__PI / 180))
EndFunc

Func __GeometryReduceAngle($iAngle)
	$iAngle = Round($iAngle)
	If $iAngle < 0 Then
		$iAngle = 360 - (Abs($iAngle) - 360)
	EndIf
	While $iAngle >= 360
		$iAngle -= 360
	WEnd
	If $iAngle = 360 Then $iAngle = 0
	Return $iAngle
EndFunc
 
Автор
D

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Я надеялся на ответ Yashied как в прошлый раз... Коротко.... чётко... ничего лишнего...
 
Верх