C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[15]: 時計回り、反時計回り判定 [1]


(過去ログ 18 を表示中)

[トピック内 44 記事 (21 - 40 表示)]  << 0 | 1 | 2 >>

■6255 / inTopicNo.21)  Re[1]: 時計回り、反時計回り判定
  
□投稿者/ y4yama (11回)-(2007/08/07(Tue) 08:54:00)
No6130 (セイン さん) に返信
> 時計回り、反時計回りの判定方法として、下記サイトの一番上に書いてある行列の計算から求めてみましたが、

今回の図形は、時計回りですね。それに対して、
Dim vt(,) As Double = New Double(,) { _
{169.90084838867187, 206.44012451171875} _
, {169.90084838867187, 204.56155395507812} _
, {261.70086669921875, 204.56155395507812} _
, {261.70086669921875, 206.44012451171875} _
, {261.7508544921875, 206.40176391601562} _
, {261.80084228515625, 206.38104248046875} _
, {261.80084228515625, 110.74208068847656} _
, {261.80084228515625, 110.74208068847656} _
, {261.7508544921875, 110.72137451171875} _
, {261.70086669921875, 110.68299865722656} _
, {261.70086669921875, 112.56156921386719} _
, {169.90084838867187, 112.56156921386719} _
, {169.90084838867187, 110.68299865722656} _
, {169.85086059570312, 110.72137451171875} _
, {169.80084228515625, 110.74208068847656} _
, {169.80084228515625, 206.38104248046875} _
, {169.85086059570312, 206.40176391601562} _
, {169.90084838867187, 206.44012451171875} _
}
Dim sum As Double = 0.0
Dim i
For i = 0 To 16
sum = sum + (vt(i, 0) * vt(i + 1, 1) - vt(i + 1, 0) * vt(i, 1)) / 2.0 'VB2005のための表記
Next
これで、sumは-8464.73637が得られました。([0]と[17]は同一点だから、i = 0 To 16 で充分です。また[6][7]は同一点だけど、そこの外積=0になるから気にしなくてよい)
Jittaさん、 Zeeさん、ありがとうございました (横レスすみませんです)
こちらで沢山勉強させていただいた通り、外積/2 の和は総面積になります。(今回の図形では、ほぼ幅=92.00 高さ=92.00でして
92*92=8464 )
そして、sum<0だから時計回りですね!
セインさん、何が問題なのでしょうか?
引用返信 編集キー/
■6257 / inTopicNo.22)  Re[2]: 時計回り、反時計回り判定
□投稿者/ セイン (19回)-(2007/08/07(Tue) 09:50:02)
セイン さんの Web サイト
2007/08/07(Tue) 11:10:26 編集(投稿者)

No6255 (y4yama さん) に返信
> ■No6130 (セイン さん) に返信
>>時計回り、反時計回りの判定方法として、下記サイトの一番上に書いてある行列の計算から求めてみましたが、
> Dim sum As Double = 0.0
> Dim i
> For i = 0 To 16
> sum = sum + (vt(i, 0) * vt(i + 1, 1) - vt(i + 1, 0) * vt(i, 1)) / 2.0 'VB2005のための表記
> Next
> これで、sumは-8464.73637が得られました。([0]と[17]は同一点だから、i = 0 To 16 で充分です。また[6][7]は同一点だけど、そこの外積=0になるから気にしなくてよい)
> Jittaさん、 Zeeさん、ありがとうございました (横レスすみませんです)
> こちらで沢山勉強させていただいた通り、外積/2 の和は総面積になります。(今回の図形では、ほぼ幅=92.00 高さ=92.00でして
> 92*92=8464 )
> そして、sum<0だから時計回りですね!
> セインさん、何が問題なのでしょうか?

>時計回り、反時計回りの判定方法として、下記サイトの一番上に書いてある行列の計算から求めてみましたが、
これ、基本なんでしょうが面白いですね。ただし、3点に限る!ですね


あれ?ということは、3点には限らず、すべてに対応可能ということでしょうか?

>[0]と[17]は同一点だから、i = 0 To 16 で充分です
すいません。見逃していました^^;

