




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录用vc怎么画旋转(非线性)椭圆1VC旋转图片2VC+ TransparentBlt函数实现5vc 图像旋转7用vc怎么画旋转(非线性)椭圆 介绍 窗口中的矩形,带圆角的矩形和椭圆只能由GDI在轴向上绘制。假如有人希望在Windows NT下绘制旋转或歪斜的图形,他可以使用世界坐标系变换。很不幸的是在Windows 95/98下,是没有世界坐标系变换的。作为一个跨平台的解决方案,就需要自己做更多的工作。矩形能由四边形模拟,这样它就能旋转和歪斜了。然而,椭圆又该怎么办呢?基本上有三个选择。 两种选择 使用一个定制的函数来画椭圆。 椭圆的数学模型相对简单,而且还有用于在标准文本中旋转椭圆的修改过的Bresenham方程。然而,这种方法必须自己执行光栅操作,这样在绘制宽线时就变得复杂了。这种努力只有在向一个脱离屏幕的表面(比如DirectDraw)或位图上绘制视才是值得的用连接的线段来绘制椭圆。 实际的线条可以通过LineTo(.)或Polyline(.)图形设备接口调用。你可以自己完成椭圆的近似,或者使用GDI的FlattenPath(.) 函数。 使用贝塞尔曲线来近似绘制椭圆。 这里就举例说明这种方法。 用贝塞尔曲线绘制椭圆 使用四条贝塞尔曲线,每条代表原轴向椭圆的90度,这样就能获得一个相当近似的椭圆,最大误差只有0.027%。这个最大误差相当于长径3700的椭圆的误差小于一个像素,这已经超出我们所要求的准确度了。 优点 简单。 只需要有四个GDI调用。贝塞尔曲线控制点的计算代价是很小的。 快速 你可以利用现在新的显卡对曲线绘制的硬件支持。在我的系统上,这和调用GDI函数Ellipse(.)绘制椭圆的速度比,如果不是更快,至少也是一样快。 变化 因为贝塞尔曲线在旋转、缩放和平移时是不变的,在对椭圆做同样的变化时就只需要传送控制点。更巧的是,因为在一个三次贝塞尔曲线上的每个点都是控制点的重心组合,在仿射映射中曲线上控制点之间的关系是不变的。 设备无关性 假如想自己把椭圆转化为线段或光栅,那么每次表面的分辨率和设备描述表改变时(例如向一个打印机设备描述表绘制时),就必须重新光栅化。而使用贝塞尔曲线时就不需要这样做。还有一个好处就是椭圆能通过图元文件输出到绘画程序,例如CORELDRAW,在其中可以没有失真的缩放图形。 过程 首先以一个轴向椭圆的外接边界矩形开始(使用一个普通的GDI调用)。13个定义4条组成椭圆的贝塞尔曲线的控制点(以下标为0-12)可使用一个经验常量计算得出。下列代码为Y轴正方向向下的的映射模式产生控制点(例如MM_TEXT)。在Y轴正方向向上时,只要如注释中所示,把偏移量设为负值就行了。 / Create points to simulate ellipse using beziers /使用贝塞尔曲线创建点,模拟椭圆 void EllipseToBezier(CRect& r, CPoint* cCtlPt) / MAGICAL CONSTANT to map ellipse to beziers / /3*(sqrt(2)-1) / 把椭圆映射为贝塞尔曲线的常量 2/3*(sqrt(2)-1) const double EToBConst = .2761423749154; CSize offset(int)(r.Width() * EToBConst), (int)(r.Height() * EToBConst); /Use the following line instead for mapping systems where +ve Y is upwards /在Y轴正方向向上时,使用下面一行 /CSize offset(int)(r.Width() * EToBConst), -(int)(r.Height() * EToBConst); CPoint centre(r.left + r.right) / 2, (r.top + r.bottom) / 2); cCtlPt0.x=/-/ cCtlPt1.x=/ cCtlPt11.x =/2_3_4 / cCtlPt12.x = r.left;/ 1 5/ cCtlPt5.x=/ | |/ cCtlPt6.x=/ | |/ cCtlPt7.x= r.right; / 0,126/ cCtlPt2.x=/ | |/ cCtlPt10.x = centre.x - offset.cx;/ | |/ cCtlPt4.x=/11 7/ cCtlPt8.x= centre.x + offset.cx;/ 10_9_8 / cCtlPt3.x=/ cCtlPt9.x= centre.x;/-* cCtlPt2.y= cCtlPt3.y= cCtlPt4.y= r.top; cCtlPt8.y= cCtlPt9.y= cCtlPt10.y = r.bottom; cCtlPt7.y= cCtlPt11.y = centre.y + offset.cy; cCtlPt1.y= cCtlPt5.y= centre.y - offset.cy; cCtlPt0.y= cCtlPt12.y = cCtlPt6.y= centre.y; 使用与下面近似的代码可完成椭圆的旋转 / LDPoint is an equivalent type to CPoint but with floating point precision / LDPoint是一个和CPoint相当的类型,不过它还具有浮点精度。 void Rotate(double radians, const CPoint& c, CPoint* vCtlPt, unsigned Cnt) double sinAng = sin(radians); double cosAng = cos(radians); LDPoint constTerm(c.x - c.x * cosAng - c.y * sinAng, c.y + c.x * sinAng - c.y * cosAng); for (int i = Cnt-1; i=0; -i) vCtlPti = (LDPoint( vCtlPti.x * cosAng + vCtlPti.y * sinAng, -vCtlPti.x * sinAng + vCtlPti.y * cosAng) + constTerm).GetCPoint(); / Create Ellipse / 创建椭圆 CRect rect; GetClientRect(&rect); CPoint ellipsePts13; EllipseToBezier(ellipseR, ellipsePts); / Rotate / 旋转 Rotate(m_Radians, midPoint, ellipsePts, 13); 填充椭圆 当然,无论是不是旋转,四条贝塞尔曲线只完成了椭圆的轮廓。幸运的是,Win32路径功能可用于填充椭圆。你只在需要调用PolyBezier(.)来封闭路径。完成的路径是一笔画出的,而且能被让人满意的填充。假如有人觉得还不够,比如更特殊的填充,比如斜线、用户位图或不规则碎片等。这些能由SelectClipPath(.)来把剪贴区域设置到路径上来而获得。 dc.BeginPath(); dc.PolyBezier(ellipsePts); dc.EndPath(); dc.StrokePath; / or FillPath(); / or StrokeAndFillPath(); / or PathToRegion(dc.m_hDC); / /或者 FillPath(); /或者StrokeAndFillPath(); /或者PathToRegion(dc.m_hDC); 在Win95/8下宽的虚线或点椭圆轮廓。Win95/8只支持实体宽线。然而,虚线或点椭圆轮廓能容易的由一系列贝塞尔曲线段模拟。 VC旋转图片2009-07-03 13:58:22|分类: VC |标签: |字号大中小订阅 第一步,你必须知道位图即BMP格式的文件的结构. 位图(bmp)文件由以下几个部分组成: 1.BITMAPFILEHEADER,它的定义如下: typedef struct tagBITMAPFILEHEADER WORD bfType;/必须为BMDWORD bfSize; /文件大小WORD bfReserved1; /必须为0WORD bfReserved2; /必须为0 DWORD bfOffBits; /从ITMAPFILEHEADER到存放bmp数据的偏移量 BITMAPFILEHEADER, *PBITMAPFILEHEADER; 2.BITMAPINFOHEADER,它的定义如下: typedef struct tagBITMAPINFOHEADER DWORD biSize; /此结构的大小,可用sizeof(BITMAPINFOHEAER)得到 LONG biWidth;/位图宽度,以象素为单位LONG biHeight; /位图高度,以象素为单位 WORD biPlanes; /必须为1 WORD biBitCount;/位图象素位数,可为0,1,4,8,24,32 DWORD biCompression; DWORD biSizeImage; /(仅用于压缩)LONG biXPelsPerMeter; /一米横向象素数 LONG biYPelsPerMeter; /一米纵向象素数DWORD biClrUsed;/ (非零用语短颜色表) DWORD biClrImportant; BITMAPINFOHEADER, *PBITMAPINFOHEADER; 由于以上信息可以直接从MSDN上查到,所以只做简单介绍,你可以自己查看NSDN帮助,上面有很详细的介绍. 3.DIB位图像.这里放的是真正的位图数据. 知道了位图的存放格式,下面我们就可以很容易的把它读如内存. 第二步,读入bmp图像 LPCTSTR lpszFileName4=untitled.bmp; /文件路径 CFile file; /用于读取BMP文件 BITMAPFILEHEADER bfhHeader;/bmp文件头 BITMAPINFOHEADER bmiHeader;/bmp格式头 LPBITMAPINFO lpBitmapInfo; /bmp格式具体信息int bmpWidth=0; /图片宽度int bmpHeight = 0; /图片高度 if(!file.Open(lpszFileName,CFile:modeRead) return ; /打开文件 file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER);/读取文件头 if(bfhHeader.bfType!=(WORD) (M(x1x2?x2:x1)?(x1x2?x2:x1):x3;minWidth = minWidth0?0:minWidth;minHeight = y3(y1y2?y2:y1)?(y1y2?y2:y1):y3;minHeight = minHeight0?0:minHeight;maxWidth = x3(x1x2?x1:x2)?x3:(x1x2?x1:x2);maxWidth = maxWidth0?maxWidth:0;maxHeight = y3(y1y2?y1:y2)?y3:(y1y2?y1:y2);maxHeight = maxHeight0?maxHeight:0;DstWidth = maxWidth - minWidth; DstHeight = maxHeight - minHeight;dcDst = CreateCompatibleDC(dcSrc);newBitmap = CreateCompatibleBitmap(dcSrc,(int)DstWidth,(int)DstHeight);SelectObject(dcDst,newBitmap);for( int I = 0 ;IDstHeight;I+)for(int J = 0 ;J= 0) & (srcX = 0) & (srcY (x1x2?x2:x1)?(x1x2?x2:x1):x3;minWidth = minWidth0?0:minWidth;minHeight = y3(y1y2?y2:y1)?(y1y2?y2:y1):y3;minHeight = minHeight0?0:minHeight;maxWidth = x3(x1x2?x1:x2)?x3:(x1x2?x1:x2);maxWidth = maxWidth0?maxWidth:0;maxHeight = y3(y1y2?y1:y2)?y3:(y1y2?y1:y2);maxHeight = maxHeight0?maxHeight:0;DstWidth = maxWidth - minWidth;DstHeight = maxHeight - minHeight;dcDst = CreateCompatibleDC(dcSrc);newBitmap = CreateCompatibleBitmap(dcSrc,(int)DstWidth,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 61558-2-23:2024 EXV-RLV EN Safety of transformers,reactors,power supply units and combinations thereof - Part 2-23: Particular requirements and tests for transformers
- 医药研发行业年度进展报告表
- 农村文化旅游合作项目协议书
- 销售概况及业绩统计表
- 制造业企业产品质量控制流程表
- 科技行业各领域研究报告表格化展示
- 银行英语考试试题及答案
- 银屑病考试试题及答案
- 医学转正考试试题及答案
- 六一公园活动方案
- 精编人教版小学数学1-6年级期末试题汇总(带答案)
- 肺源性呼吸困难的护理
- 物业管理公司项目招标书(5篇)
- 中医辨证论治高血压的诊断与治疗
- 连锁酒店详细项目规划设计方案
- thanks giving day感恩节幻灯片
- 塔吊安装安全教育培训
- 家庭健康管理员手册
- 模具维护保养记录表
- 网络集成实践报告
- 临床诊疗指南第三版电子版
评论
0/150
提交评论