VC 打印测井曲线 按照1:200的比例,但是打印出来的经过实际的测量不是1:200的,总是差那么一点点,该怎么解决a

ctongxingzheng111 2014-08-25 11:24:41
VC 打印测井曲线 按照1:200的比例,但是打印出来的经过实际的测量,但是总是差一点点,感觉是绘制的时候,直接的moveto,lineto,中,直接就int类型的了,这个问题怎么解决的,怎么才能弄出,1:200的打印比例的标尺以及网格道啊,大神么,谁遇到过啊!!!
打印代码如下:
CPrintDialog d1(FALSE,PD_ALLPAGES|PD_ALLPAGES|PD_NOPAGENUMS,NULL); // 建立打印对话框对象

if(d1.DoModal()==IDOK)
{
memDC.Attach(d1.GetPrinterDC());

int xP = GetDeviceCaps(memDC.m_hDC, LOGPIXELSX); //x方向每英寸像素点数
int yP = GetDeviceCaps(memDC.m_hDC, LOGPIXELSY); //y方向每英寸像素点数


DOUBLE xPix = (DOUBLE)xP*10/254; //每 mm 宽度的像素
DOUBLE yPix = (DOUBLE)yP*10/254; //每 mm 高度的像素

DOUBLE fAdd = 5*yPix; //每格纵向递增量 5mm每个

DOUBLE nTop = 40*yPix; //第一页最上线
DOUBLE nxAdd = 5*xPix; //每格横向地增量 5mm每个

DOUBLE nLeft = 5*xPix; //最左线
DOUBLE nRight = (A4_W-20)*xPix; //最右线


//粗笔
cPen.CreatePen(PS_SOLID, 3, RGB(0, 0, 0));

TCHAR szTitle[] = TEXT(“曲线");
static DOCINFO di = {sizeof (DOCINFO), szTitle} ;

if(memDC.StartDoc(&di)<0)
{
AfxMessageBox( "连接到打印机失败!", MB_ICONSTOP);
}
else
{
if(memDC.StartPage() < 0)
{
AfxMessageBox(_T("打印失败!"), MB_ICONSTOP);
memDC.AbortDoc();
return;
}
else
{

int gridSize=2;
//网格绘制
UINT gridNum = ((m_Bottomcurve-m_topcurve)/2)+10; //网格数 :(底深-顶深)/2+5

//绘制空道,
CRect rc;

//绘制网格粗实线
CPen penRect;
penRect.CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
CPen * pOldPen = memDC.SelectObject(&penRect);
memDC.Rectangle(nLeft+20*nxAdd*gs,nTop,nLeft+20*nxAdd*(gs+1),nTop+(gridNum)*fAdd);
rc.SetRect(nLeft+20*nxAdd*gs,nTop,nLeft+20*nxAdd*(gs+1),nTop+(gridNum)*fAdd);
memDC.SelectObject(pOldPen);


CPen penBlack;
penBlack.CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
pOldPen = memDC.SelectObject(&penBlack);

for (int i=gridSize; i<gridNum*gridSize; i+=gridSize)
{

if (i%(5) == 0)
{
memDC.MoveTo(rc.left,rc.top+i*fAdd);
memDC.LineTo(rc.right,rc.top+i*fAdd);
}
}
memDC.SelectObject(pOldPen);
//绘制网格细实线
CPen thinBlack;
thinBlack.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
pOldPen = memDC.SelectObject(&thinBlack);
for (i=gridSize; i<gridNum*gridSize; i+=gridSize)
{
if (i%(5) != 0)
{
memDC.MoveTo(rc.left,rc.top+i*fAdd);
memDC.LineTo(rc.right,rc.top+i*fAdd);
}
}
memDC.SelectObject(pOldPen);
//绘制内部虚线
CPen dashed;
dashed.CreatePen(PS_DOT, 1, RGB(140, 140, 140));
pOldPen = memDC.SelectObject(&dashed);
for ( i=1; i<gridNum*gridSize; i+=gridSize )
{
memDC.MoveTo(rc.left,rc.top+i*fAdd);
memDC.LineTo(rc.right,rc.top+i*fAdd);
}
memDC.SelectObject(pOldPen);

penBlack.DeleteObject();//by mn
thinBlack.DeleteObject();//by mn
dashed.DeleteObject();//by mn
penRect.DeleteObject();
}

绘制出来的图,是这样的,但是打印出来的话,一厘米就是差那么一点点,而且随着深度的增加,这个误差就会显现的更加明显一些!!!
怎么才能做到准确呢,亲们!!!
...全文
686 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhhh63 2014-09-19
  • 打赏
  • 举报
回复
补充,我做过井深的曲线,用户没有测过,只看数据。
hhhh63 2014-09-19
  • 打赏
  • 举报
回复
引用 楼主 ctongxingzheng111 的回复:
感觉是绘制的时候,直接的moveto,lineto,中,直接就int类型的了
LZ计算中用的都是DOUBLE类型,这种算法理论上,每一个点转换成整形后和原点比,只有0.0几毫米的误差,不会累计。 不知道LZ的误差有多大,我用word试了一下,180x280mm的矩形框,线形尽量细,EPSON普通商用打印机,用直尺测量,打印结果,180±0,280-0.5,横向基本没有误差,纵向大约有-0.2%的误差,这个应该是打印走纸机械部分的系统误差。 LZ先测一下横向尺寸,如果横向有误差,说明是计算或取分辨率的问题。如果横向没有误差,基本上就是系统误差了。解决方法: 1. 如果误差太大,只有换好一点的打印机,打印机太旧,误差也会增加,可以用word画个框试试。 2. 从打印机属性中选高精度打印。 3. 如果只有很小的系统误差,<0.5%,还要求改进的话,在取得纵向分辨率后乘一个修正系数,如1.002,实际工程中常这么用。 说明:从工程的角度看,打印误差是不可避免的,控制在有效范围就行。
zgl7903 2014-09-19
  • 打赏
  • 举报
回复
DC SetMapMode 模式用 MM_HIENGLISH 或 MM_HIMETRIC MM_HIENGLISH Each logical unit is mapped to 0.001 inch. Positive x is to the right; positive y is up. MM_HIMETRIC Each logical unit is mapped to 0.01 millimeter. Positive x is to the right; positive y is up.
用户 昵称 2014-09-18
  • 打赏
  • 举报
回复
用打印机的话,也要检查打印机是否准确。
赵4老师 2014-08-25
  • 打赏
  • 举报
回复
提醒:屏幕像素的大小通常为1/72英寸。
ctongxingzheng111 2014-08-25
  • 打赏
  • 举报
回复
亲们,有没有人回答一下我啊!!
EIT王子 2014-08-25
  • 打赏
  • 举报
回复
你没有用打印机。。你打成PDF了//哈哈。给分

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