>また[6][7]は同一点だけど、
ということは、わざわざ同じ点だからどうという判定話でいけるということですね。


確認しました。
そうですね。僕の方法でも正しい答えを得ることができていました。
僕が間違っていたのが、OpenGLで法線を与えるとき、最初の3点を基準に法線を決めていたため、
全体は反時計回り、最初の3点は時計回りなどのとき、光っている面が逆になっていました。すいません。



テーマとしては非常に面白いテーマだと思うので、考えるのは楽しいですよね。
外角=360度のほうが精度が高いとかあるのかな?



OpenGL法線
http://verygood.aid.design.kyushu-u.ac.jp/opengl/material.html


引用返信 編集キー/
■6269 / inTopicNo.23)  Re[3]: 時計回り、反時計回り判定
□投稿者/ セイン (20回)-(2007/08/07(Tue) 11:25:06)
>y4yama さんへ

わざわざコードまで書いていただきありがとうございます。
C++で書いた僕の式でも同じ値-8464.73637が出ましたのですっきりしました。

ちなみに僕のコードで/10000.0 と割る数字が2.0でない理由は、
大きな円を0.1度刻みぐらいにした座標を受けたとき、
Dim sum As Double = 0.0
の最大値をオーバーしてしまうことがあるためです。

自分で作っていたにもかかわらず、これが面積をあらわすことを忘れていました。ありがとうございます。
現状のままでやってみますが、問題がありそうでしたら、ぜひ教えてください。

解決済み
引用返信 編集キー/
■6280 / inTopicNo.24)  Re[4]: 時計回り、反時計回り判定
□投稿者/ y4yama (13回)-(2007/08/07(Tue) 14:37:54)
No6269 (セイン さん) に返信

> Dim sum As Double = 0.0
> の最大値をオーバーしてしまうことがあるためです。
Double はめったなことでは(月へ行って帰っても)オーバーはありえないのでは・・・(,,E-324 〜 1.79769313486231570E+308 の範囲の値)
有効桁数の問題かな?(でも、10000で割っても解消はされないし)

No6226 (Zee さん) の
> つうことでこんな多角形の面積計算公式があります。
> A = 1/2 SUM(X2 - X1) (Y1 + Y2)
が、また、すごいのです
sum2 = sum2 + (vt(i + 1, 0) - vt(i, 0)) * (vt(i, 1) + vt(i + 1, 1)) / 2.0
結果は15桁がsumと全く同じです(+−は逆)。2点とX軸(へおろした垂線)で作る台形の面積を利用しているのです
そして勿論、(例えばY方向に移動するとかで)図形の位置に係わらずにキチンと面積が出ましたヨ〜
以上、補足まで。どうもありがとうございました!
解決済み
引用返信 編集キー/
■6703 / inTopicNo.25)  Re[5]: 時計回り、反時計回り判定
□投稿者/ セイン (21回)-(2007/08/22(Wed) 15:12:14)
以前はありがとうございました。

再びすいません!

同一平面状にかならずいる3次元座標で同じようなことは可能だと思いますか?
いろいろ考えてみたのですが、わかりません。

Z座標を無視して考えては見たものの、面が垂直に立っていると、XY座標だけ見ると、重なっているため、
回転方向がわかりませんでした。

お忙しいところすいませんが、ご教授 相談 発想 よろしくお願いします。
引用返信 編集キー/
■6704 / inTopicNo.26)  Re[6]: 時計回り、反時計回り判定
□投稿者/ y4yama (14回)-(2007/08/22(Wed) 16:09:52)
No6703 (セイン さん) に返信
> 同一平面状にかならずいる3次元座標で同じようなことは可能だと思いますか?
ベクトルの外積分の計算は3次元でも成り立ちます。

> Z座標を無視して考えては見たものの、面が垂直に立っていると、XY座標だけ見ると、重なっているため、
無視しては、ダメです。ぐぐってみればすぐわかると思いますよ

