円運動アルゴリズム

[戻る]
ちる 2002/10/16(水) 11:44:03
お世話になっております。
アルゴリズムに関してですがなかなかスマートな案が思いつかないので
良い方法があれば教えてください。

<仕様>
等間隔、時計回りで1〜8までの番号の付いた1枚の円盤あります。
現在のポイント(任意)から指定した移動先に"最短距離"で移動します。
例えば「番号1」から「番号7」に移動したい場合、反時計回りで2つ進みます。

<一応考えたアルゴリズム>
1〜4の場合と5〜8の場合に分けて考える。

★1〜4の場合
移動先が自分の数より大きい場合かつ対角上の点より小さい場合・・・時計回り移動
それ以外・・・反時計回り移動

★5〜8の場合
移動先が自分の数より小さい場合かつ対角上の点より大きい場合・・・反時計回り移動
それ以外・・・時計回り移動

★何ステップ移動するか?
ここが思いつきません><

一応、移動する方向だけは出してみたのですが
どれぐらい進めばいいのかというところがうまく考え付きません。

らふ 2002/10/16(水) 11:55:29
らふです。

「移動先−現在地」(1) と
「現在地ー(移動先-8)」(2)
を比べて小さい方にその数分だけ進めばいいんじゃないですかね?
(マイナスがでたら無視)

(1)なら時計回り、(2)なら反時計回りに。
#はしょりすぎてちょっとわかりにくいかな…?

投稿の例(「番号1」から「番号7」に移動したい場合 ) でいうと、
(1) 7-1 = 6
(2) 1 - ( 7- 8 ) = 2
なので、反時計回りに二つ進むことになります。

プログラム的にはもっとスマートにかけそうです。

dairygoods 2002/10/16(水) 12:04:41
こんな感じでどうでしょう。

現在位置: p
移動先: q
時計回り移動量 = (q - p + 8) % 8
反時計回り移動量 = (p - q + 8) % 8
ただし、位置は0〜7です。

ちる 2002/10/16(水) 13:50:27
[[解決]]
ご回答ありがとうございます。

>>らふ様
いくつかパターンを試してみたところ
移動先の数が小さくかつ一週回るような数へ移動する場合は無理でした><

例えば7から1へ移動する場合です。
(1) 1 - 7 = -6
(2) 7 - (1 - 8) = 14
移動すべきは反時計回りに2ポイントなので・・・ 

>>dairygoods
いつもありがとうございます。
上記アルゴリズムに組み込んでみようと思います。

解決でっす!

ちる 2002/10/16(水) 13:51:32
[[解決]]
敬称忘れ^^;;

>>dairygoods様
ありがとうございました。

アイススケーター 2002/10/16(水) 17:41:27
dairygoodsさんのロジックでよいと思いますが。
>現在位置: p
>移動先: q
>時計回り移動量 = (q - p + 8) % 8
>反時計回り移動量 = (p - q + 8) % 8

最後に移動量の小さいほうに回転すればOKです。

古いスレッドには追加発言できません。