Показать сообщение отдельно
Старый 27.05.2012, 21:41
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 13  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Код AS3:
           private inline function lineIntersects(target:Target,
	clickX:Float, clickY:Float):Bool
	{
		var clickAngle:Float = Math.atan2(clickX, clickY - _hunter.y);
		var cos:Float = Math.cos(target.angle);
		var sin:Float = Math.sin(target.angle);
		var radius:Float = target.radius;
		var low:Float = Math.atan2(target.x - cos * radius,
		target.y + sin * radius - _hunter.y);
		var high:Float = Math.atan2(target.x + cos * radius,
		target.y - sin * radius - _hunter.y);
		return clickAngle >= low && clickAngle <= high;
	}
Можно понадежнее (может даже попроще - ни одной тригонометрической операции):
Код AS3:
           private inline function lineIntersects(target:Target,
	clickX:Float, clickY:Float):Bool
	{
                      var raySizeX:Float = clickX - _hunter.x;
                      var raySizeY:Float = clickY - _hunter.y;
                      var raySize:Float = Math.sqrt(raySizeX * raySizeX + raySizeY * raySizeY);
                      var rayCos:Float = raySizeX / raySize;
                      var raySin:Float = raySizeY / raySize;
                      // Проекция перпендикуляра от центра цели на луч
                      // Оно же может использоваться как расстояние от охотника до объекта
                      var rayProection = rayCos * (_target.x - _hunter.x) + raySin * (_target.y - _hunter.y);
                      if (rayProection < 0) {
                              // Цель находится за спиной
                              return false;
                      }
                      // Проекция координат цели на перпендикуляр к лучу
                      var normalProection = raySin * (_target.x - _hunter.x) - rayCos * (_target.y - _hunter.y);
                      if (Math.abs(normalProection) > _target.radius) {
                             // Цель не касается луча
                             return false;
                      }
                      return true;
	}
Если правильно пнял код wvxvw, то ситуация выглядит так:
Название: ray.PNG
Просмотров: 253

Размер: 12.4 Кб


Последний раз редактировалось expl; 27.05.2012 в 21:49.