同一平面上に、ある点(基準)o を設定して(p1,p2,p3とは離れていること!)、o_p1,o_p2,o_p3,...というようにベクトルを考えれば、以前のXYでやったのと同じでありますが・・・
この平面のどちらが表なのかをどう定義しますかねぇ〜
引用返信 編集キー/
■6777 / inTopicNo.27)  Re[7]: 時計回り、反時計回り判定
□投稿者/ Zee (17回)-(2007/08/23(Thu) 18:24:03)
Zee さんの Web サイト
No6704 (y4yama さん) に返信
> ■No6703 (セイン さん) に返信
>>同一平面状にかならずいる3次元座標で同じようなことは可能だと思いますか?
> ベクトルの外積分の計算は3次元でも成り立ちます。
>
>>Z座標を無視して考えては見たものの、面が垂直に立っていると、XY座標だけ見ると、重なっているため、
> 無視しては、ダメです。ぐぐってみればすぐわかると思いますよ
>
> 同一平面上に、ある点(基準)o を設定して(p1,p2,p3とは離れていること!)、o_p1,o_p2,o_p3,...というようにベクトルを考えれば、以前のXYでやったのと同じでありますが・・・
> この平面のどちらが表なのかをどう定義しますかねぇ〜

最初の同一点がある時に、何となく感じていましたけども・・・

体積の計算は行列計算でできますが、多面体の公式はいろいろあります。(難しいですけども)
3次元になると2次元と定義が違ってきます。
(右とか左とかどの視点から見てどうかということがそもそも難しい)

前にも書きましたが、
右回り左回りの解析に入る前に
取り扱うデータに重複した座標がないかチェックし
有れば排除して計算するような仕組みにするほうが良いと思います。

測量も3次元でデータは扱いますが
面積計算と土量計算を行う計算は全く別のロジックです。

重複した座標点が存在すると形成する三角形の面積に0を含むモノができるので、
測量計算ソフトでもチェックする工程が入っています。

Z軸を視点と仮定しないと、右回り左回りと言う概念の定義がおかしくなりませんか?
引用返信 編集キー/
■6835 / inTopicNo.28)  Re[8]: 時計回り、反時計回り判定
□投稿者/ y4yama (17回)-(2007/08/24(Fri) 16:05:58)
No6777 (Zee さん) に返信

> 体積の計算は行列計算でできますが、多面体の公式はいろいろあります。(難しいですけども)
> 3次元になると2次元と定義が違ってきます。
> (右とか左とかどの視点から見てどうかということがそもそも難しい)
>
> 測量も3次元でデータは扱いますが
> 面積計算と土量計算を行う計算は全く別のロジックです。

No6703では、
> 同一平面状にかならずいる3次元座標で同じようなことは可能だと思いますか?
> いろいろ考えてみたのですが、わかりません。
と、ありますので、「体積」でなくて、面積だと思いました・・・Zee さんは体積と考えられています・・

>Z軸を視点と仮定しないと、右回り左回りと言う概念の定義がおかしくなりませんか?
に話を戻しますと、
X,Yで考えていた時にも、外積の計算をしたら実はZも(というかZのみ)計算していた!と思えば
1つの三角形で計算された面直のベクトルk(つまりZ成分のみ)の方向は+か−なのですが
これは、V1からV2へ(180度以内で)右ネジの回る向きを表す・・・であって、−Z軸向きに視点を固定したら
右回り左回りと言う概念が出てくるのだけれど、3Dになったら、逆に意味がない(と思う)ので、
3Dでは、面直のベクトルは(i,j,k)で計算されますから、このベクトル向きで、例えば物体の外/内とか判断すればいいのかな?と考えてます
引用返信 編集キー/
■6924 / inTopicNo.29)  Re[9]: 時計回り、反時計回り判定
□投稿者/ Zee (18回)-(2007/08/27(Mon) 15:02:06)
Zee さんの Web サイト
No6835 (y4yama さん) に返信
> No6703では、
>>同一平面状にかならずいる3次元座標で同じようなことは可能だと思いますか?
>>いろいろ考えてみたのですが、わかりません。
> と、ありますので、「体積」でなくて、面積だと思いました・・・Zee さんは体積と考えられています・・
3次元の要素を一度に取り扱うと面倒な計算になるので、あえて体積としただけです。
Z値に関しては、ある面に投影したのちに、面積を算出する方法で、左右を判断するという風にするほうが良いと思います。
どういった場面でこのロジックが使われるかは書いておられませんが、

