标签:point 角度 相等 amp gif select 创建 复制 技术分享
工作中遇到话流程图的项目,需要画带箭头的直线,经过摸索,解决;思路如下:
(1) 两个点(p1,p2)确定一个直线,以直线的一个端点(假设p2)为原点,设定一个角度
(2)以P2为原点得到向量P2P1(P),向量P旋转theta角得到向量P1,向量P旋转-theta角得到向量P2
(3)伸缩向量至制定长度,平移变量到直线的末端
(4)现在已经有3个点了,画线就可
具体代码如下:
void CworkflowDlg::DrawLine(CPoint p1, CPoint p2) { CClientDC dc(this);//获取客户窗口DC CPen pen,pen1,*oldpen; int PenLineWidth=2;//为了根据线条宽度设置箭头的大小 pen.CreatePen(PS_SOLID, PenLineWidth, RGB(0, 0, 0)); pen1.CreatePen(PS_SOLID, PenLineWidth, RGB(0, 0, 0)); oldpen=dc.SelectObject(&pen); double theta=3.1415926/15*PenLineWidth;//转换为弧度 double Px,Py,P1x,P1y,P2x,P2y; //以P2为原点得到向量P2P1(P) Px=p1.x-p2.x; Py=p1.y-p2.y; //向量P旋转theta角得到向量P1 P1x=Px*cos(theta)-Py*sin(theta); P1y=Px*sin(theta)+Py*cos(theta); //向量P旋转-theta角得到向量P2 P2x=Px*cos(-theta)-Py*sin(-theta); P2y=Px*sin(-theta)+Py*cos(-theta); //伸缩向量至制定长度 double x1,x2; int length=10; x1=sqrt(P1x*P1x+P1y*P1y); P1x=P1x*length/x1; P1y=P1y*length/x1; x2=sqrt(P2x*P2x+P2y*P2y); P2x=P2x*length/x2; P2y=P2y*length/x2; //平移变量到直线的末端 P1x=P1x+p2.x; P1y=P1y+p2.y; P2x=P2x+p2.x; P2y=P2y+p2.y; dc.MoveTo(p1.x,p1.y); dc.LineTo(p2.x,p2.y); dc.SelectObject(&pen1); dc.MoveTo(p2.x,p2.y); dc.LineTo(P1x,P1y); dc.MoveTo(p2.x,p2.y); dc.LineTo(P2x,P2y); dc.MoveTo(P1x,P1y); dc.LineTo(P2x,P2y); CPoint ptVertex[3]; ptVertex[0].x = p2.x; ptVertex[0].y = p2.y; ptVertex[1].x = P1x; ptVertex[1].y = P1y; ptVertex[2].x = P2x; ptVertex[2].y = P2y; //填充三角形区域 CBrush br(RGB(40,130,170)); CRgn rgn; rgn.CreatePolygonRgn(ptVertex,3,ALTERNATE); dc.FillRgn(&rgn, &br); dc.SelectObject(oldpen); br.DeleteObject(); rgn.DeleteObject(); }
这里面用到CreatePolyonRgn这个函数,具体用法如下:
标签:point 角度 相等 amp gif select 创建 复制 技术分享
原文地址:http://www.cnblogs.com/xieweikai/p/6817554.html