CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

图形转动

楼主yangchonglv(瓯越浪子)2004-05-04 11:55:24 在 VB / 基础类 提问

如何在vb6.0中实现图形转动 问题点数:0、回复次数:6Top

1 楼BitBlt(Raster Operater)回复于 2004-05-04 14:10:26 得分 0

 
      任意角度旋转图形  
   
   
  来源:cww     VB5.0进阶程式开发指南  
   
  如果有一个图范围如下:  
   
              P1+----------+   P2  
                  |                     |  
                  |                     |  
                  |                     |  
                  |                     |  
                  |                     |  
              P3+----------+   P4  
   
   
  我们以P3为轴,顺时针转某个角度,如果是NT的使用者,可以使用PlgBlt()这个API来完  
  成,如果是Win95那就没办法了,这里也提供   VB5.0进阶程式开发指南所用的方法来完成  
   
  PlgBlt()的第二个叁数是重点,它是指向POINTAPI的一个3个元素之阵列,代表图形旋转  
  之後的三个端点,也就是说顺时针转了某个角度後,P1->P1'     P2->P2'     P3->P3',这阵  
  列便是存P1'   P2'   P3'。   所以了,重点在於这三个点的取得,数学不好的我可真痛苦;  
  如果这三个点没有设好,那会产生一个变形的图,原本   PlgBlt()便是用来扭曲图形用的  
  ,只是那三个点如果设好的话,刚好可以来旋转图。  
   
    PlgBlt(  
          HDC     hdcDest,           //   handle   of   destination   device   context  
          CONST   POINT   *     lpPoint,     //   vertices   of   destination   parallelogram  
          HDC     hdcSrc,           //   handle   of   source   device   context  
          int     nXSrc,             //   x-coord.   of   upper-left   corner   of   source   rect.  
          int     nYSrc,             //   y-coord.   of   upper-left   corner   of   source   rect.  
          int     nWidth,           //   width   of   source   rectangle  
          int     nHeight,           //   height   of   source   rectangle  
          HBITMAP     hbmMask,           //   handle   of   bitmask  
          int     xMask,             //   x-coord.   of   upper-left   corner   of   bitmask   rect.  
          int     yMask           //   y-coord.   of   upper-left   corner   of   bitmask  
    )  
   
  需2个Command   Button     2个PictureBox,目的在Picture2画出旋转图  
   
  Option   Explicit  
  Private   Declare   Function   PlgBlt   Lib   "gdi32"   (ByVal   hdcDest   As   Long,   _  
  lpPoint   As   POINTAPI,   ByVal   hdcSrc   As   Long,   ByVal   nXSrc   As   Long,   _  
  ByVal   nYSrc   As   Long,   ByVal   nWidth   As   Long,   ByVal   nHeight   As   Long,   _  
  ByVal   hbmMask   As   Long,   ByVal   xMask   As   Long,   ByVal   yMask   As   Long)   As   Long  
  Private   Type   POINTAPI  
  x   As   Long  
  y   As   Long  
  End   Type  
  Const   pi   =   3.14159265358979  
  Dim   dThetaDeg   As   Double  
  '以下只适用於NT  
  Private   Sub   Command1_Click()  
  Dim   pt(1   To   3)   As   POINTAPI,   p4   As   POINTAPI  
  Dim   dx   As   Long,   dy   As   Long  
  Dim   i   As   Long,   offsetX   As   Long,   offsetY   As   Long  
  Dim   sida   As   Double  
  Dim   MaxX   As   Long,   MaxY   As   Long,   MinX   As   Long,   MinY   As   Long  
   
  sida   =   dThetaDeg   *   pi   /   180  
  dx   =   Me.ScaleX(Picture1.Picture.Width,   vbHimetric,   vbPixels)  
  dy   =   Me.ScaleX(Picture1.Picture.Height,   vbHimetric,   vbPixels)  
  pt(1).x   =   dy   *   Sin(sida)  
  pt(1).y   =   dy   -   dy   *   Cos(sida)  
  pt(2).x   =   pt(1).x   +   dx   *   Cos(sida)  
  pt(2).y   =   pt(1).y   +   dx   *   Sin(sida)  
  pt(3).x   =   0:   pt(3).y   =   dy  
   
  'p4不用在pt()之阵列,它是由pt(1)-pt(3)所推出  
  p4.x   =   pt(3).x   +   dx   *   Cos(sida)  
  p4.y   =   pt(3).y   +   dx   *   Sin(sida)  
   
  '以下的工作只是为了让旋转後的图在Picture2的中间显示  
  MaxX   =   IIf(pt(1).x   >   pt(2).x,   pt(1).x,   pt(2).x)  
  MaxX   =   IIf(MaxX   >   pt(3).x,   MaxX,   pt(3).x)  
  MaxX   =   IIf(MaxX   >   p4.x,   MaxX,   p4.x)  
  MinX   =   IIf(pt(1).x   <   pt(2).x,   pt(1).x,   pt(2).x)  
  MinX   =   IIf(MinX   <   pt(3).x,   MinX,   pt(3).x)  
  MinX   =   IIf(MinX   <   p4.x,   MinX,   p4.x)  
   
  MaxY   =   IIf(pt(1).y   >   pt(2).y,   pt(1).y,   pt(2).y)  
  MaxY   =   IIf(MaxY   >   pt(3).y,   MaxY,   pt(3).y)  
  MaxY   =   IIf(MaxY   >   p4.y,   MaxY,   p4.y)  
  MinY   =   IIf(pt(1).y   <   pt(2).y,   pt(1).y,   pt(2).y)  
  MinY   =   IIf(MinY   <   pt(3).y,   MinY,   pt(3).y)  
  MinY   =   IIf(MinY   <   p4.y,   MinY,   p4.y)  
  offsetX   =   (Picture2.ScaleWidth   -   MaxX   +   MinX)   \   2   -   MinX  
  offsetY   =   (Picture2.ScaleHeight   -   (MaxY   -   MinY))   \   2   -   MinY  
  pt(1).x   =   pt(1).x   +   offsetX:   pt(1).y   =   pt(1).y   +   offsetY  
  pt(2).x   =   pt(2).x   +   offsetX:   pt(2).y   =   pt(2).y   +   offsetY  
  pt(3).x   =   pt(3).x   +   offsetX:   pt(3).y   =   pt(3).y   +   offsetY  
   
  i   =   PlgBlt(Picture2.hDC,   pt(1),   Picture1.hDC,   0,   0,   dx,   dy,   0,   0,   0)  
  End   Sub  
   
  '这个方式不管95/NT都可行,来自vb5程式设计进阶指南一书,但速度慢  
  Private   Sub   Command2_Click()  
          Dim   nX   As   Integer,   nY   As   Integer  
          Dim   nX1   As   Integer,   nY1   As   Integer  
          Dim   dX2   As   Double,   dY2   As   Double  
          Dim   dX3   As   Double,   dY3   As   Double  
   
          Dim   dThetaRad   As   Double  
   
          'Compute   angle   in   radians  
          dThetaRad   =   -dThetaDeg   *   pi   /   180  
          'Set   scale   modes   to   pixels  
          For   nX   =   0   To   Picture2.ScaleWidth  
  nX1   =   nX   -   Picture2.ScaleWidth   \   2  
  For   nY   =   0   To   Picture2.ScaleHeight  
          nY1   =   nY   -   Picture2.ScaleHeight   \   2  
          'Rotate   picture   by   dThetaRad  
          dX2   =   nX1   *   Cos(-dThetaRad)   +   nY1   *   Sin(-dThetaRad)  
          dY2   =   nY1   *   Cos(-dThetaRad)   -   nX1   *   Sin(-dThetaRad)  
          'Translate   to   center   of   picture   box  
          dX3   =   dX2   +   Picture1.ScaleWidth   \   2  
          dY3   =   dY2   +   Picture1.ScaleHeight   \   2  
          'If   data   point   is   in   picOne,   set   its   color   in   picTwo  
          If   dX3   >   0   And   dX3   <   Picture1.ScaleWidth   -   1   _  
  And   dY3   >   0   And   dY3   <   Picture1.ScaleHeight   -   1   Then  
  Picture2.PSet   (nX,   nY),   Picture1.Point(dX3,   dY3)  
          End   If  
  Next   nY  
          Next   nX  
  End   Sub  
   
  Private   Sub   Form_Load()  
  Picture1.ScaleMode   =   3  
  Picture2.ScaleMode   =   3  
  '设定旋转角度  
  dThetaDeg   =   30  
  Set   Picture1.Picture   =   LoadPicture("e:\cli.bmp")  
   
  End   Sub  
  Top

