

open
processingにある[こちらのコード](http://www.openprocessing.org/sketch/6655)で分からない部分があります.

[code]

    void bounce(Particle a, Particle b) {
    if (sqrt(pow(a.posX - b.posX, 2) + pow(a.posY - b.posY, 2)) < (a.radius + b.radius)) {
        if (sqrt(pow(a.posX - b.posX, 2) + pow(a.posY - b.posY, 2)) > sqrt(pow(
                a.posX + a.vX - b.posX - b.vX, 2)
                + pow(a.posY + a.vY - b.posY - b.vY, 2))) {
    
            float commonTangentAngle = atan2(b.posX - a.posX, b.posY
                    - a.posY)
                    + asin(1);
    
[/code]

最初のif文で距離を取っているのは分かるんですが,そのあとに続くifの条件分

[code]

            if (sqrt(pow(a.posX - b.posX, 2) + pow(a.posY - b.posY, 2)) > sqrt(pow(
                a.posX + a.vX - b.posX - b.vX, 2)
                + pow(a.posY + a.vY - b.posY - b.vY, 2))) {
    
[/code]

とcommonTangentAngleの示す意味がよくわかりません.プログラミングというより物理運動の公式だと思いますが…初歩的な物理すらわからないのでひょっとすると教科書レベルの公式なのかもしれませんが詳しく教えてください.


CC BY-SA 3.0
2015-03-29T10:50:45.953
8529
2015-03-29T12:45:08.663
9056
question
processing
processingでの衝突判定

[code]

        if (sqrt(pow(a.posX - b.posX, 2) + pow(a.posY - b.posY, 2)) > sqrt(pow(
            a.posX + a.vX - b.posX - b.vX, 2)
            + pow(a.posY + a.vY - b.posY - b.vY, 2))) {
    
[/code]

このif文については、現在の２つのパーティクル間の距離が次フレームのパーティクル間の距離より大きいかどうかを判定しています。言い換えると、２つのパーティクルが互いに近接している途中なのか離反している途中なのかチェックしています。

![picture](https://i.stack.imgur.com/A3QTk.png)

衝突が発生するのはもちろん近接している場合のみです。  
ちなみに`sqrt`はなくても結果は同じなのでもう少しすっきり書きなおすことができます。

[code]

    if (pow(a.posX - b.posX, 2) + pow(a.posY - b.posY, 2) > 
    pow(a.posX + a.vX - b.posX - b.vX, 2) + pow(a.posY + a.vY - b.posY - b.vY, 2))
    
[/code]

`commonTangentAngle`は反射面の角度です。

![commonTangentAngle](https://i.stack.imgur.com/VYPRp.png)


CC BY-SA 3.0
2015-03-29T12:37:44.240
8531
2015-03-29T12:45:08.663
2015-03-29T12:45:08.663
3639
3639
8529
answer