問題タブ [rubiks-cube]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 2D 配列で表されるルービック キューブの面を操作して、面の回転を実行する方法
ルービック キューブを解く C# でプロジェクトを作成しています。ルービック キューブの現在の状態を入力として受け取り、指定された表記法を使用して立方体を解くために実行する一連の動きを出力します。
Cube は、長さ 9 の 6 つの文字列配列の配列で表されます。
それぞれの顔を表す Excel スプレッドシートを作成しました
これは、一緒に折りたたんで立方体を作成するネットとして想像できます。
Windows フォーム アプリケーションではなく、コンソール アプリケーションを使用しているため、それぞれの面をコンソールの下に書き込んでキューブを表現する必要があります。私は次の方法を使用してこれを行いますPrintCube()
:
これにより、解決されたキューブの標準出力は次のようになります。
現在、キューブで実行できるさまざまな動きをそれぞれコーディングしている段階ですが、問題が発生しました。
操作を実行するコードは次のとおりです。
私は操作を順番にコーディングしているため、現時点ではF操作しか完了していませんが、 R操作のどこが間違っているのか一生わかりません。
ルービック キューブの表記法では、解決された立方体の演算Rは、外側の白い面と上の青い面から始まり、次の動きを示していることがわかります。
白い面を外側にして、青い面を上にして立方体を持ちます。
赤い面を時計回りに 90 度ねじって、白い面の右側が青い面に、緑が白に、黄色が緑に、青が黄色に移動するようにします。
これら 2 つの手順を実行すると、R操作が実行されます。
これを行うためにコードで何をする必要があるかを確認するために、Excel スプレッドシートに戻りましょう。
白い面から始めて、変更する必要があることがわかります。
- ホワイトフェイスのインデックス2、5、8からグリーンフェイスのインデックス2、5、8まで。
- ブルーフェイスのインデックス2、5、8からホワイトフェイスのインデックス*2、5、8*まで
- ただし、黄色の面に到達すると、ネット内の面が「反転」してオレンジ、青、緑、および赤の面を接続する必要があるため、インデックス0、3、および 6を変更する必要があります。これらはそれぞれ、青の文字盤でインデックス 8、5 、および 2に変わります。目の前に立方体があるとなぜそうなのか考えやすい
- 緑の面では、インデックス 2、5 、および 8を、黄色の面ではインデックス 6、3 、および 0に変更します。繰り返しますが、これは私たちがネットをどのように解釈するかによるものです。
Operation Rのコードを拡大すると、これをどのように達成したかがわかります。
変更が行われたことを示す各行の横にコメントがあります。//258 630
ここで、 で示される面のnewCubeState
インデックス 2、5 、および 8CubeState
が、それぞれインデックス 6、3 、および 0 で示される面にあったものに変更されたことを示します。
上記の 2 次元配列からわかるように、最初のインデックスは、[0] = "WHITE"、[1] = "BLUE"、[2] = "RED"、[3] = "GREEN"になる面を表していることがわかります。 、[4] =「オレンジ」、[5] =「イエロー」
これを知っていれば、コードを次のように解釈できます。
まず、グリーン面の2番目のインデックスがイエロー面の6番目のインデックスになります。[緑→黄]
次に、イエローフェイスの0 番目のインデックスがブルーフェイスの8 番目のインデックスになる[YELLOW -> BLUE]
3 つ目は、ブルーフェイスの 2 番目のインデックスがホワイト フェイスの2番目のインデックスになります。[青→白]
4つ目は、ホワイトフェイスの2番目のインデックスがグリーンフェイスの2番目のインデックスになります。【白→緑】
いくつかの奇妙な理由で、それらは完全に別の変数ですが、CubeState[x,y]
設定したときに影響するように見えることに注意してください。そのため、newCubeState[i,j] = CubeState[x, y]
変更する前にインデックスを使用する必要があり、一時変数が必要になりますtempString
が、そうではありませんここで当面の問題。
5 つ目は、グリーン面の5 番目のインデックスが、イエロー面の3 番目のインデックスになります。[緑→黄]
第六に、イエローフェイスの3番目のインデックスは、ブルーフェイスの5番目のインデックスになります[YELLOW -> BLUE]
7番目、ブルーフェイスの5番目のインデックスは、ホワイトフェイスの5番目のインデックスになります。[青→白]
8番目に、ホワイトフェイスの5番目のインデックスは、グリーンフェイスの5番目のインデックスになります。【白→緑】
グリーン面の9番目、8番目のインデックスは、イエロー面の0番目のインデックスになります。[緑→黄]
イエローフェイスの10番目、6番目のインデックスがブルーフェイスの2番目のインデックスになる[YELLOW -> BLUE]
11 番目、青文字盤の 8 番目のインデックスは、白文字盤の8番目のインデックスになります。[青→白]
12番目、ホワイトフェイスの8番目のインデックスは、グリーンフェイスの8番目のインデックスになります。【白→緑】
これにより、次の出力が得られるはずです。
白 - 白 - 緑
白 - 白 - 緑
白 - 白 - 緑
青 - 青 - 白
青 - 青 - 白
青 - 青 - 白
赤 - 赤 - 赤
赤 - 赤 - 赤
赤 - 赤 - 赤
緑 - 緑 - 黄
緑 - 緑 - 黄
緑 - 緑 - 黄
オレンジ - オレンジ - オレンジ
オレンジ - オレンジ - オレンジ
オレンジ - オレンジ - オレンジ
青 - 黄 - 黄
青 - 黄 - 黄
青 - 黄 - 黄
ただし、そうではないことがわかります。
何らかの奇妙な理由で、 3 番目の面 ( GREEN )の8 番目のインデックスがYELLOWではなくBLUEになり、 5 番目の面 ( YELLOW )の6 番目のインデックスがBLUEではなくWHITEになることがわかります。
なぜこれが起こるのかわかりません。これについて助けていただければ幸いです。
問題が発生することはありませんが、私のRotateFaceRight()
方法は次のとおりです。
私のコードの残りの部分はここにあります:
Cube.cs
CubeCenters.cs
CubeOperations.cs
Program.cs
java - javaFX でピボットを中心にオブジェクトを回転させる
javaFX でルービック キューブを作成しようとしていますが、面の回転に苦労しています。これまで、面の 9 つの立方体をグループに追加し、その 90 度を回転させて面全体を正しい方法で回転させてきましたが、この方法は複数の回転では機能しないようです。
代わりに、各面の中心にあるピボット ポイントを中心に各キューブを回転させたいと考えています。これを行うために、ピボット パラメータに組み込まれた Rotate クラスを使用しようとしましたが、回転には影響がないようです。これは、2D 配列 frontFace に前面のすべての立方体が左上から右下に含まれる前面を回転させるために使用している関数の簡略化されたバージョンです。
これにより、次の結果が得られます (見やすいように 45 度回転させています)。
私はそれを次のように回転させたいのですが:
これは、javaFX を使用した最初のプロジェクトであり、どんな助けも大歓迎です! これまでの完全なプロジェクトは次の場所にあります。
編集:最小限の再現可能な例を含めるように求められたので、問題を1つのクラスに凝縮しようとしましたが、混乱しないことを願っています。コードは次のとおりです:
これは、問題に関連しているとは思わないが、色が必要な場合にコードで使用される画像、pallete.png です 。
ありがとう。