2 楼ljf88888(feng)回复于 2004-05-05 12:03:28 得分 0

upTop

3 楼kmzs(.:RNPA:.山水岿濛)回复于 2004-05-05 12:09:01 得分 0

好用Top

4 楼hhyttppd(123456)回复于 2004-05-05 12:15:21 得分 0

除了前面的方法,当然你可以用图形学里旋转矩阵对它进行变换。不过就是太慢,闪烁太大,也可能实现不了动画效果。  
  Top

5 楼thirdapple(.:RNPA:.陨落雕 - 芝兰宝树)回复于 2004-05-05 12:37:57 得分 0

呵呵,To   楼上的,都是用旋转矩阵实现的……Top

6 楼yangchonglv(瓯越浪子)回复于 2004-05-05 13:52:07 得分 0

有没有只转动90、270读的,那比较简单Top

相关问题

  • 图形
  • JavaScript 图形学
  • 图形问题~~.~~
  • 图形问题
  • 图形系统
  • 显示图形
  • 打印图形!
  • 图形判断
  • 图形填充!
  • 图形显示

关键词

  • 图形
  • source
  • vb
  • plgblt
  • maxy
  • coord
  • bitmask
  • byval
  • upper
  • iif

得分解答快速导航

  • 帖主:yangchonglv

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo