矢量线的栅格化实验文档

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

矢量线的栅格化
将矢量线转换成栅格格式,再以位图输出,转换算法采用八方向栅格化算法。

其主要实现过程包括栅格数据格式定义;矢量线的八方向栅格化算法实现;位图输出显示三个过程:
private void RasterMenuItem3_Click(object sender, EventArgs e)
{
//Point_T opt =new Point_T(panel1.Location.X,panel1.Location.Y);
Point_T opt =new Point_T(0,0);
double pixelsize = 10;
int rs =(int)(panel1.Size.Height / pixelsize);
int cs = (int)(panel1.Size.Width / pixelsize);
Raster_T mapras = new Raster_T(rs,cs,pixelsize,opt);////构造地图栅格
List<PixelPosition_T> mappixel = RasterationMap(choosegeos, mapras);///栅格化地图
////导出成位图
Bitmap bmp = new Bitmap(mapras.Cols + 1, mapras.Rows+1);
foreach(PixelPosition_T pp in mappixel)
{
bmp.SetPixel(pp.Col, pp.Row, Color.Red);
}
string bmppath = "c:" + "\\" + "mybmp" + ".bmp";
bmp.Save(bmppath);
////导出位图
}
功能实现流程如下:
1、在菜单上的(图形编辑)菜单项下添加子菜单项(栅格化);并为(栅格化)菜单项添加单击事件。

当我们选中线段要素时,我们单击(栅格化)菜单后,将执行栅格化算法并输出结果。

2、设计栅格数据结构:一个栅格数据结构应该包含有原点,行、列数以及栅格像素大小;以及行列号。

以下为个人设计
public class PixelPosition_T
{
private int row;
public int Row
{
get { return row; }
set { row = value; }
}
private int col;
public int Col
{
get { return col; }
set { col = value; }
}
public PixelPosition_T()
{
}
public PixelPosition_T(int r, int c)
{
row = r;
col = c;
}
}
public class Raster_T
{
private int rows;
public int Rows
{
get { return rows; }
set { rows = value; }
}
private int cols;
public int Cols
{
get { return cols; }
set { cols = value; }
}
private double pixelsize;
public double Pixelsize
{
get { return pixelsize; }
set { pixelsize = value; }
}
private Point_T originpt;
public Point_T Originpt
{
get { return originpt; }
set { originpt = value; }
}
public Raster_T()
{ }
public Raster_T(int rs, int cs, double ps, Point_T opt) {
rows = rs;
cols = cs;
pixelsize = ps;
originpt = opt;
}
}
3、矢量线的八方向栅格化算法。

其原理就是先端点栅格化,之后对所经过的每列或每行求其中心线,之后对中心线与该线求交点,对交点再次进行栅格化。

并将结果以PixelPosition_T的数组保存。

public List<PixelPosition_T> RasterationMap(Map_T map, Raster_T ras)//栅格化整个选中的地图数据
{
List<PixelPosition_T> mappixel = new List<PixelPosition_T>();
foreach (Geometry_T geo in map.Geofeatures)
{
if (geo.GetType() == typeof(Path_T))
{
Path_T pa = (Path_T)geo;
foreach (Line_T line in pa.Path)
{
List<PixelPosition_T> linepixel = RasterationLine(line, ras); mappixel.AddRange(linepixel);
}
}
}
return mappixel;
}
public List<PixelPosition_T> RasterationLine(Line_T line, Raster_T ras)//八方向栅格化
{
List<PixelPosition_T> linepixel = new List<PixelPosition_T>();
PixelPosition_T fpp = RasterationPoint(line.Frompt, ras);
linepixel.Add(fpp);
PixelPosition_T tpp = RasterationPoint(line.Topt, ras);
int
count=Math.Max(Math.Abs(fpp.Row-tpp.Row),Math.Abs(fpp.Col-tpp.Col));
for (int i = 1; i <= count; i++)
{
////求出当前线
Point_T fp,tp;
if (Math.Abs(fpp.Row - tpp.Row) <= Math.Abs(fpp.Col - tpp.Col))
{
double x;
if(tpp.Col-fpp.Col>=0)
{
x= (fpp.Col + i - 0.5) * ras.Pixelsize + ras.Originpt.X; }
else
{
x=(fpp.Col - i - 0.5) * ras.Pixelsize + ras.Originpt.X;
}
fp = new Point_T(x, ras.Originpt.Y);
tp = new Point_T(x, ras.Originpt.Y + ras.Pixelsize * ras.Rows);
}
else
{
double y;
if (tpp.Row - fpp.Row >= 0)
{
y = (fpp.Row + i - 0.5) * ras.Pixelsize + ras.Originpt.Y; }
else
{
y = (fpp.Row - i - 0.5) * ras.Pixelsize + ras.Originpt.Y; }
fp = new Point_T(ras.Originpt.X, y);
tp = new Point_T(ras.Originpt.X+ ras.Pixelsize * ras.Cols, y); }
Line_T cline = new Line_T(fp,tp);
Point_T pt = IntersectPoint(cline, line);
PixelPosition_T cpp=RasterationPoint(pt,ras);
linepixel.Add(cpp);
}
linepixel.Add(tpp);
return linepixel;
}
public PixelPosition_T RasterationPoint(Point_T pt, Raster_T ras)//栅格化点 {
int row=(int)((pt.Y-ras.Originpt.Y)/ras.Pixelsize);
int col = (int)((pt.X - ras.Originpt.X) / ras.Pixelsize);
PixelPosition_T pp = new PixelPosition_T(row,col);
return pp;
}
public Point_T IntersectPoint(Line_T cline, Line_T line)//求交点
{
Point_T pt;
if (cline.Frompt.X == cline.Topt.X)
{
double y = (-line.ParaC - line.ParaA * cline.Frompt.X) / line.ParaB; pt = new Point_T(cline.Frompt.X, y);
}
else
{
double x = (-line.ParaC - line.ParaB * cline.Frompt.Y) / line.ParaA; pt = new Point_T(x, cline.Frompt.Y);
}
return pt;
}
4、将栅格数据以位图输出
////导出成位图
Bitmap bmp = new Bitmap(mapras.Cols + 1, mapras.Rows+1);
foreach(PixelPosition_T pp in mappixel)
{
bmp.SetPixel(pp.Col, pp.Row, Color.Red);
}
string bmppath = "c:" + "\\" + "mybmp" + ".bmp";
bmp.Save(bmppath);
////导出成位图。

相关文档
最新文档