本篇的重点其实是圆周取点算法,说是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