我需要在内存中绘制一个实心多边形(到二维数组中)并用数值'填充'多边形(比如'3')。
我希望在C#中做到这一点。
我使用Catfood的Shapefile阅读器(非常好)从Shapefiles获得实心多边形。
有什么想法吗?
在我已经“映射”代表圣地亚哥周围道路网络的16,000条折线后,我附加了这个2D阵列的一小部分(它们显示为数字'9')。我希望通过上传实心多边形的shapefile和数字为'3'的'drawing'来做同样的事情。
答案 0 :(得分:1)
在C#中,您可以使用Bitmap类对您想要的任何内容进行屏幕外绘制。
答案 1 :(得分:1)
创建Bitmap
,从中获取Graphics
,在FillPolygon
上致电Graphics
。
答案 2 :(得分:1)
抓住WriteableBitmapEx扩展程序。这样您就可以将任何想要的内容绘制到图像内存中。
或者,你可以制作一个DrawingVisual,用它绘制你想要的任何东西,然后渲染到一个图像目标;请参阅:This example
如果你想通过System.Drawing路线;
using System.Drawing;
Bitmap bmp = new Bitmap(200, 100);
Graphics g = Graphics.FromImage(bmp);
g.DrawLine(Pens.Black, 10, 10, 180, 80);
REF :( Henk Holterman)Drawing C# graphics without using Windows Forms
但我怀疑(根据措辞)这是家庭作业,你被告知要手动完成;
因此;对于你想要Bresenham的Line算法的行,然后用填充算法填充它们; See This
答案 3 :(得分:0)
由于您正在绘制整数的二维数组(在您编辑问题之后我可以看到),您似乎应该实现自己的多边形填充,将数字存储在二维数组中。为此,您可以使用此帖子Good algorithm for drawing solid 2-dimensional polygons?
另一个解决方案是一个小解决方法。您可以使用已经实现的PolygonFill
填充位图中的多边形。看一下这个。我必须警告你,获取位图像素非常慢,为此你可以使用一些FastBitmap实现。在这里,我将使用常规位图。
Bitmap bmp = new Bitmap(0,0,mostRightPoint.X - mostLeftPoint.X, mostUpperPoint.Y - mostLowerPoint.Y);
//this implies that you are on the northern hemisphere
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.White); //clear the whole bitmap into white color
int [] points = new points[nmbOfPoints];
for(int i = 0;i<nmbOfPoints;i++)
{
//put the points in the points array
}
g.FillPolygon(Brushes.Black, points);
g.Dispose();
现在你应该迭代Bitmap,在那些像素是黑色的地方,把数字3放在你的2D数组中,有人想这样。
for(int i = 0;i<bmp.Width;i++)
for(int j = 0;j<bmp.Height;j++)
if(Bitmap.GetPixel(i,j) == Color.Black)
{
2DArray[mostLeftPoint.X + i, mostLowerPoint.Y + j] = 3;
}
我认为您已经了解了问题和可能的解决方案。