我需要在内存中绘制一个实心多边形(进入二维数组)并用数值“填充”多边形(比如“3”)。
我希望在 C# 中做到这一点。
我正在使用 Catfood 的 Shapefile 阅读器从 Shapefile 中获取实心多边形(非常好)。
有任何想法吗?
在我已经“映射”了代表圣地亚哥周围道路网络的 16,000 条折线(它们显示为数字“9”)之后,我将附加这个 2D 数组的一小部分。我希望通过上传实心多边形的 shapefile 和数字“3”的“绘图”来做同样的事情。
去获取WriteableBitmapEx扩展。这将允许您在图像内存中绘制几乎任何您想要的东西。
或者,您可以制作一个 DrawingVisual,用它绘制任何您想要的东西,然后渲染到图像目标;请参阅:此示例
如果你想通过 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)在不使用 Windows 窗体的情况下绘制 C# 图形
但是我怀疑(根据措辞)这是家庭作业,并且您被告知要手动完成;
所以; 对于你想要 Bresenham's Line Algorithm 的线条,然后用填充算法填充它们;看到这个
在 C# 中,您可以使用 Bitmap 类进行任何您想要的屏幕外绘图。
创建一个Bitmap
,从中获取一个,Graphics
调用FillPolygon
.Graphics
由于您正在绘制二维整数数组(据我在编辑问题后所见),您似乎应该实现自己的多边形填充,将数字存储在二维数组中。为此,您可以使用这篇文章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();
现在您应该遍历位图,在像素为黑色的那些地方,将数字 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;
}
我想你明白了这个问题和一个可能的解决方案。