我希望从用户点击鼠标到他拖动鼠标的点绘制箭头。基线是下面代码中绘制的第一行。现在我希望还有两条距离d线的短线从45度出来,创建一个指向当前鼠标位置的箭头。这两行是绘制的第二行。 drawLine()从前2个值的点到第2个2的值绘制一条线。我无法弄清楚的是如何计算我在下面的代码中的arrowLine变量的坐标。
double deltaX = mousePosX - mouseOnDownX;
double deltaY = mousePosY - mouseOnDownY;
double distance = sqrt(pow(deltaX, 2) + pow(deltaY, 2));
double angle = atan(deltaY / deltaX) * 180 / PI;
int arrowLineLength = 20;
int arrowLineAngle = 45;
screen->drawLine(mousePosX, mousePosY, mouseOnDownX,mouseOnDownY);
screen->drawLine(mousePosX, mousePosY, arrowLine1x,arrowLine1y);
screen->drawLine(mousePosX, mousePosY, arrowLine2x,arrowLine2y);
编辑:为了澄清,mouseOnDownX和mouseOnDownY是用户最初按下鼠标按钮时鼠标的坐标。 mousePosX和mousePosY是鼠标位于当前位置的坐标,是箭头标题出来的点。
答案 0 :(得分:1)
如果向量指向某个方向,并且想要将其顺时针旋转θ度,则可以将其乘以此矩阵:
|cos θ -sin θ|
|sin θ cos θ|
因此,如果你的方向向量指向(dx,dy),顺时针旋转θ度形成的向量是
dx' = dx cos θ - dy sin θ
dy' = dx sin θ + dy cos θ
在您的情况下,您有一个从源到目标的向量。因此,从(-deltaX, -deltaY)
给出从目的地到源的向量。然后你可以通过将东西插入上面的公式中来向左和向右倾斜45度的向量:
dx' = -deltaX cos θ + deltaY sin θ
dy' = -deltaX sin θ - deltaY cos θ
使用θ=π/ 4和θ=-π/ 4在每个方向上获得45°旋转。为了确保您绘制的线的长度恰好是d,您可以对这些向量进行标准化,然后乘以d。例如:
finalDX = dx' * d / sqrt(dx'^2 + dy'^2)
finalDY = dy' * d / sqrt(dx'^2 + dy'^2)
希望这有帮助!
答案 1 :(得分:1)
坐标是:
arrowLine1x=x+d*cos(atan(deltaY/deltaX)+45);
arrowLine1y=y+d*sin(atan(deltaY/deltaX)+45);
arrowLine2x=x+d*cos(atan(deltaY/deltaX)-45);
arrowLine2y=y+d*sin(atan(deltaY/deltaX)-45);