Php 创建具有特定半径的多边形
我有一个有一定半径的多边形。差不多。现在我需要Php 创建具有特定半径的多边形,php,mysql,Php,Mysql,我有一个有一定半径的多边形。差不多。现在我需要 将其插入mysql数据库 查找点是位于多边形的内部还是外部。(是否包括获取其顶点?) 如何实现这一点?对点进行分类需要完全定义多边形。通常,您需要多边形周围的顶点按顺序排列,或者需要一些完全定义多边形的约束(例如:规则、以原点为中心、一个顶点位于+x轴上以及给定数量的边)。如果多边形是自相交的,则还需要定义在这种情况下“内部”和“外部”的含义(有几个非等效的定义) 编辑:如果你在谷歌上搜索“php多边形”,你会发现很多用于多边形点测试的代码(例
- 将其插入mysql数据库
- 查找点是位于多边形的内部还是外部。(是否包括获取其顶点?)
如何实现这一点?对点进行分类需要完全定义多边形。通常,您需要多边形周围的顶点按顺序排列,或者需要一些完全定义多边形的约束(例如:规则、以原点为中心、一个顶点位于+x轴上以及给定数量的边)。如果多边形是自相交的,则还需要定义在这种情况下“内部”和“外部”的含义(有几个非等效的定义) 编辑:如果你在谷歌上搜索“php多边形”,你会发现很多用于多边形点测试的代码(例如,尽管我不保证代码的正确性)。
这个有效。但是真的,难道你没有发现语法错误吗 查找,如果点是否位于多边形内,则将在更新中完成
//this assumes that the orientation of your polygon is
//http://en.wikipedia.org/wiki/File:Pentagon.svg
$pass=1;
function filter($init, $final, $center)
{
if(($final['a']['x']-$init['x'])*($center['y']-$init['y'])-($final['a']['y'] - $init['y'])*($center['x']-$init['x']) > 0)
return $final['a'];
else
return $final['b'];
}
function getNextPoint($init, $center, $distance, $slope)
{
global $pass;
$final['a']['x'] = $init['x']+$distance/sqrt(1+tan($slope)*tan($slope));
$final['a']['y'] = $init['y']+(tan($slope)*$distance)/sqrt(1+tan($slope)*tan($slope));
$final['b']['x'] = $init['x']-$distance/sqrt(1+tan($slope)*tan($slope));
$final['b']['y'] = $init['y']-(tan($slope)*$distance)/sqrt(1+tan($slope)*tan($slope));
echo "<br/><br/>";
echo "Pass: $pass <br/>";
echo "Slope: ".$slope."<br/>";
if($pass == 1){
$point = $final['b'];
$distance = $distance*2*sin(pi()/5);
$slope = 0;
}
else{
$point = filter($init, $final, $center);
$slope = $slope+pi()/2.5;
}
echo "Position: ";
print_r($point);
echo "<br/>";
echo "Distance : ".distance($init['x'], $init['y'], $point['x'], $point['y']);
if($pass == 7){
return $point;
}
else{
//echo "x: ".($point['x'])." y: ".($point['y'])." <br/>";
$pass++;
getNextPoint($point, $center, $distance, $slope);
}
//echo "x: ".($point['x'])." y: ".($point['y'])." <br/>";
}
function polygon($vertices=5, $centerX=10, $centerY=10, $radius=5)
{
$internalangle = ($vertices-2)*pi()/$vertices;
$slope = pi()+($internalangle)/2;
$init['x'] = 10;
$init['y'] = 10;
getNextPoint($init, $init, 5, $slope);
}
polygon();
/*
function getx($slope, $x1, $y1, $y)
{
return (($y-$y1)/$slope+$x1);
}
function gety($slope, $x1, $y1, $x)
{
return ($slope*($x-$x1)+$y1);
}
*/
function distance($initx, $inity, $finalx, $finaly)
{
return sqrt(($initx-$finalx)*($initx-$finalx)+($inity-$finaly)*($inity-$finaly));
}
function getslope($final, $init)
{
return atan(($final['y']-$init['y'])/($final['x']-$init['x']))*180/pi();
}
//这假设多边形的方向是
//http://en.wikipedia.org/wiki/File:Pentagon.svg
$pass=1;
函数过滤器($init、$final、$center)
{
如果($final['a']['x']-$init['x'])*($center['y']-$init['y'])-($final['a']['y']-$init['y'])*($center['x']-$init['x'])>0)
返回$final['a'];
其他的
返回$final['b'];
}
函数getNextPoint($init、$center、$distance、$slope)
{
全球美元通行证;
$final['a']['x']=$init['x']+$distance/sqrt(1+tan($slope)*tan($slope));
$final['a']['y']=$init['y']+(tan($slope)*$distance)/sqrt(1+tan($slope)*tan($slope));
$final['b']['x']=$init['x']-$distance/sqrt(1+tan($slope)*tan($slope));
$final['b']['y']=$init['y']-(tan($slope)*$distance)/sqrt(1+tan($slope)*tan($slope));
回声“
”;
回显“通过:$Pass
”;
回声“斜率:.$Slope.”
;
如果($pass==1){
$point=$final['b'];
$distance=$distance*2*sin(pi()/5);
$slope=0;
}
否则{
$point=过滤器($init,$final,$center);
$slope=$slope+pi()/2.5;
}
回声“位置:”;
打印(点数);
回声“
”;
回声“距离:。距离($init['x'],$init['y'],$point['x'],$point['y']);
如果($pass==7){
返回$point;
}
否则{
//回声“x:”($point['x'])。“y:”($point['y'])。“
”;
$pass++;
getNextPoint($point、$center、$distance、$slope);
}
//回声“x:”($point['x'])。“y:”($point['y'])。“
”;
}
函数多边形($顶点=5,$centerX=10,$centerY=10,$radius=5)
{
$internalangle=($Vertexts-2)*pi()/$Vertexts;
$slope=pi()+($internalangle)/2;
$init['x']=10;
$init['y']=10;
getNextPoint($init,$init,5,$slope);
}
多边形();
/*
函数getx($slope,$x1,$y1,$y)
{
收益率(($y-$y1)/$slope+x1);
}
函数gety($slope、$x1、$y1、$x)
{
回报率(斜率*($x-$x1)+$y1);
}
*/
函数距离($initx、$inity、$finalx、$finaly)
{
返回sqrt(($initx-$finalx)*($initx-$finalx)+($inity-$finaly)*($inity-$finaly));
}
函数getslope($final,$init)
{
返回atan($final['y']-$init['y'])/($final['x']-$init['x'])*180/pi();
}
这与php或mysql有什么关系?多边形数据必须存储在mysql数据库中,并且应该使用php检索相同的数据,以获取顶点并确定其中是否存在点。我为我的问题添加了更多细节。多边形是规则的还是不规则的,没有顶点(即常数或变量)?顶点越多,麻烦就越多,而且你还需要事先知道多边形的方向检查多边形的点,但我想知道,如果我只知道多边形的半径,我怎么能在多边形中找到一个点。多边形在原点居中。即使多边形在原点居中并且是正多边形(所有边和角度都相等),这也不够。考虑一个半径为1的正方形。如果对角线与X轴和Y轴对齐,则点(.75,0)位于正方形内;如果对角线为45度,则不是。好的,听起来我需要多边形点来确定点是否在多边形内。如果我有多边形的半径,我至少能找到顶点吗?@dskanth-不!您需要知道多边形是如何围绕原点旋转的。再想想正方形的例子,多边形绕原点逆时针旋转。例如,我有一个原点(10,10),多边形的半径为5,多边形有5条边(顶点)。很抱歉,当我尝试使用时,得到了一个空值:echo point_in_reg_poly(4,5,10,10);我已经有一段时间没有用PHP编写代码了。可能模%
运算符对浮点数无效。不过,PI很可能不是一个定义的常数。将其视为php风格的伪代码这似乎适用于5个顶点的正多边形(五角大楼)。但尚未尝试使用4或6个顶点。
//this assumes that the orientation of your polygon is
//http://en.wikipedia.org/wiki/File:Pentagon.svg
$pass=1;
function filter($init, $final, $center)
{
if(($final['a']['x']-$init['x'])*($center['y']-$init['y'])-($final['a']['y'] - $init['y'])*($center['x']-$init['x']) > 0)
return $final['a'];
else
return $final['b'];
}
function getNextPoint($init, $center, $distance, $slope)
{
global $pass;
$final['a']['x'] = $init['x']+$distance/sqrt(1+tan($slope)*tan($slope));
$final['a']['y'] = $init['y']+(tan($slope)*$distance)/sqrt(1+tan($slope)*tan($slope));
$final['b']['x'] = $init['x']-$distance/sqrt(1+tan($slope)*tan($slope));
$final['b']['y'] = $init['y']-(tan($slope)*$distance)/sqrt(1+tan($slope)*tan($slope));
echo "<br/><br/>";
echo "Pass: $pass <br/>";
echo "Slope: ".$slope."<br/>";
if($pass == 1){
$point = $final['b'];
$distance = $distance*2*sin(pi()/5);
$slope = 0;
}
else{
$point = filter($init, $final, $center);
$slope = $slope+pi()/2.5;
}
echo "Position: ";
print_r($point);
echo "<br/>";
echo "Distance : ".distance($init['x'], $init['y'], $point['x'], $point['y']);
if($pass == 7){
return $point;
}
else{
//echo "x: ".($point['x'])." y: ".($point['y'])." <br/>";
$pass++;
getNextPoint($point, $center, $distance, $slope);
}
//echo "x: ".($point['x'])." y: ".($point['y'])." <br/>";
}
function polygon($vertices=5, $centerX=10, $centerY=10, $radius=5)
{
$internalangle = ($vertices-2)*pi()/$vertices;
$slope = pi()+($internalangle)/2;
$init['x'] = 10;
$init['y'] = 10;
getNextPoint($init, $init, 5, $slope);
}
polygon();
/*
function getx($slope, $x1, $y1, $y)
{
return (($y-$y1)/$slope+$x1);
}
function gety($slope, $x1, $y1, $x)
{
return ($slope*($x-$x1)+$y1);
}
*/
function distance($initx, $inity, $finalx, $finaly)
{
return sqrt(($initx-$finalx)*($initx-$finalx)+($inity-$finaly)*($inity-$finaly));
}
function getslope($final, $init)
{
return atan(($final['y']-$init['y'])/($final['x']-$init['x']))*180/pi();
}