質問: √直線の長さ^2 + 100^2 2を元にsinΘ・cosΘ 等を使用し、平行移動後の座標を出してみました。 しかし、角度が変わったりすると、平行移動がおかしくなってしまい、直そうと思っても、プログラム自体が計算式だらけで、手が施せないようなものになってしまいました・・・ ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/775fbb1e8bcfe8581241367ea3a3b048.jpeg) ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/74f9de58a7b3083f65ac3e3207efbfcb.jpeg)
回答: 「どっち側」の話からつらつら書いていきます。クリックしたときに、その座標から「線のどっち側」をどう決定してどう表現するかです。 まず元の線分ABを、始点AとベクトルABの組み合わせと考えましょう。すると「どっち側」はこう表現できます。「Aから見て、クリックした点はAB方向の右側にあるか、左側にあるか」のことであると。 右か左か、簡単に求まるでしょうか? ——簡単です。ベクトルの外積を使います。 クリックした点をPとしましょう。AからみたPの方向と距離、つまりベクトルAPですね、これとABとの関係を求めるのに、外積AB×APをとります。 2次元ベクトルの外積ってのは数値で、 * 求め方は、(x,y)×(u,v) = xv - uy です。 * その値は、長さ同士の積にsinθをかけたものになります。 何が起こるかというと、PがAB方向の左側にあるなら正の数に、右側にあるなら負の数になるのです。はい左右判定完了。 次。この右側か左側かを利用して、Aの移動先を求めます。 左側に移動する場合を考えましょう。 ベクトルABを左に90度回転させてから長さを100に整えればAの移動先へのベクトルになります。 90度回転させる。回転行列ですね。TeX記法なしで行列書くのがいやなので結果だけ書いてしまうと、(x,y)を左に90度回転させたら(-y, x)になります。ちなみに右に90度回転させたら(y, -x)。 長さを100に整えるには。これは単純に、ABの長さdを√(x2+y2)で求めてから、xとyそれぞれに(100/d)をかけてあげるだけですね。 これでほら、Aから移動先へのベクトルが求まりました。Aの座標と足し合わせればA’の座標です。それにABを足し合わせればB'の座標です。