これは簡単な質問ですが、間違った方法で考えている可能性があり、正しい方法を見つけることができませんでした。
m_StartPoint1 から始まり m_EndPoint1 で終わる行、たとえば行 1 があるとします。m_EndPoint1 から始まり、線 1 と一定の角度のアルファを持つ別の線、たとえば線 2 を描きたいと思います。基本的に私の目標は、矢印を描くことです。
次のコードを使用して、ライン 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
この計算は、ライン 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);
ただし、このコードも機能しませんでした。どんなアイデアでも大歓迎です。