绘制刻度尺的原理

这里主要介绍了一个简单的四厘米刻度尺的绘制,下文主要说明了一下后面需要用到的一些参数的意义,并直观的表达一下刻度尺绘制的基本原理。

绘制刻度尺的原理_第1张图片

图1 刻度尺绘制原理图
本篇主要介绍的一个四厘米的刻度尺的绘制,绘制过程主要是通过p0,p1这两个点,通过MFC中的MoveTo(),LineTo()这两个绘制直线的函数一步一步的绘制出这段比例尺。

主要的算法过程:

首先,确定p[0],p[1]这两个点的坐标(p[0].x,p[0].y),(p[1].x,p[1].y),通过这两个点得到X轴方向的重点坐标(midx,midy)。然后,通过MoveTo函数定位到起点坐标p[0],以(midx,midy)为终点通过LineTo函数绘制第一条线段,依次类推画出线段(midx,midy)到(midx,p[1].y),线段(midx,p[1].y)到(p[0].x,p[1].y)。最后绘制中间的刻度,这里主要通过一个for循环来实现中间刻度线的绘制,如本例中要绘制七条刻度线,所以通过一个for(int i = 0; i < 7; i++)的for循环,对每一条的刻度线进行绘制,绘制的方法与上面类似,这里不做更加详细的说明。

具体的代码片段如下所示:
void CDrawScale::DrawScale(CDC* pdc,int scale)
{
	//绘制竖直方向的刻度尺
	pdc->SetMapMode(MM_LOMETRIC);	//逻辑单位0.1毫米,x向右递增,y上递增

	CPoint p[2];			//定义绘制刻度尺的两个关键的点
	p[0].x = m_nMinX;
	p[0].y = m_nMinY;
	p[1].x = m_nMaxX;
	p[1].y = m_nMaxY;
	pdc->DPtoLP(p, 2);		//将设备坐标转换为逻辑坐标

	int midx = (int)((p[0].x + p[1].x) * 0.5f);
	int midy[7];			//绘制一个四厘米的刻度尺
	int dx = p[1].x - p[0].x;
	int dy = p[1].y - p[0].y;

	for(int i = 1; i < 8; i++)	//把刻度尺等分为八段
	{
		midy[i - 1] = p[0].y + i * (int)(dy / 8.0f);
	}

	CPen tmppen(PS_SOLID, 8, RGB(255, 0, 0));
	CPen* poldpen = pdc->SelectObject(&tmppen);
	pdc->MoveTo(p[0].x, p[0].y);
	pdc->LineTo(midx, p[0].y);
	pdc->LineTo(midx,p[1].y);
	pdc->LineTo(p[0].x,p[1].y); 
		
	for(int i = 0; i < 7; i++)
	{
		if(i%2 == 0)
		{
			pdc->MoveTo(midx,midy[i]);
			pdc->LineTo(midx-(int)(dx*0.25f),midy[i]);
		}
		else
		{
			pdc->MoveTo(midx,midy[i]);
			pdc->LineTo(midx-(int)(dx*0.5f),midy[i]);
		}
	}
		
	pdc->SelectObject(poldpen);		
	pdc->SetMapMode(MM_TEXT);
}




你可能感兴趣的:(MFC)