ページ 11

DXLib関数:Segment_Segment_MinLength()が最短距離を計算しない不具合について

Posted: 2013年8月01日(木) 17:01
by Priest
結構どうでも良い話かもしれませんが、Segment_Segment_MinLength()について、

私はゲームの当たり判定にこの関数を使っています。
片方に弾の位置の線分、もう片方にキャラの位置の線分を渡しています。
これで、例えば5フレームごとに当たり判定を行うことにしても漏れなく判定できるわけです。

ただ、この関数、片方の線分の長さが0になると、最短距離を計算してくれません。
数学的には、長さ0の線分=点と解釈するのは間違っていますか?

もし数学的に等しいなら、片方もしくは両方の線分の長さが0の時でも最短距離を計算してくれるよう要望を出したいのですが。

といっても、別にこちら側のプログラムで長さが0になりそうな時はSegment_Point_MinLength()を使うようにすればいいだけの話なのですが、
ちょっと気になったので投稿してみます。

コード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    float xadd, length ;
    VECTOR LineA1, LineA2, LineB1, LineB2 ;

    // DXライブラリの初期化
    if( DxLib_Init() < 0 )
    {
        // エラーが発生したら直ちに終了
        return -1 ;
    }

    // 描画先を裏画面にする
    SetDrawScreen( DX_SCREEN_BACK ) ;

    // 二線分の座標をセット
    LineA1 = VGet( 0.0f, 0.0f, 0.0f ) ;
    LineA2 = VGet( 0.0f, 200.0f, 0.0f ) ;
    LineB1 = VGet( 320.0f, 240.0f, 0.0f ) ;
    LineB2 = VGet( 320.0f, 240.0f, 0.0f ) ;

    // 座標と加算数の初期化
    xadd = 8.0f ;

    // ウインドウが閉じられるか何かキーが押されるまでループ
    while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 )
    {
        // 画面をクリア
        ClearDrawScreen() ;

        // 線分の片方の終点を移動
        LineA2.x += xadd ;
        if( LineA2.x < 0.0f || LineA2.x > 640.0f )
            xadd = -xadd ;

        // 二線分の最近点どうしの距離を求める
        length = Segment_Segment_MinLength( LineA1, LineA2, LineB1, LineB2 ) ;

        // 片方の線分の描画
        DrawLine( LineB1.x, LineB1.y, LineB2.x, LineB2.y, GetColor( 255,255,255 ) ) ;

        // もう一つの線分を距離が 64 以下だったら色を変えて描画
        if( length < 64.0f )
        {
            DrawLine( LineA1.x, LineA1.y, LineA2.x, LineA2.y, GetColor( 255,0,0 ) ) ;
        }
        else
        {
            DrawLine( LineA1.x, LineA1.y, LineA2.x, LineA2.y, GetColor( 0,255,0 ) ) ;
        }

        // 裏画面の内容を表画面に反映させる
        ScreenFlip() ;
    }

    // DXライブラリの後始末
    DxLib_End() ;

    // ソフトの終了
    return 0 ;
}


Re: DXLib関数:Segment_Segment_MinLength()について: 長さ0の線分≠点?

Posted: 2013年8月01日(木) 18:59
by h2so5
DXライブラリのソースを見る限り、片方または両方の線分が点になっている状態は想定されているようなので、もし最短距離が正確に出ないとしたらバグだと思います。

Re: DXLib関数:Segment_Segment_MinLength()について: 長さ0の線分≠点?

Posted: 2013年8月01日(木) 19:36
by Priest
ありがとです。

そうでしたか。
検証して明らかにおかしいとなった場合は御報告に伺おうかと思います。

Re: DXLib関数:Segment_Segment_MinLength()について: 長さ0の線分≠点?

Posted: 2013年8月03日(土) 19:29
by Priest
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=3098

バグだったようです。
修正されましたので、必要な方はアップデートしてくださいね。