如何确定所绘线段的实际长度?

cxb_zdl 2002-02-13 01:46:26
各位大侠:
我在用delphi绘制一张图表时,如何确定我绘出的线段到底是多少厘米长呢?
...全文
203 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxb_zdl 2002-02-21
  • 打赏
  • 举报
回复
谢谢小新,这问题我已经解决了!其实我就是为了精确打印按实际比例(在电脑上是逻辑比例)绘制的图件,哈哈,可让我头痛了好几天.
用GetDeviceCaps函数。
cobi 2002-02-14
  • 打赏
  • 举报
回复
在delphi中,使用moveto和lineto画线,一般的都是给出坐标然后实现。那实际上已经能够知道线段的长度,不过那时像素的点数。你要知道实际的长度,只要知道如何实现像素点和实际长度的转换即可,查看一下相关的api吧
cxb_zdl 2002-02-13
  • 打赏
  • 举报
回复
也就是你画一条线,如何知道这条线有几厘米长。
vcshcn 2002-02-13
  • 打赏
  • 举报
回复
什么意思
软件简介: MAPGIS6.5实用工具,集成若干MAPGIS6.5不具有的实用功能,简单易用。 普通版有以下特色功能: 1、精确制图功能(类似于AutoCAD)。画线、移动、复制图元时,都可以输入距离和角度,还可以捕捉端点(按SHIFT)、中点(按CTRL)、交点(按SPACE)、垂足(按ALT)等,F2为正交开关,CTRL+D为线段单选开关。 2、滚轮缩放功能。向前滚动图形放大,向后滚动图形缩小,按下滚轮图形平移。 3、格式刷功能。点、线、区都可以运用格式刷进行修改和编辑。 4、查询图元功能。自动查找文本、属性、子图、颜色等。 5、参数拾取功能。拾取点、线、区参数作为当前编辑参数。 6、等距排列功能。文本或图例都可以进行横向、纵向的等距离自动排列。 7、快速制表功能。利用画水平线、竖直线以及捕足功能,输入距离移动、复制、拉伸线条功能,可以快速绘制各种表格。 8、测量距离功能。测量直线段或多段折线的距离或长度,可以使用捕捉功能。 9、测量面积功能。测量面积不需要造区,按顺序点击拐点即可,也可选择一条闭合的线段,即可测量面积。可以直接测量线图元的方位角。 10、测量角度功能。选择直线段可以测量该线段的的方位角及象限角。 11、面积换算功能。直接将测量出来的图上面积转换为实际面积。 12、面积标注功能。点击某块区域,自动标注该区域的面积,可带引线标注。 13、坐标标注功能。在图上单击某个点,即可标出该点的图上坐标或实际坐标值,可带引线标注。 14、比例造线功能。确定比例尺后,输入以米为单位的数据时,可以自动转换为图上距离,不需要人工换算,同时可以输入距离和角度。 15、线段拉伸功能。能够将线段进行拉伸,所有选中的线节点将同时拉伸,同时可以输入距离和角度。 16、线段切除功能。互相相交的线段,选择其中一条,可以切除另外一条线段在该线段两侧的部分,也可以切除夹在两条线段中间的部分。 17、线段交会功能。选择两条不平行的线段,可以使其相交于某一点,已经相交的两条线段,可以切除交点任意一侧的部分。 18、线段炸开功能。将多段线在节点处分开,生成若干条线段。 19、线段旋转功能。输入一个角度值,并确定一个旋转基点,即可精确旋转一条线段。 20、改线长度功能。选项择一条线段,可以直接修改该线段长度值。 21、属性编辑功能。采用电子表格的方式对图元属性进编辑,与excel、acsses能够直接互相复制、粘贴,并且能够实现图形联动、属性联动等操作。 22、属性提取功能。输入属性提取条件,能够将点、线、区中符合条件的图元提取到新的文件中。 23、属性标注功能。选择某个字段,可以将该字段的属性值标注在图元的相应位置上。 24、属性动态显示。选择某个点线区文件,可以将某个字段或所有字段的属性值,随着鼠标的移动,适时动态地显示出来。 25、ID关联功能。将点线区相应位置上的图元ID修改为同一属性值,排序后能够将点线区对应的属性值进行批量拷贝。 26、删除指定图元。可以根据图元ID能及图元属性有条件地对图元批量删除。 27、删除重叠图元。自动搜索互相重叠的图元,删除多余的重叠图元。 28、匹配图例参数。选择某个图例,可以将该图例的参数及属性值全部赋给相应的图元。 29、自动生成样槽。选择两条节点数相同的平行线段,能够自动生成黑白相间的样槽。 30、批量替换注释。输入若干条需要替换的注释,可以一次性进行替换,并自动保存替换数据,下次或打开另外一张图时仍可使用,不需要重新输入。 31、整图栽剪功能。不需要生成单独的栽剪框文件,只要选择工程文件中任一条封闭的线就会自动对工程中的所有可见文件进行栽剪,栽剪后的文件自动保存在新建的目录中,每次栽剪都会生成一个新的目录,栽剪后的文件名与原文件名一致。 32、CAD转MapGis。本功能可以将AutoCAD格式的图形文件转换成MapGis格式的图形文件,能将CAD中的充填图案直接转换成MapGis中的区图元,而且能将CAD中的内部块、多行文本直接转出,不需要在CAD中分解。完全按照CAD中的图层分层转出所有可见图元,颜色、线型自动转换,不需要对照表,所有操作全自动。并能够将CASS中生成的地物编码转为MapGis图元属性。 33、Excel转MapGis。本功能可以将 Microsoft Office Excel 电子表格文件中的各种表格直接转换成MapGis格式的点、线、面文件。 34、自动画柱状图。本功能可以将保存在 Microsoft Office Excel 电子表格文件中的钻孔数据绘制成钻孔柱
用DDraw实现射击游戏说明文档 要点一:画图自动切割 IDirectDrawSurface7::BltFast()方法中没有自动切割功能,即当画图元素超出窗口以外时不会自动切割,DDraw选择自动忽略不画,造成一旦超出窗口,画图元素会突然消失。 解决这一问题的方法是手动切割,代码如下: //自动切割 RECT scRect; //存放当前窗口大小区域 ZeroMemory( &scRect, sizeof( scRect ) ); GetWindowRect( GetActiveWindow(), &scRect ); //防止图片左上角超过窗口左上角 if ( x < 0 ) { m_rect.left -= x; x = 0; } if ( y scRect.right ? scRect.right : x; y = y > scRect.bottom ? scRect.bottom : y; m_rect.right = x + m_rect.right - m_rect.left > scRect.right ? scRect.right - x + m_rect.left : m_rect.right; m_rect.bottom = y + m_rect.bottom - m_rect.top > scRect.bottom ? scRect.bottom - y + m_rect.top : m_rect.bottom; 只需将上述代码加在CGraphic::BltBBuffer() 中的m_bRect = m_rect; 前即可。 要点二:背景的滚轴实现 画背景可以分为以下三种情况: 情况一:背景图片与窗口等高 情况二:背景图片高度小于窗口高度 情况三:背景图片高度大于窗口高度 上述讲解图与代码相对应地看,有助于容易理解。 另外,要点一实现之后,由于已经可以自动切割,画背景可以用其它方法。 要点三:精灵图的实现 在游戏中,如RPG游戏中的人物图、射击类游戏的飞机、爆炸等,叫做精灵图。 精灵图实际上是将所有帧的图片放在一个文件中,游戏时靠一个RECT来控制画图像文件中的哪一部分,进而控制游戏显示哪一帧图,只需控制好RECT的位置即可。如下图: 控制RECT的四个角的坐标的移动,有以下代码: if (m_timeEnd – m_timeStart > 100) //只有到了100ms之后才绘图 { m_ImageID++; if(m_ImageID - m_beginID >= num) { m_ImageID = m_beginID; //最后一帧的下一帧是第一帧 } m_timeStart = timeGetTime(); } int id = m_ImageID++; SetRect(&m_rect, 41 * id, 0, 41 * (id + 1), 41); //飞机精灵图大小是41×41 m_pGraph->BltBBuffer(m_pImageBuffer, true, m_Pos.x, m_Pos.y, m_rect); 这样就实现了精灵动画的效果。 要点四:拿STL进行子弹的实现 子弹的实现可以使用STL中的vector,当按下开火键时发出一颗子弹,就往vector中添加一个结点;当子弹飞出窗口或击中敌机时,再将结点从vector中删除。每帧游戏画面中子弹飞行时只需将vector中的所有子弹进行处理、绘画即可。 参考代码如下: 1.添加子弹 if (g_ctrlDown) //当ctrl键按下时开炮! { m_BulletEnd = m_Gtime->GetTime(); if ((m_BulletEnd - m_BulletStart) * 1000 > 120) //如果连续按着开火键不放,这里控制不会发出太多子弹 { m_BulletStart = m_BulletEnd; MBULLET tmpBullet; tmpBullet.pos.x = m_SPos.x - 1; //记录开火时的子弹位置 tmpBullet.pos.y = m_SPos.y - 26; tmpBullet.speed = 5; //该子弹的飞行速度 m_BulletList.push_back(tmpBullet); //将子弹添加到vector中

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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