現在ワイヤ設定機能を作成しています。所謂「線種」をWireParts、配置したワイヤ情報をWireSetとしてクラス定義しています。ようやく、任意の位置にポイントを置いていけるようになったのですが、UIというか設置の仕様で少し悩んでしまったので、その顛末をば。
FL6n2brUYAA6Zld
パーツ選択状態で編集領域を左クリックすると、その場所を起点としてワイヤの設置が開始されます。終点はダブルクリックで指定とします。さて、ここからの仕様で悩みました。それは、途中で同じポイントを設置している可能性があるためです。また、ラインが交差している可能性もあります。機能として面積の場合は、線が交差した際は正しく面を構成できません。

Photoshopの多角形選択ツールではどうしているのかと確認してみたら、見た目に合わせて交差した位置に自動的にポイントを追加して、面の内側にあるポイントは自動で削除しているような動作をしていました。…めっちゃ高度です💦

この記事を書きながら、少し仕様を整理していきます。
まず、二つの線分には3つの状態があります。
  • 交点がない
  • 交点がある
  • 線が重なっている
線が重なっている状態は、交点が複数存在します。僅かでも重なっていれば、ある意味それは交点が無限に存在する事になりますが、今回はマップエディタの編集単位という限界があるので、複数箇所という考えで良いかと思います。

交点がなければ、そのまま配置したポイントは有効となります。線種WirePartsの機能が面積で、交点がある場合の処理が問題です。そこで、Magic.MapEditor では面積指定で交点が出来た時点で終了としてしまう仕様にします。これで捻れ面積問題は無くなるはずです。そして、その交点を開始点としてそれ以前のポイントを破棄します。おそらくこれで、確信はないのですが意図した動作になると思われます(だといいな…)。

交点ではなく既存ポイントに置かれた場合は、その既存ポイントを始点にすれば良さそうです。あと、ワイヤ設定中に別のアプリにフォーカスが移ったときは、直前のポイントを終点として確定したと見なすのが良いかな。Photoshopでは数秒同じ位置に停止していると自動で確定するんですが、これはどうしよう…。あと、編集中にレイヤの変更とかあった場合は、その時点で確定で良いよね、たぶん。と、細かい部分を考え始めると、なかなか先に進めないので、大まかの方針が決まったから、それに従ってプログラミングを進めるのが良さそうです。

線分の交点か。キャラ単位座標系でもちゃんと出るかな。出るとは思うけど、少し不安だわ…。というか、C# で a1x,a1y,a2x,a2y の線と、b1x,b1y,b2x,b2y の線が交わっているかの判定と、交点を求める計算ってどうやるんだろ 💦💦💦

検索してみたら、線分交差判定は下記が良さそう。

自分の判定では端点を含みたいのですが、それもコメントにあるので良い感じ。後は、交点の算出ですが、C# ではないですが、こちらの記事が良さそうです。交差判定計算式は、上記のサイトと同じですね。

よしよし、明日以降でまた試してみるか。…うっ、線が重なっている場合はどうなるんだろ💦


【宣伝】

これ、めっちゃ良いです。今も使ってます。購入して9年でようやくヘタッてきましたが、椅子のコロから床を完璧に守ります。また、クッションフロアでも椅子がラクに動かせます。かなりお高いですが、これは本当に良いです。めちゃくちゃオススメします。

こちらは目立たない傷がついている訳あり商品ですが、どうせ床に敷いて椅子を設置して座っていると、すぐに傷がつくので次回買うならこちらにしようと思っています。値段的には半額以下です。気になった人は是非こちらも検討してみてください。