以前、複数の自由に書いた図形の交わっているところを求める方法というのを書いたとき、
小問1:多角形(ポリゴン)があるとき、その多角形に指定された点が含まれているか
というのに
(あ)まず、指定された多角形を書き、色を塗る(青にしましょうか)
→背景は白とします。
(い)指定された点を取ってくる(getPixel()で)
(う)(あ)で塗った色だったら、入ってる、背景の色だったら、入ってない
というものを書きましたけど、そーいうことをするPHPプログラムを書いてみました。
こんなかんじ
■仕様
http://127.0.0.1/area_check.php?wh=250,250&point=0,0,200,0,100,100&chk=100,200,100,50
のように、
whに、幅と高さをカンマ付きで指定し、
pointで、その範囲の点を、x1,y1,x2,y2,x3,y3。。。のように、カンマでくぎって、XYの点を順次指定していき(例の場合は、(0,0),(200,0),(100,100)の3点を指定している=3角形)
chkで、調べる点をx1,y1,x2,y2,x3,y3。。。のように、カンマでくぎって、XYの点を順次指定していく(例の場合は、(100,200),(100,50)の2点をチェックしている)
と、結果として以下のようなカタチ
<?xml version="1.0" encoding="UTF-8" ?> <inout> <item> <x>100</x> <y>200</y> <result>0</result> </item> <item> <x>100</x> <y>50</y> <result>1</result> </item> </inout> |
(上記< > ¥は、本当は半角)
resultが0なら入ってない、それ以外なら入ってる
(実際には1になると思うけど)とする。
なお、環境として、サーバー側にはGDが入っているとする。
■ソース
ソースはこんなかんじ
<?php // check $image = area_set($_GET["wh"],$_GET["point"]); $chk_arr = explode(",",$_GET["chk"]); for($i = 0 ; $i * 2 < count($chk_arr) ; $i ++ ) { $ret[$i] = inout($image,$chk_arr[$i*2]. "," .$chk_arr[$i*2+1]); } imagedestroy($image); //result out header("Content-type: text/xml"); print('<?xml version="1.0" encoding="UTF-8" ?>'."¥n"); print("<inout>"."¥n"); for($i = 0 ; $i * 2 < count($chk_arr) ; $i ++ ) { print("<item>¥n"); print("<x>".$chk_arr[$i*2]."</x>"."¥n"); print("<y>".$chk_arr[$i*2+1]."</y>"."¥n"); print("<result>".$ret[$i]."</result>"."¥n"); print("</item>¥n"); } print("</inout>"."¥n"); function area_set($width_hight,$point) { $wh = explode(",",$width_hight); $width = $wh[0]; $hight = $wh[1]; $area = explode(",",$point); // create image $image = imagecreate($width, $hight); // set colors $bg = imagecolorallocate($image, 0, 0, 0); $bg = imagecolortransparent ($image ,$bg); $blue = imagecolorallocate($image, 0, 0, 255); // draw a polygon imagefilledpolygon($image, $area, count($area)/2 , $blue); return $image; } function inout($image,$chk) { $xy = explode(",",$chk); $x = $xy[0]; $y = $xy[1]; // get Blue Color $rgb = imagecolorat($image, $x, $y); return $rgb; } ?> |
(上記< > ¥は、本当は半角)
上記関数の
function area_set($width_hight,$point)
で、指定範囲をセットしています(青くしています)
function inout($image,$chk)
で、範囲内に入っているかどうかを、チェックしています。
![](https://mokano.main.jp/card/analsysimg.cgi?imgfname=gokusho.jpg&ID=bun070310)