格行列为参考坐标轴,当多变形边界上行时,该边界左边具有相同行坐标的所有栅格减去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.
m_hOldBitmap = (HBITMAP)SelectObject(m_hMemDC, m_hBmp);然后就可以把矢量数据绘制到设备了,比如:
Polygon(m_hMemDC,pPoint,ACount);此时 HBITMAP 中就有你要的栅格数据
http://topic.csdn.net/u/20090511/17/7e20815b-d935-47d2-9a0c-70939bf0d370.html也许可以帮助您。
栅格和矢量是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.