• Модуль: location
  • Путь к файлу: ~/bitrix/modules/location/lib/geometry/type/polygon.php
  • Класс: BitrixLocationGeometryTypePolygon
  • Вызов: Polygon::isPointInsideClosedRing
private function isPointInsideClosedRing(LineString $lineString, Point $point): bool
{
	$polygonContainsPoint = false;

	$componentsCount = $lineString->getComponentsCount();

	$lineStringPoints = $lineString->getComponents();
	$lineStringLats = [];
	$lineStringLngs = [];

	/** @var Point $point */
	foreach ($lineStringPoints as $lineStringPoint)
	{
		$lineStringLats[] = $lineStringPoint->getLat();
		$lineStringLngs[] = $lineStringPoint->getLng();
	}

	for ($node = 0, $altNode = $componentsCount - 1; $node < $componentsCount; $altNode = $node++)
	{
		$condition = ($lineStringLngs[$node] > $point->getLng()) !== ($lineStringLngs[$altNode] > $point->getLng())
			&& ($point->getLat() < ($lineStringLats[$altNode] - $lineStringLats[$node])
				* ($point->getLng() - $lineStringLngs[$node])
				/ ($lineStringLngs[$altNode] - $lineStringLngs[$node]) + $lineStringLats[$node]);

		if ($condition)
		{
			$polygonContainsPoint = !$polygonContainsPoint;
		}
	}

	return $polygonContainsPoint;
}