在一些路径图中常常需要作出箭头,而MFC中并没有提供这样的函数,只好自己编写.
如图所示,有一直线p1p2,现在要在p2端画出一个箭头,p2p3就是箭头的一遍,做好辅助线,其中p2p3长度与p1p2相等.len是需要的箭头长度,theta是箭头的倾斜角度,图中的17度.
void CMyView::LineArrow(CPoint p1, CPoint p2,CDC *pDC)
{
double x0,y0,x1,y1,x2,y2;
//(x0,y0)是p2p1的向量表示
x0=p1.x-p2.x;
y0=p1.y-p2.y;
//根据角度求出图中的p2p3向量和另一边的向量
x1=x0*cos(theta)-y0*sin(theta);
y1=x0*sin(theta)+y0*cos(theta);
x2=x0*cos(theta)+y0*sin(theta);
y2=x0*sin(-theta)+y0*cos(theta);
double l1,l2;
l1=sqrt(x1*x1+y1*y1);
l2=sqrt(x2*x2+y2*y2);
//求出对应于len的向量
x1=x1*len/l1;
x2=x2*len/l2;
y1=y1*len/l1;
y2=y2*len/l2;
//求出箭头向量的终点
x1+=p2.x;
y1+=p2.y;
x2+=p2.x;
y2+=p2.y;
pDC->MoveTo(p2.x-1,p2.y-1);
pDC->LineTo(x1,y1);
pDC->MoveTo(p2.x-1,p2.y-1);
pDC->LineTo(x2,y2);
}
看看我应用的效果.下面是一个简单的数字化查询系统,查询路径时可以显示出漂亮的路径箭头动画效果(动画参见LineDDA算法)
评论