生データのそのままの要素で左右は判断出来ないんじゃないでしょうか。
セインさんが理解しておられる前提条件がこちらに十分伝わっていない感じもします。

> これは、V1からV2へ(180度以内で)右ネジの回る向きを表す・・・であって、−Z軸向きに視点を固定したら
> 右回り左回りと言う概念が出てくるのだけれど、3Dになったら、逆に意味がない(と思う)ので、
> 3Dでは、面直のベクトルは(i,j,k)で計算されますから、このベクトル向きで、例えば物体の外/内とか判断すればいいのかな?と考えてます

ねじの軸で考えると、凹多角形の重心(基準となる中心)はその物体内に入らない場合があり、例外が発生すると思いますが。

引用返信 編集キー/
■6993 / inTopicNo.30)  Re[10]: 時計回り、反時計回り判定
□投稿者/ セイン (22回)-(2007/08/28(Tue) 14:54:39)
お返事遅くなりました。
皆さんありがとうございます。

同じ平面状にいるということは、面の法線が求まるということですよね。
それを利用すれば、何とかなるのかなとも思ったのですが、いかがでしょうか?

たとえば3点をピックアップしていきながら、上向きの法線の数と
下向きの法線の数を数えるという方法です。



引用返信 編集キー/
■7002 / inTopicNo.31)  Re[11]: 時計回り、反時計回り判定
□投稿者/ y4yama (18回)-(2007/08/28(Tue) 16:20:06)
No6993 (セイン さん) に返信
三日月の形を考えてみましょう。
ヘコの部分の辺の数とトツの部分の辺の数はどちらが多くても
右まわりは成立しますよネ? だから、法線の向きの数ではNGです
上/下という表現はNGですね。Zが上として、YZ平面では法線は-Xか +Xの
どちらか(上/下なし)に向くでしょう?

XY平面についての前回までの復習ですが(セインさんは、ほとんど理解してないみたいなので)
原点をoとして、o_P1,o_P2という2つのベクトルの(外積/2)は,三角形(o,P1,P2)の面積です
(外積/2)<0ならo〜P1〜P2は時計回りですね(+Zから-Zのほうへ見て)
2つのベクトルの(外積/2)は,実は、(i,j,k)というベクトルです。i=j=0のためkだけで
話をしていたのです。(k/2<0ということだった)
では、Pnまで多数の点があるときですが、
凸(辺が8本)を紙に書いて、原点oをこの凸の左の外に書いてください。
o〜P3〜P4,o〜P4〜P5...というように個々の三角形で(外積/2)=面積に着目すると
+や−のkがでてきますね。ここは+、ここは−と塗り潰していくと、
原点の位置には関係なく、三角形の面積が丁度残ることが確認できます。
(判りにくいかな? これ以上は説明がヘタでして・・・)

3Dでのある平面だとしたら、2つのベクトルの(外積/2)は,(i,j,k)というベクトルです。
その大きさは面積を表します

以上のヒントで、3次元でも成り立つはずだ・・ということがわかってきましたか?
引用返信 編集キー/
■7047 / inTopicNo.32)  Re[12]: 時計回り、反時計回り判定
□投稿者/ Zee (19回)-(2007/08/29(Wed) 13:19:20)
Zee さんの Web サイト
No7002 (y4yama さん) に返信
> ■No6993 (セイン さん) に返信
> 凸(辺が8本)を紙に書いて、原点oをこの凸の左の外に書いてください。
> o〜P3〜P4,o〜P4〜P5...というように個々の三角形で(外積/2)=面積に着目すると
> +や−のkがでてきますね。ここは+、ここは−と塗り潰していくと、
> 原点の位置には関係なく、三角形の面積が丁度残ることが確認できます。
> (判りにくいかな? これ以上は説明がヘタでして・・・)
>
> 3Dでのある平面だとしたら、2つのベクトルの(外積/2)は,(i,j,k)というベクトルです。
> その大きさは面積を表します
>
> 以上のヒントで、3次元でも成り立つはずだ・・ということがわかってきましたか?

