<?php
$vertices = [];
class PVector{
public $x;
public $y;
public function __construct( $x, $y) {
$this->x = $x;
$this->y = $y;
}
}
function generatePolygon($countPolyPoint = 1000){
$vertices = [];
$rad = 200;
$cx = 200;
$cy = 200;
$pi2 = pi()*2;
for($i = 0 ; $i < $countPolyPoint; $i++)
array_push($vertices,new PVector(
$cx + ($rad+ rand(0,100)) * cos($pi2* ($i/$countPolyPoint)) ,
$cy + ($rad+ rand(0,100)) * sin($pi2* ($i/$countPolyPoint))
));
return $vertices;
}
function click($vertices,$x,$y){
$start = microtime(true);
echo polyPoint($vertices,$x,$y)?"Есть вхождение":"Нет входения";
echo ' Время выполнения скрипта: '.(number_format((microtime(true) - $start)/1000,2,'.','') ).' мс.';
echo "\n";
}
$vertices = generatePolygon();
click($vertices,0,0);
click($vertices,0,100);
click($vertices,100,100);
click($vertices,200,200);
click($vertices,500,500);
// POLYGON/POINT
function polyPoint($vertices, $px, $py) {
$collision = false;
$next = 0;
for ($current=0; $current<count($vertices); $current++) {
$next = $current+1;
if ($next == count($vertices)) $next = 0;
$vc = $vertices[$current];
$vn = $vertices[$next];
if ((($vc->y >= $py && $vn->y < $py) || ($vc->y < $py && $vn->y >= $py)) &&
($px < ($vn->x-$vc->x)*($py-$vc->y) / ($vn->y-$vc->y)+$vc->x)) {
$collision = !$collision;
}
}
return $collision;
}
?>
Нет входения Время выполнения скрипта: 0.00 мс.
Есть вхождение Время выполнения скрипта: 0.00 мс.
Есть вхождение Время выполнения скрипта: 0.00 мс.
Есть вхождение Время выполнения скрипта: 0.00 мс.
Нет входения Время выполнения скрипта: 0.00 мс.