Php 检测点是否位于正方形的圆子集内

Php 检测点是否位于正方形的圆子集内,php,math,collision-detection,Php,Math,Collision Detection,我需要在网格上绘制圆内的图像 请参见下面的网格/圆的图片 绿色圆圈是容器,不应在外部绘制图像 见下面的例子。紫色方块=未放置,黄色方块=已放置(因为它们位于绿色圆圈内,将适合) 彩色方块表示将要放置的图像 正方形为50x50。而网格瓷砖为100x100 目前,我的程序将生成圆圈、网格,并在每个网格磁贴内标记X,而不管它是否在容器圆圈内 请参阅下面的程序工作和放置图像示例 我如何计算图像是否适合圆形内的瓷砖 function withinCircle(x, y) { re

我需要在网格上绘制圆内的图像

请参见下面的网格/圆的图片

绿色圆圈是容器,不应在外部绘制图像

见下面的例子。紫色方块=未放置,黄色方块=已放置(因为它们位于绿色圆圈内,将适合)

彩色方块表示将要放置的图像

正方形为50x50。而网格瓷砖为100x100

目前,我的程序将生成圆圈、网格,并在每个网格磁贴内标记X,而不管它是否在容器圆圈内

请参阅下面的程序工作和放置图像示例

我如何计算图像是否适合圆形内的瓷砖

function withinCircle(x, y) {       

   return ((r - x)*(r - x) + (y - r)*(y - r) < r * r) ;       

}
if (x1 < r) dx= r - x1; else dx= x2 - r;
if (y1 < r) dy= r - y1; else dy= y2 - r;
if dx * dx + dy * dy <= r * r
    // Wholly inside
瓷砖不必100%位于圆内。请参见第二幅图。请参见中间底部的瓷砖。瓷砖略微突出圆形,但图像50x50仍然可以放在瓷砖内部

请参阅下面的函数,该函数将X放置在每个网格内。

公共函数placeImages()
{
$box=5;
$700;
$width=($percentral/$box);
$this->grid=array(
排列(
“宽度”=>
排列(
“x1”=>0,
“y1”=>0,
'x2'=>700,
“y2”=>0,
),
“高度”=>
排列(
“x1”=>0,
“y1”=>0,
“x2”=>0,
‘y2’=>700,
),
),
排列(
“宽度”=>
排列(
“x1”=>0,
‘y1’=>140,
'x2'=>700,
‘y2’=>140,
),
“高度”=>
排列(
“x1”=>140,
“y1”=>0,
'x2'=>140,
‘y2’=>700,
),
),
排列(
“宽度”=>
排列(
“x1”=>0,
'y1'=>280,
'x2'=>700,
‘y2’=>280,
),
“高度”=>
排列(
“x1”=>280,
“y1”=>0,
“x2”=>280,
‘y2’=>700,
),
),
排列(
“宽度”=>
排列(
“x1”=>0,
'y1'=>420,
'x2'=>700,
“y2”=>420,
),
“高度”=>
排列(
“x1”=>420,
“y1”=>0,
'x2'=>420,
‘y2’=>700,
),
),
排列(
“宽度”=>
排列(
“x1”=>0,
'y1'=>560,
'x2'=>700,
‘y2’=>560,
),
“高度”=>
排列(
“x1”=>560,
“y1”=>0,
'x2'=>560,
‘y2’=>700,
),
),
排列(
“宽度”=>
排列(
“x1”=>0,
‘y1’=>700,
'x2'=>700,
‘y2’=>700,
),
“高度”=>
排列(
'x1'=>700,
“y1”=>0,
'x2'=>700,
‘y2’=>700,
),
),
);
//这将删除循环中不需要的底部和右侧行的网格项。
数组\u pop($this->grid);
foreach($this->grid作为$grid){
$x=$grid['width']['x1'];
$y=$grid['width']['y1'];
对于($j=0;$j<$box;$j++){
$this->drawine($x,$y,($x+$width),($y+$width),“#ff3200”);
$this->drawine($x+$width),$y,$x,($y+$width),“#ff3200”);
//50 × 50=图像大小
$imageX=地板($x+($width-50)/2);
$imageY=地板($y+($width-50)/2);;
$image=image::make(基本路径('test.png'))->不透明度(50);
$this->image->insert($image,‘左上’,$imageX,$imageY);
$x=$x+$width;
}
}
}

上面的代码是我程序的简化版本。网格数组是动态生成的,但我认为这与这个问题无关

您可以测试正方形的角是否在圆内。 如果正方形的一个顶点是(a,b), 如果是sqrt(a^2+b^2)>半径,则无法绘制

这是假设圆的中心有坐标(0,0),如果不是这样,并且圆有坐标(x,y),我们需要将所有点移动(-x,-y),在这种情况下,测试是:


sqrt((a-x)^2+(b-y)^2)>半径。

只要点在圆内,该方程就满足:

(x-中心^2+(y-中心^y)^2<半径^2

所以你应该在插入图像之前检查它

对于所有角点,您只需检查其中一个角点,具体取决于您所在图表的四分之一。f、 e,右上角的四分之一,图像_x是$x,图像_y是$y(去掉休息宽度并除以2)。对于左下四分之一,为,$x,$-y

更详细的,检查边界。考虑到圆位于(0,0),半径为700:

$bounding_x = $x;
$bounding_y = $y;

if($x > 0)
   $bounding_x += width;

if($x < 0)
   $bounding_x -= width;

if($y > 0)
   $bounding_y += width;

if($y < 0)
   $bounding_y -= width;

if ($bounding_x*$bounding_x + $bounding_y*$bounding_y < 490000)
//....insert image
$bounding\ux=$x;
$bounding_y=$y;
如果($x>0)
$bounding_x+=宽度;
如果($x<0)
$bounding_x-=宽度;
如果($y>0)
$bounding_y+=宽度;
如果($y<0)
$bounding_y-=宽度;
if($bounding_x*$bounding_x+$bounding_y*$bounding_y<490000)
//…插入图像

判断正方形是否在圆内的基本理论是检查i
function withinCircle(x, y) {       

   return ((r - x)*(r - x) + (y - r)*(y - r) < r * r) ;       

}
if (x1 < r) dx= r - x1; else dx= x2 - r;
if (y1 < r) dy= r - y1; else dy= y2 - r;
if dx * dx + dy * dy <= r * r
    // Wholly inside