全くその通りですね。

付け足すと
XYが同一の座標でZだけが異なる値とすると
Zを切り捨てた時(同じ面に正斜投影)した時に、連続する2点が同じ座標になるわけです。
この例外を避けるように作ればいい。

ご紹介した公式は同一点が無いことが条件になっているからです。
引用返信 編集キー/
■7092 / inTopicNo.33)  Re[13]: 時計回り、反時計回り判定
□投稿者/ セイン (23回)-(2007/08/30(Thu) 11:07:40)
y4yamaさんZee さん ありがとうございます(TT)

今初歩から考え直しています。(外積/2が面積ということもまだりかいしきれていないので)

反時計回り4点の場合
x y z
A -10 -10 0
B 10 -10 0
C 10 10 0
D -10 10 0


Aを原点と考えたすべてのベクトルは
ベクトル

AB 20 0 0
AC 20 20 0
AD 0 20 0



外積は
AB×AC 0 0 400
AC×AD 0 0 400

abcで成り立つ三角形の面積は、(20*20)/2 =200
AB×AC/2 = 200(おお!)

(400+400)/2=400←面積



時計回り
x y z
A -10 -10 0
B -10 10 0
C 10 10 0
D 10 -10 0


AB 0 20 0
AC 20 20 0
AD 20 0 0


AB×AC 0 0 -400
AC×AD 0 0 -400

(-400+-400)/2 = -400←これの絶対値が面積


ここまでの考え方OKですよね?
引用返信 編集キー/
■7093 / inTopicNo.34)  Re[14]: 時計回り、反時計回り判定
□投稿者/ セイン (24回)-(2007/08/30(Thu) 11:12:12)
2007/08/30(Thu) 11:22:16 編集(投稿者)
2007/08/30(Thu) 11:21:45 編集(投稿者)
2007/08/30(Thu) 11:19:27 編集(投稿者)

<pre><pre>■No7092 (セイン さん) に返信
> 時計回り
> 	x	y	z
> A	-10	-10	0
> B	-10	10	0
> C	10	10	0
> D	10	-10	0
↓
これをAD点を基点に90度立てると、
座標	x	y	z
A	-10	-10	0
B	-10	-10	20
C	10	-10	20
D	10	-10	0

ベクトル			
AB	0	0	20
AC	20	0	20
AD	20	0	0
			
外積			
AB×AC	0	400	0
AC×AD	0	400	0


むむむ 90度立てただけのつもりなのですが、やはりプラスマイナスが逆に出ます・・・(TT)
↓参考にみました。
http://shigihara.hp.infoseek.co.jp/vx_index.htm
http://yosshy.sansu.org/gaiseki.htm
2つのベクトル
 a=(xa、ya、za)、b=(xb、yb、zb)
に対して、aとbの外積a×bを以下のように定義する。
 a×b=(yazb−ybza、zaxb−zbxa、xayb−xbya)
</pre></pre>

引用返信 編集キー/
■7103 / inTopicNo.35)  Re[15]: 時計回り、反時計回り判定
□投稿者/ y4yama (19回)-(2007/08/30(Thu) 12:09:20)
> ここまでの考え方OKですよね?
OKと思います。

No7093 (セイン さん) に返信
> むむむ 90度立てただけのつもりなのですが、やはりプラスマイナスが逆に出ます・・・(TT)
外積 AB×AC =(i=0,j=400,k=0)
をうまく計算されていますね。だから面直ベクトルである(i=0,j=400,k=0)がA〜B〜Cという三角に対する
法線の向きです。OKです。斜めに向いた平面でも3Dでこの(i,j,k)が法線の向きというのはOKですヨ
時計回り、反時計回りという言葉は、今は忘れてください

例えば、さいころを置いたとき、6面のうち、上の面と下の面に、XY平面がありますが
表裏が逆になるでしょ?

