задача: имееются координаты точки отсчёта (не обязательно (0,0) ), и имеется точка. необходимо вычислить угол наклона относительно начала точки отсчёта. по часовой стрелке: вверху 0, справа 90, снизу 180, слева 270 пример реализации алгоритма на javascript [js]function get_angle(center, point){ var x = point.x - center.x; var y = point.y - center.y; if(x==0) return (y>0) ? 180 : 0; var a = Math.atan(y/x)*180/Math.PI; a = (x > 0) ? a+90 : a+270; return a; }[/js]
Это, наверно, публикация. По поводу оценки и обсуждения и если интересует моё мнение - вроде ничего лишнего я не вижу, хорошее решение. Воспользуюсь, если понадобится такая функция и я вспомню, что где-то тут она есть. Оценка - ну, наверно, 5
Если вот это: [js]Math.atan(y/x)*180/Math.PI;[/js] Возвращает угол от 90 до -90, то Вот здесь: [js]a = (x >= 0) ? a+90 : a+270;[/js] ошибка. 1) Насколько я понимаю по арктангенсу нельзя вычислить в какой четверти мы находимся (1 или 3, 2 или 4), что создает двойственность результата. 2) При угле -30 он в результате даст 240 вместо 210 или 300 Похоже надо действовать через синус и косинус.
igordata мне данная формула понадобилась уже дважды. так что публикую тут, дабы потом знать где искать, если ещё понадобится гугл так и не дал готового решения в своё время, так что надеюсь что данная формула проиндексируется тут и поможет кому-либо при решении задач с координатной плоскостью. по этому я и делаю проверку на четверть [js]a = (x > 0) ? a+90 : a+270;[/js] что даст нам координаты от 0 до 360
А! Вместо x увидел a. Но, что-то я совсем запутался... Если x > 0: Если a = 45, то и в результате должно быть 45. Если a = 60, то в результате должно быть 30. Если a = -30, то в результате должно быть 120. Если x < 0: Если a = -45, то и в результате должно быть 315. Если a = 45, то в результате должно быть 225. Где я не прав?
а ты проверь [js] alert(get_angle({x:100,y:100},{x:150,y:50})); // 45 alert(get_angle({x:100,y:100},{x:150,y:150}));// 135 alert(get_angle({x:100,y:100},{x:50,y:150})); // 225 alert(get_angle({x:100,y:100},{x:50,y:50})); // 315 [/js] на самом деле я там меняю координаты, высчитывая арктангенс от котангенса, так что в правой части -90:90 превращается в 0:180 (+90), а в левой -90:90 становится 180:360 (+270)
Эм... Таким образом: Точка {x:150,y:50} находится в 4 координатной четверти относительно {x:100,y:100}, и угол будет равен 135 (справа у нас 90 и плюс еще 45 градусов).
четверти нумеруются против часовой стрелки. если по рис. смотреть который выше, то получается что 0-90 - 1 0-270 - 2 270-180 - 3 180-90 - 4
Моё мнение по высчитыванию угла по часовой стрелке совпадает с реализацией поворота в браузерах согласно спецификации CSS3. Я считаю это удобней, чем высчитывание угла против часовой стрелки начиная с координаты (1,0).
а вдруг есть вероятность, что твоим кодом воспользуется человек, который читал книжки по математике, и тут-то он будет удивлён, таки да. css3 сырая кстати.
я буду больше удивлён, если он воспользуется решением не почитав комментарии на первой странице, или хотя бы описание функции, где ясно написано в какой последовательности производится отсчёт угла наклона. Насколько сырая? Для ИЕ, который начал внедрять только в 9 версии? А трансформация поворотом, кстати, уже реализована во всех браузерах. К тому же я не думаю, что даже если изменится CSS3 (что очень маловероятно), будет изменён механизм поворота на заданный угол используя отсчёт против часовой стрелки.