0

質問が言うように、X、Y 位置から、たとえばマウス方向の 10 ピクセルまで線を引きたいと思います...既に持っている関数は 2 点間に線を引きますが、その方法がわかりませんマウス方向に一定の長さで

関数は次のとおりです。

    void D3DGraphics::DrawLine( int x1,int y1,int x2,int y2,int r,int g,int blu )
{
    int dx = x2 - x1;
    int dy = y2 - y1;

    if( dy == 0 && dx == 0 )
    {
        PutPixel( x1,y1,r,g,blu );
    }
    else if( abs( dy ) > abs( dx ) )
    {
        if( dy < 0 )
        {
            int temp = x1;
            x1 = x2;
            x2 = temp;
            temp = y1;
            y1 = y2;
            y2 = temp;
        }
        float m = (float)dx / (float)dy;
        float b = x1 - m*y1;
        for( int y = y1; y <= y2; y = y + 1 )
        {
            int x = (int)(m*y + b + 0.5f);
            PutPixel( x,y,r,g,blu );
        }
    }
    else
    {
        if( dx < 0 )
        {
            int temp = x1;
            x1 = x2;
            x2 = temp;
            temp = y1;
            y1 = y2;
            y2 = temp;
        }
        float m = (float)dy / (float)dx;
        float b = y1 - m*x1;
        for( int x = x1; x <= x2; x = x + 1 )
        {
            int y = (int)(m*x + b + 0.5f);
            PutPixel( x,y,r,g,blu );
        }
    }
}

画面上のマウスの X と Y の位置を取得する関数もあります (getmouseX()、getmouseY())。

4

2 に答える 2

1
  1. Direct3D にはD3DXVECTOR2D3DXVECTOR3、 、D3DXCOLORおよび同様の構造があります。おそらくそれらを使用する必要があります。またはtypedef D3DXVECTOR2 Vec2;そのようなものを使用します。これらの構造には数学関数が付属しているため、それらを使用することは理にかなっています。ああ、そして彼らはフロートで動作します。
  2. 一度に 1 ピクセルずつ描画するのは悪いテーマです。遅いです。また、 D3DPT_LINELISTを使用して、1 回の呼び出しで線全体を簡単に描画できます。IDirect3DDevice9->DrawPrimitive(..)
  3. 構造体を使用したくない場合でも、D3DX*おそらく構造体を使用して色と座標を保存する必要があります。

例:

struct Coord{
    int x, y;
};

struct Color{
    unsigned char a, b, g, r;
};

あなたの質問に関して。

typedef D3DXVECTOR2 Vec2;

....

Vec2 startPos = ...;
Vec2 endPos = getMousePos();
const float desiredLength = ...;//whatever you need here.
Vec2 diff = endPos - startPos; //should work. If it doesn't, use
                               //D3DXVec2Subtract(&diff, &endPos, &startPoss);
float currentLength = D3DXVec2Length(&diff);
if (currentLength != 0)
    D3DXVec2Scale(&diff, &diff, desiredLength/currentLength);// diff *= desiredLength/currentLength
else
    diff = Vec2(0.0f, 0.0f);
endPos = startPos + diff; //if it doesn't work, use D3DXVec2Add(&endPos, &startPos, &diff);

この方法は、startPos よりendPos先にはなりません。==でdesiredLengthない限りstartPosendPos

PS 本当に線を自分で描きたい場合は、bresenham line drawing algorithmを研究することをお勧めします。

于 2013-06-01T18:22:11.423 に答える
0

比率 = (開始位置とマウス位置の間の長さ)/10

x = startX+(mouseX-startX)/比率 y = startY+(mouseY-startY)/比率

このようなものだと思います

于 2013-06-01T18:02:34.333 に答える