尽管这是一个简单的问题,但我可能以错误的方式思考,因此找不到正确的方法。
想象一下,我有一条线,比如 Line 1,从 m_StartPoint1 开始,到 m_EndPoint1 结束。我想画另一条线,比如第 2 线,从 m_EndPoint1 开始,并与第 1 线具有恒定的 alpha 角度。基本上我的目标是画一个箭头。
我正在使用以下代码来计算第 2 行的 x,y 坐标。
const float ARROW_ANGLE=-PI/8.0;
wxPoint p;
p.x=m_EndPoint.x+ARROW_LENGTH*sin(ARROW_ANGLE);
p.y=m_EndPoint.y+ARROW_LENGTH*cos(ARROW_ANGLE);
m_ArrowHead1=new CLine(m_EndPoint,p,color,PenWidth); //Draws a line from m_EndPoint to p
当 Line 1 的角度小于 90(以度为单位)时,此计算效果很好。但是,当第 1 行的角度发生变化时,箭头显示不正确。基本上,用户应该能够根据需要绘制第 1 行,并且无论第 1 行的角度如何,箭头线都应该正确显示。
我已将第 1 行表示为向量,并通过以下代码得到它的角度:
class CVector2D
{
wxPoint m_StartPoint, m_EndPoint;
public:
CVector2D():m_StartPoint(),m_EndPoint() {}
CVector2D(wxPoint p1, wxPoint p2):m_StartPoint(p1),m_EndPoint(p2) {}
float GetSlope(void)
{
return float(m_EndPoint.y-m_StartPoint.y)/float(m_EndPoint.x-m_StartPoint.x);
}
float GetSlopeAngleInRadians()
{
/*Will return the angle of the vector in radians
* The angle is the counterclockwise rotation therefore it is negative
*/
float slope=GetSlope();
float InRadians=atan2(float(m_EndPoint.y-m_StartPoint.y),float(m_EndPoint.x-m_StartPoint.x));
if(InRadians<=0) return InRadians;
return -(2*PI-InRadians);
}
};
然后我尝试使用以下代码进行计算:
CVector2D vector(m_StartPoint,m_EndPoint);
float vector_angle=vector.GetSlopeAngleInRadians();
float total_angle=vector_angle+ARROW_ANGLE;
wxPoint p;
p.x=m_EndPoint.x+ARROW_LENGTH*cos(total_angle);
p.y=m_EndPoint.y+ARROW_LENGTH*sin(total_angle);
m_ArrowHead1=new CLine(m_EndPoint,p,color,PenWidth);
但是,此代码也不起作用。任何想法将不胜感激。