GDI 实现图形的旋转与放缩

war1111886 2013-02-18 01:55:39
用GDI描画直线、矩形、椭圆。怎么对描画后的图形按照一定的比例放缩、旋转啊!!
GDI不像GDI+,D2D等可以直接缩放,要自己计算的,哪位大神有个小实例啊!!!
...全文
334 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tonforce 2013-02-21
  • 打赏
  • 举报
回复
愚见: 1,先找个参照点作为坐标原点,比如作业中心点; 2,然后你可以试着在该坐标上画个圆; 3,等比缩放:定义刻度,作为缩放比例,刻度变化,重绘; 旋转:定义角度,角度变化,重绘;
昆仑道长 2013-02-20
  • 打赏
  • 举报
回复
对矩形和椭圆放大和缩小提供思路,旋转类似,需要用到三角函数,如二楼所说。

//在窗口初始化OnInitDialog函数里将下面四组变量初始化为相同值,并在窗口中央绘制出来。
int oldStartX,oldStartY;
int oldwidth,oldheight;
int newStartX,newStartY;
int newwidth,newheight; 
//响应鼠标滚轮消息,对图形进行放大缩小
OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{ 
  if(zDelta == 120) //鼠标滚轮向上滚动,放大图形,每次放大一倍
   // 用背景刷檫除原来的图形
   // 将oldStartX,oldStartY,oldWidth,oldHeight代入GDI函数即可完成檫除
   // 设置newStartX,newStartY,newWidth,newHeight
   // newStartX = oldStartX-oldWidth/2;
   // newStartY = oldStartY-oldHeight/2;
   // newWidth  = oldWidth*2;
   // newHeight = oldHeight*2;
   // 将newStartX,newStartY,newWidth,newHeight代入GDI函数即可完成放大
    // 放大之后不要忘记将newStartX,newStartY,newWidth,newHeight一一赋值给对应老变量,如下
    // oldStartX = newStartX;
    // oldStartY = newStartY;
    // oldWidth = newWidth;
    // oldHeigth = newHeight;
    if(zDelta == -120)//鼠标滚轮向下滚动,放大图形,每次缩小一倍
   // 流程和放大类似,就是变量赋值的时候不是-而是+了,*2变成/2了.
war1111886 2013-02-20
  • 打赏
  • 举报
回复
理论都懂,用程序实现困难重重~~~
赵4老师 2013-02-19
  • 打赏
  • 举报
回复
《计算机图形学》
JinCraft 2013-02-19
  • 打赏
  • 举报
回复
高中课本里的解析几何有讲。我就是照着书编的。注意误差问题,误差大了图像很容易走形
sniffer12345 2013-02-18
  • 打赏
  • 举报
回复
平移: 设某点向x方向移动 dx, y方向移动 dy ,[x,y]为变换前坐标, [X,Y]为变换后坐标。 则 X = x+dx; Y = y+dy; 以矩阵表示: 1 0 0 [X, Y, 1] = [x, y, 1][ 0 1 0 ] ; dx dy 1 1 0 0 0 1 0 即平移变换矩阵。 dx dy 1 旋转: 旋转相比平移稍稍复杂: 设某点与原点连线和X轴夹角为b度,以原点为圆心,逆时针转过a度 , 原点与该点连线长度为R, [x,y]为变换前坐标, [X,Y]为变换后坐标。 x = Rcos(b) ; y = Rsin(b); X = Rcos(a+b) = Rcosacosb - Rsinasinb = xcosa - ysina; (合角公式) Y = Rsin(a+b) = Rsinacosb + Rcosasinb = xsina + ycosa ; 用矩阵表示: cosa sina 0 [X, Y, 1] = [x, y, 1][-sina cosa 0 ] 0 0 1 cosa sina 0 -sina cosa 0 为旋转变换矩阵。 0 0 1 缩放 设某点坐标,在x轴方向扩大 sx倍,y轴方向扩大 sy倍,[x,y]为变换前坐标, [X,Y]为变换后坐标。 X = sx*x; Y = sy*y; 则用矩阵表示: sx 0 0 [X, Y, 1] = [x, y, 1][ 0 sy 0 ] ; 0 0 1 sx 0 0 0 sy 0 即为缩放矩阵。 0 0 1

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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