|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Элементарная геометрия
Всем привет!
Столкнулся с задачей, над которой сижу уже второй день и не могу найти разумного решения. Внизу экрана находится фиксированная пушка, ствол которой можно вращать влево-вправо. По полю рандомно катается танк; цель игрока - поразить этот танк из пушки. Как определить, находится ли танк на линии прицеливания пушки? Функцию писал так: Код:
Result:=(Y - Y1) = (X - X1) * tan(Angle) Можно ли решить эту задачу другим путём? Заранее благодарен за совет Ne timeas obscurum. |
#2
|
||||
|
||||
1) А угол в каких единицах задан?
2) Сравнение дробных чисел должно быть приблизительным. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 19.05.2013 в 21:25. |
#3
|
||||
|
||||
В градусах...
Сейчас попробую перевести в радианы и перепроверить результат. Ne timeas obscurum. |
#4
|
||||
|
||||
То есть нужно ввести какую-то константу Е и по ней приблизительно сравнивать выражения, например
Код:
Result:=(Y - Y1) - (X - X1) * tan(Angle) < E; Ne timeas obscurum. |
#5
|
||||
|
||||
Проверь знаки разностей координат.
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Lothlorien (19.05.2013)
|
#6
|
||||
|
||||
Да, тут при E = 0.5 пушка начинает попадать по танку, даже если целится в противоположную сторону
Но формула в принципе грамотная (если закрыть глаза на знаки)? Я полагал, что собака зарыта в неверной формуле... Ne timeas obscurum. |
#7
|
||||
|
||||
Нормальная формула, в точности по определению тангенса. Хотя можно было бы угол поворота задавать сразу этим отношением (тангенсом), тогда бы не пришлось все время его считать. Только знаки нужно правильно учитывать, и разобраться со случаем альфа = 90 около градусов.
В общем случае можно записать поворот уравнением прямой (Ax + By + C = 0) и подставлять туда координаты танка, проверяя примерное равенство. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 19.05.2013 в 21:48. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Lothlorien (19.05.2013)
|
#8
|
||||
|
||||
Нет, вращение пушки ограничено до 85 градусов в каждую сторону, так что, по идее, Division by Zero не должно быть
Большое спасибо, буду разбираться со знаками. Попробую и вариант уравнения AX + BY + C = 0 )) Ne timeas obscurum. Последний раз редактировалось Lothlorien, 19.05.2013 в 21:52. |
#9
|
||||
|
||||
Цитата:
При выстреле создавался объект 'снаряд', который летел по тректории заданной положением башни танка в созданном таймере. 1 шаг снаряда = размер снаряда в пикселях. При изменении позиции снаряда проверялось столкновение. Тректорию считал как точка выстрела x,y + приращивание значений по таймеру в ту сторону куда был сделан выстрел.. Писатель я плохой, и пишу сумбурно, но дел было, часа на два, при условии, что я начинающий программист. т.е. по просту говоря создавался объект класса 'снаряд', в котором была проверка столкновения, и выпускался по траектории. Последний раз редактировалось alexusankov, 20.06.2013 в 11:33. |
#10
|
||||
|
||||
А так наиболее правильно. Просто в подобных игрушках цель не мотается как маятник упорядоченно туда-сюда, а вносится элемент случайности в движение, т.е. повернуть может и не доходя до края. Ну естественно при этом вычисление заранее точки столкновения не всегда будет работать.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |