Цитата:
 Код 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, то ситуация выглядит так:
