01-08-2021, 09:56 AM
Does anyone have, or know of a script that will locate the centre of mass of a group of players? I have an idea, but I need to be able to locate the centre point of a group of players to do it.
/* Find a circle [center, radius] enclosing all given units
* Note: This isn't the smalles circle around the units. Calculating the smallest
* circle is O(n²) and not really a necessity for us.
*
* The simple approach here is to find the lowest and highest x and y coordinates,
* and then form a circle enclosing that rectangle
*/
private _minX = (getPos (_this select 0)) select 0;
private _maxX = (getPos (_this select 0)) select 0;
private _minY = (getPos (_this select 0)) select 1;
private _maxY = (getPos (_this select 0)) select 1;
{
private _nx = (getPos _x) select 0;
private _ny = (getPos _x) select 1;
if (_nx < _minX) then {
_minX = _nx;
};
if (_nx > _maxX) then {
_maxX = _nx;
};
if (_ny < _minY) then {
_minY = _ny;
};
if (_ny > _maxY) then {
_maxY = _ny;
};
} foreach _this;
private _center = [(_maxX + _minX)/2, (_maxY + _minY)/2, 0];
private _radius = [_maxX, _maxY, 0] distance _center;
[_center, _radius];
Varanon Wrote:I use this in our framework:
Code:
/* Find a circle [center, radius] enclosing all given units
* Note: This isn't the smalles circle around the units. Calculating the smallest
* circle is O(n²) and not really a necessity for us.
*
* The simple approach here is to find the lowest and highest x and y coordinates,
* and then form a circle enclosing that rectangle
*/
private _minX = (getPos (_this select 0)) select 0;
private _maxX = (getPos (_this select 0)) select 0;
private _minY = (getPos (_this select 0)) select 1;
private _maxY = (getPos (_this select 0)) select 1;
{
private _nx = (getPos _x) select 0;
private _ny = (getPos _x) select 1;
if (_nx < _minX) then {
_minX = _nx;
};
if (_nx > _maxX) then {
_maxX = _nx;
};
if (_ny < _minY) then {
_minY = _ny;
};
if (_ny > _maxY) then {
_maxY = _ny;
};
} foreach _this;
private _center = [(_maxX + _minX)/2, (_maxY + _minY)/2, 0];
private _radius = [_maxX, _maxY, 0] distance _center;
[_center, _radius];
It's not optimal (i.e. the circle could still be tighter), but it works for, for example, spawning stuff outside the player's bubble
Mjolnir Wrote:So I've come back to this, and you're going to have to explain how to use this to me like I'm 5 please, cause I dont know where to start
_playable = (if (isMultiplayer) then {playableUnits} else {switchableUnits});
_players = [];
{
if (side _x != sideLogic) then {
_players pushBack _x;
};
} forEach _playable;
_circle = _players call compile preprocessFIleLineNumbers "script.sqf";
hint format ["The players are in a circle at %1 with radius %2", _circle select 0, _circle select 1};