微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题C++ Builder中如何使用自定义坐标
栏目软件世界
作者何纯玉
发布2001年17期
  如果大家使用过VB,一定对VB中的Scale命令记忆很深吧,的确在VB中很容易进行坐标映射,但是在C++ 中,就不那么容易了,如果你想在 TImage 控件中作图,每次都要进行坐标转换,那岂不是太累了!使用下面的函数,可以方便的进行坐标映射。
  //TForm1 需要改成你的程序的窗体,并且需要在类中声明
  //DrawingWidth、DrawingHeight 为映射后的实际宽高
  // 如x:-50~100 y:-10~20 则DrawingWidth取150,DrawHeight取30
  void TForm1::SetViewPort(TImage *Pic,int DrawingWidth,int DrawingHeight)
  {
  //设置坐标映像模式为MM_ANISOTROPIC
  SetMapMode(Pic->Canvas->Handle,MM_ANISOTROPIC);
  //将TImage实际宽高映射到给定宽高
  SetWindowExtEx(Pic->Canvas->Handle,
  DrawingWidth,
  DrawingHeight,
  NULL);
  //设置视口,X轴默认从左到右,Y轴取负,使其方向从下到上
  SetViewportExtEx(Pic->Canvas->Handle,
  Pic->Width,
  -Pic->Height,
  NULL);
  //窗口原点的位置,当然用 0,0
  SetWindowOrgEx(Pic->Canvas->Handle,
  0,
  0,
  NULL);  
  //视口原点的位置,就是 TImage 中哪一点和上面的(0,0)对应,需要手工修正
  SetViewportOrgEx(Pic->Canvas->Handle,
  Pic->Width*50.0/150.0
  Pic->Height*20.0/3.0
  NULL);  
  //就是说,我的原点是(0,0),原点距离左边占整个宽的百分比为:50.0/150
  //原点距离上面占整个高的百分比为:20.0/30.0
  }
  说明:还有一点注意,这里的DrawingWidth DrawingHeight 均为整数,不要给它很小的值,当需要计算小值时,乘以n缩放一下,如计算0~2*PI 的sin值,X:0~2*PI,Y:-1~1,DrawingWidth可以取值为2*PI的100倍:100*2*PI,DrawingHeight可以取1-(-1) 的100:200。
  窗口原点设置手工改为:
  SetViewportOrgEx(Pic->Canvas->Handle,
  0,
  Pic->Height*1.0/2.0,
  NULL);  
  调用函数格式可能为:
  double x,y;
  SetViewPort(Image1,100*2*3.14159265,200);
  for(x=0;x<=2*3.14159265;x+=0.01)
  {
  y=sin(x);
  Image1->Canvas->Pixels[100*x][100*y]=clBlue; //相应点打上颜色
  }
  注:以上程序在 C++Builder 5.0中调试通过。