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