質問: 0) { if(ran[j][i]==0) { ctx.beginPath(); ctx.moveTo( 50 +j * 40 , 70 + i * 20 ); ctx.lineTo( 90 +j * 40, 70 + i * 20 ); ctx.closePath(); ctx.stroke(); } } else { if(ran[j-1][i]==0) { } else { if(ran[j][i]==0) { ctx.beginPath(); ctx.moveTo( 50 +j * 40 , 70 + i * 20 ); ctx.lineTo( 90 +j * 40, 70 + i * 20 ); ctx.closePath(); ctx.stroke(); } } } } } ソースコード ``` ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: この場合最も重要なのは、「どう横棒の情報を保持するか」です。情報さえ正しく保持していれば、描画自体は(あみだの実行も)目処が見えてきます。 あみだにおける横棒とは、「ある縦棒の座標Y1と、他の縦棒の座標Y2との間をつなぐ」ものです。 ※単純化すると横棒は常に横軸と並行ですから、Y1 = Y2 になります これを踏まえてあみだの実行を考えると、横棒の情報が「a(縦棒1),b(縦棒2),y(Y座標)」という配列h[x] に入っているならば、こんな感じの動きになります。 ``` var bar = 0; // 今いる縦棒の番号。0~n-1 var y = 0; // 今の縦軸上の座標 while( y != 縦軸の終端(ゴール)のY座標 ) { y = y + 1; for(i = 0; i < h.count; i++) { if (h[i].y == y) { // 今いるY座標に対する横軸が(どこかに)ある if (h[i].a == bar) { bar = h[i].b; // 縦軸1 が一致しているなら、縦軸2 へ移動する } else if (h[i].b == bar) { bar = h[i].a; // 縦軸2 が一致しているなら、縦軸1 へ移動する } } } } // ここまで来た時点での bar が、引いた結果の縦棒の位置 ```