回答編集履歴

1

頂点の膨張方向、および膨張量の算出について追記

2023/02/12 11:20

投稿

Bongo
Bongo

スコア10816

test CHANGED
@@ -246,3 +246,14 @@
246
246
  ![図2](https://ddjkaamml8q8x.cloudfront.net/questions/2023-02-12/61eaf22d-dceb-4580-9cc3-dc142bb55bac.gif)
247
247
 
248
248
  なお、例示しましたスクリプトはメッシュに面積0の三角形がないこと、同じ座標に重複した複数の頂点がないこと...などの条件を満たしていることを前提にしており、そうでない場合の対策は組み込んでいないため、メッシュによっては正しく動かないかもしれません。変な挙動をするようでしたら、メッシュをご提示いただければ可能であれば修正してみようと思います。
249
+
250
+ ## 頂点の膨張方向、および膨張量の算出について
251
+
252
+ ![図3](https://ddjkaamml8q8x.cloudfront.net/questions/2023-02-12/938acd74-5c09-48bb-a95e-ad2786ab0d53.png)
253
+
254
+ Pが移動前の頂点座標、Qが膨張幅1の時の移動先です。d0とd1をそれぞれ90°回転させたd0'、d1'をP点に生やし、その先端をP0、P1とします。
255
+ △PQP0と△PQP1は斜辺を共有しており、d0'とd1'の長さはどちらも1なため、[斜辺他一辺相等な直角三角形同士](https://ja.wikipedia.org/wiki/%E5%9B%B3%E5%BD%A2%E3%81%AE%E5%90%88%E5%90%8C#%E4%B8%89%E8%A7%92%E5%BD%A2%E3%81%AE%E6%B1%BA%E5%AE%9A%E5%95%8F%E9%A1%8C)ですので合同と言えるはずです。そのため∠QPP0と∠QPP1の大きさは等しく、つまりPQは∠P0PP1の二等分線で、Qの方角はd0'とd1'のちょうど中間だろうと考えました。
256
+ d0'とd1'を求めてから(つまりd0、d1を90°回転させてから)中間の方向を求めてもよかったのですが、今回は私の気まぐれでd0とd1の中間を求めてから90°回転させました。
257
+
258
+ 次にPQの長さですが、△PQP0をご覧いただきますと、これは直角三角形ですのでPQ * cos(θ/2) == |d0'| == 1という関係になるはずです。
259
+ つまりPQ == 1 / cos(θ/2)であり、さらに[cos(θ/2)はcos(θ)から算出](https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E5%85%AC%E5%BC%8F%E3%81%AE%E4%B8%80%E8%A6%A7#%E5%80%8D%E8%A7%92%E3%83%BB%E4%B8%89%E5%80%8D%E8%A7%92%E3%83%BB%E5%8D%8A%E8%A7%92%E3%81%AE%E5%85%AC%E5%BC%8F)でき、[cos(θ)はd0とd1(あるいはd0'とd1')のドット積から算出](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%83%E3%83%88%E7%A9%8D#%E3%83%8E%E3%83%AB%E3%83%A0)できますので、結果としてPQ == 1 / √((d0・d1 + 1) / 2)と表現できるかと思います。