问题描述
有点长,可以只看算法部分。功能,实现将xyz导出csv文件,并生成灰度图。缺点,灰度图效果不好,在三维地形中不圆滑,所以在灰度生成中我用了笨的方法让x坐标,y坐标扩展了下。可效果仍然不行。下面是代码usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Drawing;namespaceWindowsFormsApplication1{publicpartialclassForm1:Form{DataTableData_table;intBmp_width=256;intBmp_height=256;floatminx=0,maxx=0,miny=0,maxy=0;floatx_len=0,y_len=0;floatgray_len=0;intmax_gray=255;publicForm1(){InitializeComponent();Data_table=newDataTable();Data_table.Columns.Add("x");Data_table.Columns.Add("y");Data_table.Columns.Add("z");}privatevoidGenerateBMP(){Bitmapbm=newBitmap(Bmp_width,Bmp_height);for(intinitx=0;initx<Bmp_width;initx++){for(intinity=0;inity<Bmp_height;inity++){bm.SetPixel(initx,inity,Color.FromArgb(255,0,0,0));}}foreach(DataRowdrinData_table.Rows){intgrayvalue=(int)(float.Parse(dr[2].ToString())*(max_gray/gray_len));try{//bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx)),(int)((float.Parse(dr[1].ToString())-miny)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx+(float)0.2)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny+(float)0.2)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx+(float)0.4)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny+(float)0.4)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx+(float)0.6)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny+(float)0.6)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx+(float)0.8)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny+(float)0.8)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx+(float)1)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny+(float)1)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx+(float)1.2)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny+(float)1.2)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx+(float)1.4)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny+(float)1.4)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx+(float)1.6)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny+(float)1.6)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx+(float)1.8)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny+(float)1.8)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx+(float)2)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny+(float)2)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));}catch(Exceptionex){}}bm.Save("E:\test\test1_2.bmp");}privatevoidbutton1_Click(objectsender,EventArgse){max_gray=Int32.Parse(this.textBox_gray.Text);Bmp_width=Int32.Parse(this.Textbox_picwidth.Text);stringpath=@"E:test2013-12-16-11-17-30.xyz";stringpath2=@"E:testpoints.csv";FileStreamfs=newFileStream(path,FileMode.Open,FileAccess.Read);BinaryReaderbr=newBinaryReader(fs);FileStreamfs2=newFileStream(path2,FileMode.Create,FileAccess.Write);StreamWritersw=newStreamWriter(fs2);Data_table.Rows.Clear();try{floatx;floaty;floatz;stringstr;while(true){x=br.ReadSingle();y=br.ReadSingle();z=br.ReadSingle();if(x>maxx){maxx=x;}if(x<minx){minx=x;}if(y>maxy){maxy=y;}if(y<miny){miny=y;}if(z>gray_len){gray_len=z;}str=x.ToString()+","+y.ToString()+","+z.ToString();sw.WriteLine(str);this.Data_table.Rows.Add(x,y,z);}}catch(IOExceptionex){sw.Close();fs2.Close();MessageBox.Show("Readfilefinished");}x_len=maxx-minx;y_len=maxy-miny;Bmp_height=(int)(Bmp_width*(y_len/x_len)+1);GenerateBMP();}}}
解决方案
解决方案二:
靠,文件和bmp文件还不能传。
解决方案三:
这个是我未进行处理前的图片效果(也就是xyz没有扩展前的)这个是扩展后的。在三维场景中生成后是这样的锯齿太多了
解决方案四:
这种问题,你直接说你的算法都干了些什么就好了,不要让大家帮你分析代码了...导入三维地形,灰度图的灰度值表示的是高度所谓不圆滑,是怎么个效果?
解决方案五:
三维引擎里应该有抗锯齿的设置吧否则你导出的文件分辨率再高,也还是免不了都是离散的点,而不是一个平滑的面.这个跟你如何导出灰度图应该没有关系
解决方案六:
不发不行啊,因为我C#不会,代码是别人写的,我简单的加工了些。主要就是把X,Y,Z坐标导入到数组,因为x的值大约-60到60之间,所以处理了下让当前值减去最小值为基点。有个专门设置Z轴长度的max_gray=Int32.Parse(this.textBox_gray.Text)。目前显示出的这些点太离散了,所以要处理下,我做的就是简单的多画了几条线而已。所以效果也不好。
解决方案七:
上面太啰嗦了可以看这个usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Drawing;namespaceWindowsFormsApplication1{publicpartialclassForm1:Form{DataTableData_table;intBmp_width=256;intBmp_height=256;floatminx=0,maxx=0,miny=0,maxy=0;floatx_len=0,y_len=0;floatgray_len=0;intmax_gray=255;publicForm1(){InitializeComponent();Data_table=newDataTable();Data_table.Columns.Add("x");Data_table.Columns.Add("y");Data_table.Columns.Add("z");}privatevoidGenerateBMP(){Bitmapbm=newBitmap(Bmp_width,Bmp_height);for(intinitx=0;initx<Bmp_width;initx++){for(intinity=0;inity<Bmp_height;inity++){bm.SetPixel(initx,inity,Color.FromArgb(255,0,0,0));}}foreach(DataRowdrinData_table.Rows){intgrayvalue=(int)(float.Parse(dr[2].ToString())*(max_gray/gray_len));try{bm.SetPixel((int)((float.Parse(dr[0].ToString())-minx)*(Bmp_width/x_len)),(int)((float.Parse(dr[1].ToString())-miny)*(Bmp_height/y_len)),Color.FromArgb(255,grayvalue,grayvalue,grayvalue));}catch(Exceptionex){}}bm.Save("E:\test\test1_2.bmp");}privatevoidbutton1_Click(objectsender,EventArgse){max_gray=Int32.Parse(this.textBox_gray.Text);Bmp_width=Int32.Parse(this.Textbox_picwidth.Text);stringpath=@"E:test2013-12-16-11-17-30.xyz";stringpath2=@"E:testpoints.csv";FileStreamfs=newFileStream(path,FileMode.Open,FileAccess.Read);BinaryReaderbr=newBinaryReader(fs);FileStreamfs2=newFileStream(path2,FileMode.Create,FileAccess.Write);StreamWritersw=newStreamWriter(fs2);Data_table.Rows.Clear();try{floatx;floaty;floatz;stringstr;while(true){x=br.ReadSingle();y=br.ReadSingle();z=br.ReadSingle();if(x>maxx){maxx=x;}if(x<minx){minx=x;}if(y>maxy){maxy=y;}if(y<miny){miny=y;}if(z>gray_len){gray_len=z;}str=x.ToString()+","+y.ToString()+","+z.ToString();sw.WriteLine(str);this.Data_table.Rows.Add(x,y,z);}}catch(IOExceptionex){sw.Close();fs2.Close();MessageBox.Show("Readfilefinished");}x_len=maxx-minx;y_len=maxy-miny;Bmp_height=(int)(Bmp_width*(y_len/x_len)+1);GenerateBMP();}}}
解决方案八:
你想,灰度图能显示的高度范围就是0-255的整数无可避免的会离散要想平滑,不是在导出的数据上做文章,而是要在3d引擎里做平滑处理
解决方案九:
灰度图是整数,而3d里的高度是浮点数灰度图是会损失精度的,这个平滑要在导入3d后,在平滑效果上找回来
解决方案十:
可以用插值算法增加一些采样点。
解决方案十一:
如何采用插值算法增加采样点?我在this.Data_table.Rows.Add(x,y,z);之前做过this.Data_table.Rows.Add(x+1,y+1,z+1);之类的,也是效果不行的