0

現在、Python で作成した 2D ゲームにフラット シャドウ エフェクトを実装しようとしています。私はこれをオンラインで行うためのチュートリアルと方法をたくさん見つけました ( http://ncase.me/sight-and-light/ )、しかし、これらはすべて障害物としてポリゴンを使用し、私のゲームが含まれている間、すべてのコーナーポイントが知られています円。

AとOの状況と円の半径がわかれば、各接点(PとQ)のX座標とY座標、または線の傾きを計算できるのではないかと考えていました。

事前に感謝し、質問がトピックから外れている場合はお詫びしますが、他の場所で答えを見つけることができませんでした.

4

2 に答える 2

1

ポイント P で何が起こっているかに注目するのがポイントです。ポイント P では、線 AP が円に接しているため、角度 APO は 90 度です。同様にAQOは90度です。

これで、三角形があることがわかり、2 つの長さと 1 つの角度がわかりました (AO、OP / OQ (同じもの)、および APO / AQO がわかります)。

ここで、サインの法則を使用します。

 AO/sin(APO) = OP/sin(PAO)
 PAO = asin(OP*(sin(APO)/AO))

単位を意識することを忘れないでください (つまり、入力値として 90 度を使用し、sin のライブラリ関数が度ではなくラジアンで返される可能性があることを忘れてください)。

ここから、三角形のすべての角度の合計が 180 度であることを知ることで、すべての角度を見つけることができます。これで、3 つの角度すべてが得られました。

上記の計算から角度 AOP が得られたら、再びサインの法則を使用して AP の長さを計算できます。

 AP = sin(AOP) * AO / sin(APO).

sin(90 度) == 1 であることに注意してください (また、APO と AQO は 90 度 | pi/2 ラジアンであることを思い出してください)。

これで AP の長さがわかりました。A が (0, 0) にあると仮定すると、P の座標 (x, y) を見つけることができます。A が原点でない場合は、A の座標をオフセットとして追加します。

P の座標を求めるには:

 PxCoord = AxCoord + AP * cos(PAO)
 PyCoord = AyCoord + AP * sin(PAO)

注意: 三角関数 (sin / asin) が度またはラジアンを使用するかどうかを確認し、関数がラジアンを使用する場合は、90 度をラジアン (pi/2 ラジアン) に変換してください。また、この場合、出力は角度のラジアンになります。同様に、三角形の 180 度の代わりに pi ラジアンになります。

于 2016-07-06T21:15:03.420 に答える