2013-06-01 120 views
0

如问题所述,我想绘制一条从X,Y位置开始的线,例如鼠标方向上的10个像素...函数I已经绘制了一条线2点之间,但我想不出如何使用鼠标方向在鼠标方向上绘制一条具有恒定长度的线条

这里恒定lenght要做的只是功能:

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())

回答

1
  1. 的Direct3D具有D3DXVECTOR2D3DXVECTOR3D3DXCOLOR和类似结构。你应该可以使用它们。或使用typedef D3DXVECTOR2 Vec2;或类似的东西。那些结构具有数学功能,所以使用它们是有意义的。哦,他们在浮游物上运作。
  2. 一次绘制一个像素是一个糟糕的主题 - 速度很慢。您也可以使用IDirect3DDevice9->DrawPrimitive(D3DPT_LINELIST..)
  3. 轻松画出整条生产线的一个呼叫即使你不想使用D3DX*结构,你应该使用strctures存储的颜色和坐标:

例子:

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); 

这样endPosdesiredLength比startPos不会进一步。除非startPos == endPos

P.S.如果你真的想自己画线,你可能想研究bresenham line drawing algorithm

0

ratio =(开始位置和mous之间的长度È位置)/ 10

X = STARTX +(mouseX-STARTX)/比 Y = startY +(mouseY的-startY)/比率

我认为它是这样的

+0

Aaand你会得到零分。 – SigTerm

相关问题