За последние 24 часа нас посетили 18268 программистов и 1637 роботов. Сейчас ищут 1596 программистов ...

нахождения угла (0-360) по координатам точки и центра

Тема в разделе "Решения, алгоритмы", создана пользователем Gromo, 8 янв 2012.

  1. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    задача: имееются координаты точки отсчёта (не обязательно (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]
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а ты хочешь-то чего? или хвастаешься?
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Это, наверно, публикация.
    По поводу оценки и обсуждения и если интересует моё мнение - вроде ничего лишнего я не вижу, хорошее решение. Воспользуюсь, если понадобится такая функция и я вспомню, что где-то тут она есть. Оценка - ну, наверно, 5 [​IMG]
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Если вот это:
    [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

    Похоже надо действовать через синус и косинус.
     
  5. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    igordata
    мне данная формула понадобилась уже дважды. так что публикую тут, дабы потом знать где искать, если ещё понадобится :)

    гугл так и не дал готового решения в своё время, так что надеюсь что данная формула проиндексируется тут и поможет кому-либо при решении задач с координатной плоскостью.

    по этому я и делаю проверку на четверть
    [js]a = (x > 0) ? a+90 : a+270;[/js]
    что даст нам координаты от 0 до 360
     
  6. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    А! Вместо x увидел a.

    Но, что-то я совсем запутался...

    Если x > 0:
    Если a = 45, то и в результате должно быть 45.
    Если a = 60, то в результате должно быть 30.
    Если a = -30, то в результате должно быть 120.

    Если x < 0:
    Если a = -45, то и в результате должно быть 315.
    Если a = 45, то в результате должно быть 225.

    Где я не прав?
     
  7. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    И про деление на ноль.

    [js]if(x==0) {
    if (y >= 0) return 0;
    if(y<0) return 180;
    }[/js]
     
  8. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    а ты проверь ;)

    [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)
     
  9. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Эм...
    Таким образом:
    Точка {x:150,y:50} находится в 4 координатной четверти относительно {x:100,y:100}, и угол будет равен 135 (справа у нас 90 и плюс еще 45 градусов).
     
  10. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
  11. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    вроде как 0-90 1 четверть, 90-180 - 2, 180 - 270 - 3, 270-360 -4 Всё против часовой стрелки идёт
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ничего не понял сейчас... Посмотри на часы со стрелками. В какую сторону стрелки крутятся?
     
  13. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    четверти нумеруются против часовой стрелки.
    если по рис. смотреть который выше, то получается
    что 0-90 - 1
    0-270 - 2
    270-180 - 3
    180-90 - 4
     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ааа... :))) Не помню уже этого. На картинку посмотрел и решил, что так и есть :)
     
  15. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Моё мнение по высчитыванию угла по часовой стрелке совпадает с реализацией поворота в браузерах согласно спецификации CSS3. Я считаю это удобней, чем высчитывание угла против часовой стрелки начиная с координаты (1,0).
     
  16. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    а вдруг есть вероятность, что твоим кодом воспользуется человек, который читал книжки по математике, и тут-то он будет удивлён, таки да.
    css3 сырая кстати.
     
  17. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    я буду больше удивлён, если он воспользуется решением не почитав комментарии на первой странице, или хотя бы описание функции, где ясно написано в какой последовательности производится отсчёт угла наклона.

    Насколько сырая? Для ИЕ, который начал внедрять только в 9 версии?

    А трансформация поворотом, кстати, уже реализована во всех браузерах. К тому же я не думаю, что даже если изменится CSS3 (что очень маловероятно), будет изменён механизм поворота на заданный угол используя отсчёт против часовой стрелки.
     
  18. Михаил

    Михаил Активный пользователь

    С нами с:
    12 июл 2009
    Сообщения:
    545
    Симпатии:
    0
    Адрес:
    Bielarus
    я тоже.
    да и сам понимаешь, что повороты, это не весь css3
     
  19. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Вот теперь понял. Ты ось Y развернул.