引用返信 編集キー/
■7117 / inTopicNo.36)  Re[16]: 時計回り、反時計回り判定
□投稿者/ セイン (25回)-(2007/08/30(Thu) 13:18:29)
No7103 (y4yama さん) に返信
>>ここまでの考え方OKですよね?
> OKと思います。
>
> ■No7093 (セイン さん) に返信
>>むむむ 90度立てただけのつもりなのですが、やはりプラスマイナスが逆に出ます・・・(TT)
> 外積 AB×AC =(i=0,j=400,k=0)
> をうまく計算されていますね。だから面直ベクトルである(i=0,j=400,k=0)がA〜B〜Cという三角に対する
> 法線の向きです。OKです。斜めに向いた平面でも3Dでこの(i,j,k)が法線の向きというのはOKですヨ
> 時計回り、反時計回りという言葉は、今は忘れてください
>
> 例えば、さいころを置いたとき、6面のうち、上の面と下の面に、XY平面がありますが
> 表裏が逆になるでしょ?
>

y4yama さんありがとう!

あ! なんとなくわかってきました。
i=x方向
j=y方向
k=z方向
という風に考えてみると、上から見て時計回りの座標列の法線は下向き(zがマイナス値)
それをAD基準に立ててみると法線がy軸方向にプラス向きになりますね!
だから最後にもとまった外積がAB×AC =(i=0,j=400,k=0) Y方向にプラス向きなんですね。
なるほどぉ。

ということは、i j k の値の絶対値を足してあげれば、3次元座標列の面積が求まるんですかね?
もっというと各値を面積で割ってあげれば、OpenGLの法線
http://verygood.aid.design.kyushu-u.ac.jp/opengl/material.html#normal
が求まる!っと考えてよいのかな?

引用返信 編集キー/
■7125 / inTopicNo.37)  Re[17]: 時計回り、反時計回り判定
□投稿者/ y4yama (20回)-(2007/08/30(Thu) 14:48:33)
No7117 (セイン さん) に返信
> ということは、i j k の値の絶対値を足してあげれば、3次元座標列の面積が求まるんですかね?
絶対値?はてな?
各i j k 成分の値毎に足してあげれば、(sum_i,sum_j,sum_k)というベクトルsum_Vになります
このベクトルsum_Vの長さの1/2が面積のはずです(以前に私ウソをかいてま〜す)
XYだけのときに、sum_kだけを計算したのを思い出してネ(k の値の絶対値を足したりしてないでしょう)

> もっというと各値を面積で割ってあげれば、OpenGLの法線
> http://verygood.aid.design.kyushu-u.ac.jp/opengl/material.html#normal
> が求まる!っと考えてよいのかな?
OpenGLの法線は、長さ=1.0 でなくてもいいようです。たとえば、glNormal3f(3 , 0 , -2); とか
だから、glNormal3fか3d(sum_i,sum_j,sum_k);
で 充分じゃないですか
かなり勉強されたようですね。一緒におつきあいして、こちらも収穫がありました。サンキュです
引用返信 編集キー/
■7127 / inTopicNo.38)  Re[18]: 時計回り、反時計回り判定
□投稿者/ セイン (26回)-(2007/08/30(Thu) 15:06:58)
No7125 (y4yama さん) に返信
> ■No7117 (セイン さん) に返信
>>ということは、i j k の値の絶対値を足してあげれば、3次元座標列の面積が求まるんですかね?
> 絶対値?はてな?
> 各i j k 成分の値毎に足してあげれば、(sum_i,sum_j,sum_k)というベクトルsum_Vになります
> このベクトルsum_Vの長さの1/2が面積のはずです(以前に私ウソをかいてま〜す)
> XYだけのときに、sum_kだけを計算したのを思い出してネ(k の値の絶対値を足したりしてないでしょう)
>
>>もっというと各値を面積で割ってあげれば、OpenGLの法線
>>http://verygood.aid.design.kyushu-u.ac.jp/opengl/material.html#normal
>>が求まる!っと考えてよいのかな?
> OpenGLの法線は、長さ=1.0 でなくてもいいようです。たとえば、glNormal3f(3 , 0 , -2); とか
> だから、glNormal3fか3d(sum_i,sum_j,sum_k);
> で 充分じゃないですか
> かなり勉強されたようですね。一緒におつきあいして、こちらも収穫がありました。サンキュです


