Update fn_inAngleSector.sqf

Made by @Victor-the-Cleaner
This commit is contained in:
A Man
2022-05-16 09:25:05 +02:00
parent 685b59a2f0
commit 989e918821

View File

@@ -1,37 +1,30 @@
//------------------ ///////////////////////////////////////////////////////////////////////////////////////////////////
// Authors: Peter Morrison (snYpir) & Philipp Pilhofer (raedor)
// Purpose: Checks if a position lies within an angle sector
// Arguments: [<center position>,<center angle of sector>,<sector width>,<position>]
// Return: boolean
// //
/* // Purpose: Checks if a position lies within an angle sector
Returns true if <position> lies within the sector defined by <center position>, // Arguments: [<center position>, <center angle of sector>, <sector width>, <position>]
<center angle of sector> and <sector width>. Use this function to determine if // Return: boolean
a position lies within a certain angle from another position (ie the <center position>). //
Example: // Returns true if <position> lies within the sector defined by <center position>,
[position player,getdir player,30,position enemy_tank] call BIS_fnc_inAngleSector // <center angle of sector> and <sector width>.
will return true if the vehicle named enemy_tank is within 30 degrees of where the player is pointing. //
*/ // Example:
// Revision History: // [position player, getDir player, 30, position enemy_tank] call BIS_fnc_inAngleSector
// 09/01/08 0.1 - First cut VBS2 // will return true if the vehicle named enemy_tank is within 30 degrees of where the player is pointing.
//------------------ //
private["_small","_large","_xpos","_ypos","_dir2","_dir3"]; ///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Optimized for 1.0.7.1
//
// Transpose the rightmost radial arm to 0 degrees and calculate target direction
// using CCW trig convention. Keep sector width to < 180 degrees when calling this function.
//
///////////////////////////////////////////////////////////////////////////////////////////////////
local _source = _this select 0; // center position
local _width = _this select 2; // sector width
local _target = _this select 3; // target position
local _px = (_target select 0) - (_source select 0); // x relative
local _py = (_target select 1) - (_source select 1); // y relative
local _dir = -(_px atan2 _py) + 360; // get CCW relative angle from x,y coords
local _relDir = (_dir + (_this select 1) + (_width * 0.5)) % 360; // transpose target direction by source direction plus half angle sector
_r = false; _relDir <= _width // is target in angle sector?
_small = (_this select 1) - ((_this select 2) / 2);
_large = (_this select 1) + ((_this select 2) / 2);
_xpos = ((_this select 3) select 0) - ((_this select 0) select 0);
_ypos = ((_this select 3) select 1) - ((_this select 0) select 1);
_dir1 = _xpos atan2 _ypos;
if (_dir1 < 0) then {_dir1 = _dir1 + 360};
_dir2 = _dir1 - 360;
_dir3 = _dir1 + 360;
if ((_dir1 >= _small && _dir1 <= _large) || (_dir2 >= _small && _dir2 <= _large) || (_dir3 >= _small && _dir3 <= _large)) then {_r = true};
_r