Php圆周取点算法

本篇的重点其实是圆周取点算法,说是Php只是因为通过Php的进行编码而已,使用其他语言均可。

首先概述一下圆周取点算法的需求:以 O(Xo,Yo) 为圆心,d 为半径画一个圆,从圆心角0度开始,依次显示出在这个圆上直线间距为 t 的所有点的坐标。

如图:

在这个圆 O上所有直线间距为t的点的坐标为 P1、P2…Pn

接下来看算法:

①如上图,通过圆的简单定理可以知道在同一个圆上当两个扇形的弦长即 t 相等时,其圆心角也是相等的,因此本算法可以将 t 转换为圆心角度数再做计算:

SinO` = t / 2r
∠O` = arcsin(SinO`)
∠O = 2∠O`

此时即将弦长 t 转换成了对应的圆心角。

②接下来我们根据圆心角计算出对应的点的坐标,使用公式如下:

Xn = Xo + r * Cos(0°* (n-1))
Yn = Yo + r * Sin(0°* (n-1))

此时Pn(Xn,Yn)即是我们需要求出的圆上的点。

根据上述公式进行Php编程:

首先是创建一个html表单,用于输入数据

1
2
3
4
5
6
7
8
9
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">

    当前坐标X:<input type="text" name="x" value="0"/></br></br>
    当前坐标Y:<input type="text" name="y"  value="0"/></br></br>
    半径R:<input type="text" name="r"  value="1"/></br></br>
    距离T:<input type="text" name="t"  value="1"/></br></br>
    <input type="submit" name="submit" value="生成" />

</form>

这里的 action=”<?php echo $_SERVER['PHP_SELF']; ?>” 的意思是 当提交表单时,数据post的目标地址是本页面。表单效果如图:

接下来添加Php代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
        if (isset($_POST['submit'])) {
            $PXo=  $_POST["x"];//获取圆心坐标Xo
            $PYo=  $_POST["y"];//获取圆心坐标Yo
            $R=  $_POST["r"];//获取半径r
            $T=  $_POST["t"];//获取间距t
            $SinA = $T / (2 *$R);//计算SinO`
            $Angle_R = 2 * rad2deg(asin($SinA));//计算圆心角∠O度数
            echo "---------------</br>";
            echo "单位圆心角Angle_R = " . $Angle_R ."</br>";
            echo "---------------</br>";
            echo "生成目标点列表:</br>";
            $count = 0;
            for ($i=0; $i<360; $i+= $Angle_R) {
                $count++;
                $Sin_R_Angle = sin(deg2rad($i));
                $Cos_R_Angle = cos(deg2rad($i));
                $PXt = $PXo + $R * $Cos_R_Angle;
                $PYt = $PYo + $R * $Sin_R_Angle;
                echo "坐标" . $count .": (" . $PXt . "  ,  " . $PYt . ")</br>" ;
            };
        }
?>

上面的代码将循环依次计算出间隔为1倍、2倍…n倍的圆心角所确定的点的坐标。
需要注意:Php中使用sin方法时需要使用deg2rad方法将数值转换为角度来计算 如 $Sin_R_Angle = sin(deg2rad($i))
同时 asin反Sin出来的数值(弧度值)需要使用rad2deg方法将其转换为角度 如 $Angle_R = 2 * rad2deg(asin($SinA))

最后运行得出结果的效果如图:

本算法可运用于一些定位项目的取点,将x、y换成经纬度,对应的数值单位换成实际的米或公里即可。
本篇到此,谢谢关注。

BeiTown
2013.05.27

本文链接:Php圆周取点算法

转载声明:BeiTown原创,转载请注明来源:BeiTown's Coder 编码之源,谢谢


Tags: , , , , ,

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>