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();
}