您的位置:首页 > 其它

箭头和平移线段的绘制算法备忘录

2008-12-19 19:56 218 查看
//绘制箭头
//线段两点pt1(x1,y1),pt2(x2,y2) L为箭头高度 C为箭头顶端角度
DrawArrow(CDC* pDC,float x1,float y1,float x2,float y2)
{
int L = 35;//箭头长度
double pi = 3.1415926535;
double C = pi/12;//箭头度数
double tanC = tan(C);
float Dx = x2-x1,Dy = y2-y1;
float L0 = sqrt(Dx*Dx+Dy*Dy);//pt1,pt2之间距离
float X1,Y1,X2,Y2;
X1 = (L*Dy*tanC*(-1)+L0*Dx+L0*x1-L*Dx)/L0;
Y1 = (L*Dx*tanC +L0*Dy+L0*y1-L*Dy)/L0;
X2 = (L*Dy*tanC +L0*Dx+L0*x1-L*Dx)/L0;
Y2 = (L*Dx*tanC*(-1)+L0*Dy+L0*y1-L*Dy)/L0;
pDC->MoveTo(x2,y2);
pDC->LineTo(X1,Y1);
pDC->LineTo(X2,Y2);
pDC->LineTo(x2,y2);
//填充箭头
Point *m_point = new Point[3];
m_point[0].X = x2,m_point[0].Y = y2;
m_point[1].X = X1,m_point[1].Y = Y1;
m_point[2].X = X2,m_point[2].Y = Y2;
Graphics graphics(pDC->m_hDC);
graphics.SetSmoothingMode(SmoothingModeHighQuality);
Color brushcolor(255,0,0,0);
SolidBrush m_brush(brushcolor);
brushcolor.SetFromCOLORREF(RGB(0,0,255));
m_brush.SetColor(brushcolor);
graphics.FillPolygon(&m_brush,m_point,3);
}
//绘制平行线段
//线段两点pt1(x1,y1),pt2(x2,y2)
DrawParallel(CDC* pDC,float x1,float y1,float x2,float y2)
{
int L = 20;//偏移距离
float Dx = x2-x1,Dy = y2-y1;
float L0 = sqrt(Dx*Dx+Dy*Dy);//pt1,pt2之间距离
float X1,Y1,X2,Y2; //一条平行线的两端点
float Xg1,Yg1,Xg2,Yg2; //另一条平行线的两端点
­
X1 = (L*Dy*(-1)+x1*L0)/L0;
Y1 = (L*Dx +y1*L0)/L0;
Xg1 = (L*Dy +x1*L0)/L0;
Yg1 = (L*Dx*(-1)+y1*L0)/L0;
/*X2 = (L*Dy*(-1)+L0*Dx+L0*x2)/L0;
Y2 = (L*Dx +L0*Dy+L0*y2)/L0;
Xg2 = (L*Dy +L0*Dx+L0*x2)/L0;
Yg2 = (L*Dx*(-1)+L0*Dy+L0*y2)/L0;*/
X2 = (L*Dy*(-1)+x2*L0)/L0;
Y2 = (L*Dx +y2*L0)/L0;
Xg2 = (L*Dy +x2*L0)/L0;
Yg2 = (L*Dx*(-1)+y2*L0)/L0;
­
pDC->MoveTo(X1,Y1);
pDC->LineTo(X2,Y2);
pDC->MoveTo(Xg1,Yg1);
pDC->LineTo(Xg2,Yg2);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: