急求矢量数据转换为栅格数据方法与源代码

解决方案 »

  1.   

    这个没什么特殊方法,更不需要什么算法,按照矢量数据绘制就是了,要保存或者使用双缓冲就绘制到内存DC,否则直接绘制到屏幕DC也可以。要注意的是,矢量数据的单位一般都不是屏幕像素,所以这中间可以自己确定比例缩放(这也正是矢量的优势)。
      

  2.   

    建一个  HBITMAP 和一个 HDC ,把位图选进设备,比如:
    m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBmp);然后就可以把矢量数据绘制到设备了,比如:
    Polygon(m_hMemDC,pPoint,ACount);此时 HBITMAP 中就有你要的栅格数据
      

  3.   

    ~我想要具体的算法和VB或VC代码,如边界代数法的实现代码~有人有么
      

  4.   

    请参考
    http://topic.csdn.net/u/20090511/17/7e20815b-d935-47d2-9a0c-70939bf0d370.html也许可以帮助您。
      

  5.   

    本人找到个DELPHI 的程序代码,大家看看,有这样的实现的C++代码或者VB 的
    栅格和矢量是GIS中两种主要的图形数据结构。矢量格式向栅格格式转换又称为多边形填充,就是在矢量表示的多边形边界内部的所有栅格上赋予相应的多边形编号,从而形成栅格数据阵列。矢量向栅格转换的算法主要有:内部点扩散算法、复数积分算法、射线算法、扫描算法。
    本题的解答采用边界代数法。边界代数法是一种基于积分思想的矢量结构向栅格结构转换的高效算法。边界代数法算法简单、可靠、速度快。下图表示单个多边形转换的过程,设多边形的编号为a。模拟积分法求多变形区域面积的过程,初始化的阵列栅格值为0,以栅
     
    格行列为参考坐标轴,当多变形边界上行时,该边界左边具有相同行坐标的所有栅格减去a;当边界下行时,该边界左边所有栅格点加一个值a;当边界左右行时栅格值不增减。边界代数法与其它算法的不同之处在于它不是逐点搜寻判别边界,而是根据边界的拓扑信息,通过简单的加减代数运算将拓扑信息动态地赋予各栅格点,实现了矢量格式到栅格格式的转换。边界搜索完毕则完成多变形的转换。边界代数法算法简单、可靠、速度快。
    二、程序主要功能代码如下:
    procedure creatept();  //生成矢量点坐标
    var i,j:integer;
    begin
      ptnum:=6;
      x1[1]:=30; y1[1]:=150;
      x1[2]:=80; y1[2]:=350;
      x1[3]:=250; y1[3]:=450;
      x1[4]:=350; y1[4]:=330;
      x1[5]:=400; y1[5]:=150;
      x1[6]:=200; y1[6]:=20;
      for i:=0 to 80 do
        for j:=0 to 80 do
          rast[i][j]:=0;
    end;
    procedure convtcoordinate(); //将x、y点坐标转换成该点所在的栅格的行列号
    var i:integer;
    begin
      for i:=1 to ptnum do
      begin
         x2[i]:=Trunc (x1[i]/6);
         y2[i]:=Trunc (y1[i]/6);
      end;
    end;
    procedure createslp();
    var i,j:integer;
    begin
       for i:=1 to ptnum do
       begin
          j:=i mod ptnum+1;
          if(y2[i]-y2[j])=0 then
          begin
             slp[i]:=1000;
          end
          else
          begin
             slp[i]:=(x2[i]-x2[j])/(y2[i]-y2[j]);
          end;
      end;
    end;
    procedure toGrid(); //转为栅格图
    var i,j,m,n:integer;
    begin
      for m:=1 to ptnum do
      begin
         n:=m mod ptnum+1;
         if x2[m]<x2[n] then
         begin
            for i:= x2[m] to x2[n]-1  do
              for j:=0 to round((i-x2[m])/ slp[m])+ y2[m] do
                 rast[i][j]:=rast[i][j]+1;
         end;
         if x2[m]>x2[n] then
         begin
            for i:= x2[n] to x2[m]-1  do
              for j:=0 to round((i-x2[n])/ slp[m])+ y2[n] do
                 rast[i][j]:= rast[i][j]-1;
         end;
      end;
    end;
    procedure TForm1.BtnVectorClick(Sender: TObject); //展示矢量图
    begin
       creatept();
       image1.Canvas.brush.color:=clgray;
       image1.Canvas.Polygon([Point(y1[1],x1[1]),Point(y1[2],x1[2]), Point(y1[3],x1[3]),Point(y1[4],x1[4]),
    Point(y1[5],x1[5]), Point(y1[6],x1[6])]);
    end;
    procedure TForm1.BtnGridClick(Sender: TObject); //展示栅格图
    var i,j,t,v:integer;
    begin
      convtcoordinate();
      createslp();
      toGrid();
      
      for i:=1 to 80 do
        for j:=1 to 80 do
        begin
           if rast[i][j]>=1 then
           begin
              image1.Canvas.pen.color:=clblue;
              image1.canvas.Rectangle(6*j,6*i,6+6*j,6+6*i);
           end;
       end;
    end;
    end.