Показать сообщение отдельно
Старый 12.03.2012, 14:17   #7
Местный
 
Аватар для mikser
 
Регистрация: 26.01.2009
Сообщений: 1,097
Сказал Спасибо: 178
Имеет 119 спасибок в 84 сообщенях
mikser пока неопределено
По умолчанию

Цитата:
Сообщение от Yegor Посмотреть сообщение
mikser, самый простой и быстрый способ - это заменить сферу на куб и проверять попадание в него банальными сравнениями. Или бот должен быть прецензионным?
Да Да я уже пару дней назад сам до этого дошёл.
На самом деле это решает всё. Оказалось всё настолько просто что
мне даже стало стыдно как я раньше до этого не додумался.
Алгоритм:
  1. Опишем вокруг сферы куб (Сфера вписана в куб, 2D аналог окружность вписана в квадрат)
  2. Если точка лежит за пределами куба -то лежит за пределами сферы //тут отсеятся 90% всех "плохих" точек
  3. Если точка лежит внутри куба {тут начинается самое интересное} Стоп! А что такое Куб? Если взглянуть на "левый нижний угол куба" - это же начало декартовой системы координат. Точнее его зона + + + (где x y z положительны или 0) Как мы только это осознали сразу переводим координаты сферы в новую систему координат {По сути мы переносим точку отсчёта в левый нижний угол куба}
  4. Переводим координаты точки в новую систему координат (так как она лежит внутри куба)
  5. Приводим тип всех координат в Longint и считаем обычной формулой.
    Переполнения не произойдёт потому что куб мал

Добавлено через 16 минут
Правда есть ещё шанс что куб будет занимать всю карту если сфера размером во всю карту или её половину.
Надо подумать как лучше поступить в этом случае.
Масштабирование может помочь но потеряется точность
и надо правильно подобрать коэффицент на который делить //желательно степень двойки
Как его правильно подобрать?
Кто силён в вычислительной геометрии?
__________________
Играю по фэншую используя /allblock, созерцая красоту игрового мира, сосредоточившись на получении энергии Ци при убийстве мобов.
icq=((2*3*(19^2)*37)-1)*9

Последний раз редактировалось mikser, 12.03.2012 в 14:24. Причина: Добавлено сообщение
mikser вне форума   Ответить с цитированием