ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

多角形があるとき、指定された点が多角形に含まれているかを判断するPHPプログラム。

2007-03-11 21:39:20 | PHP

 以前、複数の自由に書いた図形の交わっているところを求める方法というのを書いたとき、


小問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)
で、範囲内に入っているかどうかを、チェックしています。




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Hello World程度のデータベース(その10:概念スキーマ(8)第三正規形の方法)

2007-03-11 18:30:20 | 土日シリーズ

情報処理とは何から、データベースの基本的な話(情報処理試験のデータベーススペシャリスト程度の話まで)を書く、土日のシリーズ「Hello World程度のデータベース」です。

現在、正規化についてやっています。
データを1箇所にだけ現れるようにする手法が正規化で、正規化のレベルとして、第一正規形から第五正規形まであります。でも、普通DBを作るには第一~第三正規形まででよく、それは、以下のとおりです。

第一正規形:繰り返しをなくす
第二正規形:エンティティごとにまとめ、主キーを決め、
   主キーが決まると、他の属性値の値がきまるようにする
    →これを主キーに対して完全関数従属といいます
第三正規形:主キー以外で、ある値が決まると、他の値が決まってしまう

 前回は、第二正規形をやりました。今回は、第三正規形にする方法です。




■第三正規形とは
 第二正規形では、あるエンティティにかかわる属性値を集めて、そのなかで、エンティティを一意に決めることのできるものを主キーにしました。
 これで、エンティティに関しては、1事実1箇所になったのですが、エンティティが違っても、ある属性値が決まってしまうと、他の属性値も決まってしまうことがあります。

 たとえば、郵便番号と都道府県です。
 郵便番号が決まると、その都道府県は、きまってしまいます(多分)

 これは、郵便番号のつけかたは、1つの番号で2つの県にまたがって付けることはないという決まりが(たぶん)あって、そのためです。
 もし、ある番号が、秋田県と岩手県両方をカバーしている(2つの県の県境が範囲だったとした場合)、この決まりは、いっぺんに終わってしまいます(^^;)

 でも、まず、そんなことはしねーだろー、郵政公社は。。って思いますよね。

 なので、この場合、郵便番号テーブルというのをつくって、郵便番号と都道府県をわけることができます。

 このように、エンティティは違うんだけど、2つ(以上)の値に、一方の値が決まると、かならずもう一方はこの値になるという、決まりがあるとき、この決まり(関係を)「推移関数従属性」っていいます。
(げんみつにいうと、主キーがきまると、郵便番号が決まり、郵便番号がきまると、都道府県が決まるという関係になってるとき)

 この「推移関数従属性」をはじくのが、第三正規形です。




■第三正規形を行うと危険な場合

 しかし、第二正規形とちがい、第三正規形を行うと危険な場合があります。
 第二正規形は、エンティティに基づいて行う、つまり、エンティティというモノの担保がありますが、第三正規形は、決まりです。なので、この決まりが崩壊してしまうと、第三正規形も崩壊してしまいます。

 たとえば、以下にあがっている例
Part5 RDBの正規化理論を学ぶ
http://itpro.nikkeibp.co.jp/article/lecture/20061128/255079/?ST=lecture&P=3

を考えて見ましょう。

ここの例では、社員番号がきまると、部署がきまり、部署が決まると内線番号が決まる。だから、部署と内線番号は第三正規形として分離できるというものでした。

 しかし、この部署がきまると、内線番号が決まるというのは、上記の郵便局と都道府県の例よりかは、弱い決まりです。
 郵便局と都道府県の関係は、かえてしまったら、みんな郵政公社に文句がたがた!いうので、まず変わりません。

 しかし、部署と内線番号は、会社のリストラで、2つの部署を内線1つにしてしまったり、1つの部署に内線2つおく(遠く離れてしまった・人が増えたなどで)っていうように、簡単にその関係を崩される可能性があります。

 もし、第三正規形で、部署と内線番号のテーブルを別々にしたのに、その後、上記のように、2つの部署を1つの内線にしてしまったり、1つの部署を2つの内線にされてしまったら。。
 そのときにDBの修正をかけないといけませんけど、それは。。。無理(^^;)

 ってことで、第三正規形にしていいかどうかというのは、ちょっと考えたほうがいい場合もあります。




■あるキーが動けば、値も動くというのなら、第二も第三もおなじ

 なお、上記のリンク先の例に指摘されているとおり、第二正規形も第三正規形も、あるキーが動けば、値も動くということで、同じカタチをしています。したがって、エンティティということを意識しなければ、第二、第三正規形っていうものは、一緒にできます。しかし、第二正規形は、エンティティ=「もの」を表しているのでロバストなのに、第三正規形は「決まり」をベースとしているため、結構変わるリスクがあります。

 このリスクを意識するためにも、第二と第三を意識して、操作したほうがいいかもしれません。




■正規化を崩すということ
 なお、正規化を崩すというとき、この第三正規形をしないでパフォーマンスを上げます。コレに対し、佐藤正美氏は、正規化しないと噛み付くという言い方をしてますが(本当に噛み付くらしい??)佐藤正美氏の行っている正規化理論で行った場合、第三正規形は、「みなしエンティティの分離」になります。佐藤正美氏は、このみなしエンティティの分離自体は、上級者以外(たしか、四段だっけ??)には認めていないと思いました。

 なので、第三正規形を崩す行為は、かならずしもいけないとは、いいきれません。

 とくに、上記の将来変更されるリスクがある場合は、あえて、第三正規形をしないで、DBとしてロバストにしておく場合もあります(上記の例の場合、内線をわけるのは、きけんかもお??)




 ということで、今回のお話はここでおわり&正規化については、ここでおしまいです。



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

「続きはWebで」「○○で検索」に効果はあるのか?

2007-03-11 14:50:35 | Weblog

ここの調査
「続きはWebで」「○○で検索」に効果はあるのか?調べてみました
http://markezine.jp/a/article/aid/830.aspx

のよると、検索キーワード広告(「続きはWebで」「○○で検索」という広告)について
(以下斜体は、上記サイトより引用)


「見たことがある」という回答が最も多かったのは「テレビCM」であり、その全体に占める割合は62%であった。雑誌広告(44%)と新聞広告(37%)がテレビCMに続いている。


そうだが、

指定検索キーワード広告を「見たことがある人」に占める「実際に検索した人」の割合は、雑誌が最も高かった(約58%)。絶対数で勝るテレビではあるが、割合では雑誌に劣るようだ(約48%)。


詳しくは、上記リンク先をみてもらうとして。。

昔、プチリタで、ポスターにURLをいれても、アクセスしてくれる人はまったくだった。。みたいなことがかいてあったような記憶があります(記憶違いかも)
それから考えると、最近は、検索してくれる人が増えたといえるかもしれない。

どれが多いか少ないかにかんしては、母数が少ないので(^^;)



  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする