前提・実現したい
godotゲームエンジンを使用しています
pythonに似た言語を使用
テトリスでミノを回転させたいです
var array = [
[1,2],
[3,4]
]
これはミノではないですが、シンプルな二次元配列を用意しました。これを以下のように時計回りに回転させたいです。
var array = [
[3,1],
[4,2]
]
https://toburau.hatenablog.jp/entry/20140324/1395679650
90度の回転であれば、xとyを入れ替えればいいとあります。任意の角度の場合はsin cosが必要だと思います。
以下のようにしたのですが、望む結果にはなりません。
この、xとyを入れ替えるという部分がよく分かりませんので、アドバイスをお願いします。
var block = [ [1,2], [3,4] ] func _ready(): for y in block.size(): for x in block[y].size(): block[y][x] = block[x][y] block[x][y] = block[y][x] print(block)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
で書かれているのは単なる2次元の回転行列の話であって,
【座標(x,y)を「原点周りに」θだけ回転させたら,回転後に(x',y')に行く】という話をしているだけです.
あなたがやろうとしていることは,配列の中身を回転させる話なので,「どこを中心に」回転させるのか,という事柄を考える必要があります.
xとyを入れ替える
とかいう謎の文言は一旦忘れて,配列indexを座標値とする世界の上での適切な (x,y)←→(x',y') の変換を導出して用いてください.
絵を描いてみました.
何やらxとかyとかいう言葉に振り回されているように見受けるので,(u,v)という新しい座標系を明示的に導入.(※(u,v)の座標系は別に下図の形じゃなくても自分が扱いやすいものを考えれば良い)
この座標系では,2x2の配列の4個の要素の「丁度ど真ん中」に原点をとっています.
回転作業をこの(u,v)の世界で考えてみますと,90度回転とは
あなたがどこかで目にした「x座標とy座標(まぁここではu座標とv座標ですが)を入れ替える,ただし一方の側は-1倍する」という話になっている,ということですね.
回転前の座標(u,v)と90度回転後の座標(u',v')の関係というのが,
u'=-v
v'=u
になっている,という話.
あとは,(u,v)←→(x,y) の対応関係(相互の変換)を用いれば「配列の中身を回転する処理」ができますよね.
「配列の中身を回す処理」によって,回転前に位置(x,y)にあった要素が回転後には位置(x',y')に移動するとき,この
(x,y)←回す→(x',y') という前後の座標の対応関係(変換)を,
(x,y)←→(u,v)←回す→(u',v')←→(x',y') として考えればよいわけです.
投稿2019/12/04 09:02
編集2019/12/05 03:04総合スコア11985
0
最終目標と質問があっていないと思います。
テトリスであれば、配列を固定で持つのが良いです。
I ブロックの180°回転時に計算で処理すると「ズレ」ます。
投稿2019/12/04 02:20
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/12/04 02:48
2019/12/04 03:06
2019/12/04 03:08
2019/12/04 03:21
退会済みユーザー
2019/12/04 03:53
2019/12/04 04:00 編集
退会済みユーザー
2019/12/04 04:02
2019/12/04 04:11 編集
退会済みユーザー
2019/12/04 04:12
2019/12/04 04:19
2019/12/04 05:17
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/04 02:12
2019/12/04 03:27
2019/12/04 07:42
2019/12/05 00:52 編集
0
こういうことじゃないですか。
Python
1for y in block.size(): 2 for x in block[y].size(): 3 #時計回りのとき 4 xx = y #X座標をY座標に代入 5 yy = -x #Y座標の符号を反転してX座標に代入 6 tmp[yy][xx] = block[x][y] 7 8block = tmp
投稿2019/12/02 11:47
総合スコア1045
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/03 06:54
2019/12/03 07:14
2019/12/04 02:59 編集
2019/12/04 03:46
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。