Untitled

mail@pastecode.io avatar
unknown
csharp
2 years ago
3.5 kB
3
Indexable
atac_fnc_drawTriangle = {
	params ['_triangles'];
	private _ctrl = (findDisplay 5000) displayCtrl 5201;
	_ctrl setVariable ["triangles",_triangles];
	_ctrl ctrlAddEventHandler ["Draw",
	{
		private _triangles = (findDisplay 5000) displayCtrl 5201 getVariable "triangles";
		diag_log format["Треугольники получены: %1",_triangles];
		{
			diag_log format["На отрисовку: %1",_x];
			_this select 0 drawTriangle
			[
				_x,
				[1,0,0,0.5],
				"#(rgb,1,1,1)color(1,1,1,1)"
			];
		} forEach _triangles;
	}];
};

diag_log "НАЧАЛО!!!!!!!!!!!!!!!!!!!!!!!!";
private _points = [];
private _triangles = [];
private _pass = false;
private _notFinished = true;
private _time = 0;
private _x2 = 0;
private _x3 = 0;
{
	private _str = _x splitString "_";
	if (_str # 0 == "t") then {
		
		_points pushBack (getMarkerPos _x);
	};
} forEach allMapMarkers;
//Проверка, чтобы треугольник идущий до начальной точки был выпуклым
diag_log format["Полный список: %1",_points];

private _pointsOrigin = +_points;


while {_notFinished} do {
	_time = _time + 1;
	diag_log format["Цикл: %1",_time];
	{
		diag_log format["Полный список: %1",_points];
		diag_log format["Текущая точка: %1",_x];
		if (count _points == 3) exitWith {
			_x2 = _points # 1;
			_x3 = _points # 2;
			private _markerX = ((_x # 0) + (_x2 # 0) + (_x3 # 0)) / 3;
			private _markerY = ((_x # 1) + (_x2 # 1) + (_x3 # 1)) / 3;
			diag_log format["Центр треугольника: [%1, %2]",_markerX,_markerY];
			if ([_markerX,_markerY,0] inPolygon _pointsOrigin) then {
				_triangles pushBack _points;
				diag_log "Точка в полигоне!";
				diag_log format["Передаём треугольник: [%1, %2, %3]",_x, _x2, _x3];
			} else {
				diag_log "Точка не в полигоне!";
			};
			_notFinished = false;
			diag_log "Конец";
		};

		if ((count _points) - 1 == _forEachIndex) then {
			diag_log "Последняя точка!";
			if ((_points # 1 # 0) == (_points # 1 # 0)) then {
				diag_log "Точка не проверяется!";
			};
			_x2 = _points # 0;
			_x3 = _points # 1;
		} else {
			if ((count _points) - 2 == _forEachIndex) then {
				diag_log "Предпоследняя точка!";
				_x2 = _points # (_forEachIndex + 1);
				_x3 = _points # 0;
			} else {
					_x2 = _points # (_forEachIndex + 1);
					_x3 = _points # (_forEachIndex + 2);

			};
		};
		if (_pass) then {
			_pass = false;
			_points deleteAt _forEachIndex;
			diag_log format["Пропускаем точку: %1",_x];
		} else {
			
			diag_log format["Точки +1,+2: %1, %2",_x2,_x3];
			private _markerX = ((_x # 0) + (_x2 # 0) + (_x3 # 0)) / 3;
			private _markerY = ((_x # 1) + (_x2 # 1) + (_x3 # 1)) / 3;
			diag_log format["Центр треугольника: [%1, %2]",_markerX,_markerY];
			if ([_markerX,_markerY,0] inPolygon _pointsOrigin) then {
				_triangles pushBack [_x, _x2, _x3];
				_pass = true;
				diag_log format["Передаём треугольник: [%1, %2, %3]",_x, _x2, _x3];
			} else {
				diag_log "Точка снаружи";
			};
		};
		diag_log format["Конец цикла для: %1 из %2",_forEachIndex + 1,count _points];
	} forEach _points;
};
diag_log format["Треугольники: %1",_triangles];
[_triangles] call atac_fnc_drawTriangle;