みなさんの励ましがあったおかげです。
答えを言ってしまえば簡単ですが、しっかり考える機会を持てるように誘導していただけないと
こんな結果にはなりませんでしたよ^^;
ありがとうございます。
今週末にでも 自分のホームページの片隅に、時計回り 反時計回りの求め方と、法線の求め方、3次元面積の求め方を
まとめてみようと考えています。

せっかくですので、それが出来上がった時点で解決マークつけさせてください。
ありがとうございます。

引用返信 編集キー/
■7214 / inTopicNo.39)  Re[13]: 時計回り、反時計回り判定
□投稿者/ Jitta (413回)-(2007/08/31(Fri) 21:36:29)
No7047 (Zee さん) に返信
Zeeさんのセッション内容けってぇ〜!!(笑)
「測量技術の応用〜実世界から仮想世界へ〜」

おそらくセインさんの質問は、3D-CAD 関係ではないでしょうか。あるいは、3D game でポリゴンを描画する方法、描くか描かないかの判定でしょう。右回りか左回りかの判定から、隠れているかどうかが判定できると、どこかで読んだ記憶がある。

引用返信 編集キー/
■7221 / inTopicNo.40)  Re[19]: 時計回り、反時計回り判定
 
□投稿者/ れい (96回)-(2007/08/31(Fri) 23:26:30)
2007/09/01(Sat) 00:03:33 編集(投稿者)

No6132 (れい) に返信
> Clockwise/Unclockwiseの判定は
> 簡単でエレガントな方法があります。

言い逃げした
れいです。

No7127 (セイン さん) に返信
> 今週末にでも 自分のホームページの片隅に、時計回り 反時計回りの求め方と、法線の求め方、3次元面積の求め方を
> まとめてみようと考えています。

解決したようでなにより。

乗り遅れて、面積で盛り上がっていたので遠慮してましたが、
言い逃げはあんまりなんで、私の知ってる回答を。

私の知っている方法は
1) 最大値最小値による方法
2) 外積を用いた符号付面積による方法
3) 外角を積算していく方法
の3つで、どれも一長一短ですので、目的に応じて選ぶ必要があります。

2)は皆さんと同じです。
凹多角形に使えますが、捩れている多角形には使えません。
また、頂点が増えると精度の問題が発生します。

3)は外角を足すだけで、細かいテクニックはありますが、arctanが必要で、重いです。
図形が何回捩れているのかわかるのはこれだけです。

1)は多点のポリゴンでよく用いられる方法で、一番軽く、早いです。
捩れている場合には使えません。
これを説明します。

ポリゴンの全頂点をスキャンし、
xが最大となる頂点Aを調べます。

この頂点の前後の点BCを調べ、
線分ABと線分ACの傾きの大小で右回り、左回りが判定できます。
(前後の点が同じxの場合はどちらかをAとしてやり直しです)
ABの傾き>ACの傾きなら左回り
ACの傾き>ABの傾きなら右回りです。
ここで外積を使って判断することも可能です。

これは、xの最小値でもyの最小値でも、x+yの最小値でもできますし、
組み合わせる方法もあるようです。
(ちょっとうろ覚えで何回か嘘書きました。訂正済み。

ポリゴンが3点の場合は速度的にも外積が最もよい方法ですが、
頂点が増えるほど(1)の方法が速度的に有利になります。

この辺りの話は、線型代数やベクトル演算の分野ですので、
勉強することをお勧めします。

法線など、予想外の情報が簡単に手に入ったり、
人間には簡単に思えるものがなかなか計算できなかったり、
楽しいですよ。
引用返信 編集キー/

<前の20件 | 次の20件>
トピック内ページ移動 / << 0 | 1 | 2 >>

管理者用

- Child Tree -