« 01.04 インフルエンザ前線 | ココ | 01.06 急降下 »

2007年1月 5日

続・外接円   このエントリーを含むはてなブックマーク 

外接円の半径Rを求める式が、正弦定理の他に、面積Sを使って

R=abc/4S

というのを知ってしまった(というか改めて覚えた)。しかし…使いたいのが外接円の中心(外心)であることに気が付いてしまった。外心…? どうやって求めるんやったっけ。ググってみる。


「外接円の中心は、各辺の垂直二等分線の・・・」

あ、そうやった。思い出した。もう幾何もすっかり記憶の彼方な理系人。直線の式を使って、ゴリゴリと外心の座標を求める式まで見つけた。ここで思う。

もっとスマートにいけるんちゃう…?

そういえば、∠B×2=∠AOCなんてのもあったな…これと内積を使ってできないか…考えること40分。ムリだった。幾何の証明を複素平面を使って計算してるサイトを見つけた。

お、ベクトルの代わりに複素数でやればええのか…とやってみる。
△ABCの外接円Oについて、ADが直径となる点Dをとり、ABCDの各点に、複素平面上の値としてα、β、γ、δをあてる。つまり、Oは(α+δ)/2となる。Oは外心なので、

| β - (α+δ)/2 | = | γ - (α+δ)/2 |

が言える。ここで、(α+δ)/2をXとおくと、| β - X |^2 = | γ - X |^2 。

これを展開して、
β^2 - γ^2 = 2X(β - γ)
X = (β^2 - γ^2) / 2(β - γ)
Xは、外心。

あ、これで求まった。これにまた30分。むー…。
でもこれは間違ってるので、別の方法をまた今度。

あとは、これをVBでやるために、複素数計算の代わりにPointF構造体を使って、関数を作ると。
Function AddPoints(ByVal a As PointF, ByVal b As PointF) As PointF
Function SubtractPoints(ByVal a As PointF, ByVal b As PointF) As PointF
Function MultiplyPoints(ByVal a As PointF, ByVal b As PointF) As PointF
Function DividePoints(ByVal a As PointF, ByVal b As PointF) As PointF
まあ、これは普通の複素数計算を、Xを実部、Yを虚部として計算するだけなので。

直線の交点を求める式を使うよりも、遥かにスマートに解けた。素晴らしきかな複素数。ちなみに、直線を使う方法はこちらで。
おそらく、直線を使う方法よりかはステップ数が少なくて済みそうな気がする。1つ三角形の外接円を出すだけならステップ数は関係なくても、200個の点を使って最適な外接円の組み合わせを決めるとなるとステップ数は少ないに越したことはない。

昨日から、外接円と格闘した、そんな仕事初め。ビミョー。

By ただ at 15:22 カテゴリー ; mein Erbe

« 01.04 インフルエンザ前線 | 01月の記事 | 01.06 急降下 »




トラックバック

このエントリーのトラックバックURL:
http://pinmarch.sakura.ne.jp/mt/mt-tb.cgi/756

このリストは、次のエントリーを参照しています: 続・外接円:

» 外接円[再] from PinMarch
この前の外心を求める式があまりにおかしな間違いをしていたので、もう一度求めてみる...

トラックバック時刻: 2009年7月13日 23:58