Перейти к содержимому


Фотография

Функция для получения четырех реальных углов здания


  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 OFFLINE   Ibragim

Ibragim

    Сержант

  • Пользователи
  • 161 сообщений

Отправлено 17 February 2021 - 15:15

Эта функция с точностью 1° вычисляет четыре реальных угла здания, не те, которые вычисляет boundinBoxReal:

PC_fn_get_four_building_corners_ASL = 
	{
		params ["_building"];
		
		_boundingBoxReal = boundingBoxReal _building; 
		_hypotenuse = sqrt (((_boundingBoxReal select 1 select 0)^2)+((_boundingBoxReal select 1 select 1)^2));
		//_angle = atan ((_boundingBoxReal select 1 select 1)/(_boundingBoxReal select 1 select 0));
		_center = [((getPosASL _building) select 0),((getPosASL _building) select 1),((getPosASL _building) select 2)+0.1];
		
		/// Вычисление четырех углов:
		
		_all_distances_and_positions1 = [];

			{		
				_intersect_array = lineIntersectsSurfaces [ATLToASL (_building getRelPos [_hypotenuse,_x]),_center, player, objNull, true, 1, "VIEW", "FIRE", true];
				_position = _intersect_array select 0 select 0;
				_distance = _center distance2D _position;
				_all_distances_and_positions1 = _all_distances_and_positions1 + [[_distance,_position]];
			} forEach [22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67];

		_all_distances_and_positions1 sort false;

		_corner_1 = _all_distances_and_positions1 select 0 select 1; /// Первый угол

		_all_distances_and_positions2 = [];

			{		
				_intersect_array = lineIntersectsSurfaces [ATLToASL (_building getRelPos [_hypotenuse,_x]),_center, player, objNull, true, 1, "VIEW", "FIRE", true];
				_position = _intersect_array select 0 select 0;
				_distance = _center distance2D _position;
				_all_distances_and_positions2 = _all_distances_and_positions2 + [[_distance,_position]];
			} forEach ([22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67] apply {_x + 90});

		_all_distances_and_positions2 sort false;

		_corner_2 = _all_distances_and_positions2 select 0 select 1; /// Второй угол

		_all_distances_and_positions3 = [];

			{		
				_intersect_array = lineIntersectsSurfaces [ATLToASL (_building getRelPos [_hypotenuse,_x]),_center, player, objNull, true, 1, "VIEW", "FIRE", true];
				_position = _intersect_array select 0 select 0;
				_distance = _center distance2D _position;
				_all_distances_and_positions3 = _all_distances_and_positions3 + [[_distance,_position]];
			} forEach ([22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67] apply {_x + 180});

		_all_distances_and_positions3 sort false;

		_corner_3 = _all_distances_and_positions3 select 0 select 1; /// Третий угол

		_all_distances_and_positions4 = [];

			{		
				_intersect_array = lineIntersectsSurfaces [ATLToASL (_building getRelPos [_hypotenuse,_x]),_center, player, objNull, true, 1, "VIEW", "FIRE", true];
				_position = _intersect_array select 0 select 0;
				_distance = _center distance2D _position;
				_all_distances_and_positions4 = _all_distances_and_positions4 + [[_distance,_position]];
			} forEach ([22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67] apply {_x + 270});

		_all_distances_and_positions4 sort false;

		_corner_4 = _all_distances_and_positions4 select 0 select 1; /// Четвертый угол

		//{createVehicle ["VR_3DSelector_01_exit_F", ASLToATL _x, [], 0, "CAN_COLLIDE"]} forEach [_corner_1, _corner_2, _corner_3, _corner_4];
		
		/// Возвращение массива с углами в формате ASL:
		
		[_corner_1,_corner_2,_corner_3,_corner_4];
	};

[_building] call PC_fn_get_four_building_corners_ASL;

  • 0




Яндекс.Метрика