用鼠标方向绘制一条等长的直线
Draw a line with a constant length by mouse direction
正如问题所说,我想在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())
- Direct3D具有
D3DXVECTOR2
、D3DXVECTOR3
、D3DXCOLOR
等类似结构。你应该使用它们。或者用typedef D3DXVECTOR2 Vec2;
或者类似的东西。这些结构带有数学函数,所以使用它们是有意义的。哦,它们对浮点数进行操作。 - 一次画一个像素是一个糟糕的主题-它很慢。此外,您可以使用
IDirect3DDevice9->DrawPrimitive(
D3DPT_LINELIST..)
在一次调用中轻松绘制整条线。 - 即使你不想使用
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);
这样endPos
就不会比desiredLength
更远。除非startPos
== endPos
注:如果你真的想自己画线,你可能需要研究布里森汉姆线绘制算法。
ratio =(起始位置与鼠标位置之间的距离)/10
x = startX+(mouseX-startX)/ratioy = startY+(鼠标-startY)/ratio
我想大概是这样的
相关文章:
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 如何在 Win32 中用一条线连接 2 个文本框?
- C++ 如何在同一行中和在一条线上?
- 如何在SDL2窗口上使用Cairo绘制一条白色直线
- 在Opengl中绘制一条不显示C++的线
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- x86 - 为什么编译器在下一条指令中插入看似毫无意义的JMP?
- CMake似乎忽略了一条线
- 在C 中使用Legacy OpenGL(即时模式)绘制一条厚线
- 在图像标签上画一条线并计算距离
- switch 语句结束和下一条语句之间的时间是否具有确定性(与路径无关)
- 如何在OMNET++中收到来自前一个模块的所有消息后将一条消息发送到下一个模块
- 一条线和两行声明之间的差异
- C++ OpenCV:检测两条线而不是一条线(Canny & findContours)
- 如何在C++中将边列表转换为邻接矩阵,其中包含连接到顶点的边数而不是一条边?
- 为什么 fstream 打印出文件的最后一条记录
- 如何在另一条消息(M1)之前调用带有消息(M2)的lambda函数,但输出要"M2 M1"?
- 如何在子小部件而不是父窗口小部件上绘制一条线
- 在C++中,文件中的下一条记录被非法更新
- 用鼠标方向绘制一条等长的直线