C# 绘制点集合的简单方法

C# 绘制点集合的简单方法,c#,.net,image,drawimage,C#,.net,Image,Drawimage,是否有任何内置方式来绘制点集合?目前我是这样做的: public static Bitmap Draw(this IEnumerable<Point> points) { var horizontallySortedPoints = points.OrderBy(p => p.X).ToArray(); var verticallySortedPoints = points.OrderBy(p => p.Y).ToArray(); var lef

是否有任何内置方式来绘制点集合?目前我是这样做的:

public static Bitmap Draw(this IEnumerable<Point> points)
{
    var horizontallySortedPoints = points.OrderBy(p => p.X).ToArray();
    var verticallySortedPoints = points.OrderBy(p => p.Y).ToArray();

    var leftmost = horizontallySortedPoints.First();
    var rightmost = horizontallySortedPoints.Last();
    var topmost = verticallySortedPoints.First();
    var bottommost = verticallySortedPoints.Last();

    var i = new Bitmap(rightmost.X - leftmost.X + 1, bottommost.Y - topmost.Y + 1);
    foreach (var item in points)
        i.SetPixel(item.X, item.Y, Color.Red);

    return i;
}
公共静态位图绘制(此IEnumerable points)
{
var horizontallySortedPoints=points.OrderBy(p=>p.X.ToArray();
var verticallySortedPoints=points.OrderBy(p=>p.Y.ToArray();
var leftmost=horizontallySortedPoints.First();
var rightmest=horizontallySortedPoints.Last();
var topmost=verticallySortedPoints.First();
var bottommost=verticallySortedPoints.Last();
var i=新位图(最右边的.X-最左边的.X+1,最下面的.Y-最上面的.Y+1);
foreach(以点为单位的var项目)
i、 设置像素(项目X、项目Y、颜色红色);
返回i;
}

这似乎需要做很多工作。我必须找到自己的最左边和最右边的点,计算宽度等。我不是在谈论性能或任何东西。只是知道框架是否有办法做到这一点。

是的,有一种更简单的方法可以做到这一点。诀窍在于,
Graphics
类中没有用于绘制点的方法,但有一个用于绘制矩形的方法。因此,您所要做的就是为每个点定义许多矩形,然后使用
FillRectanges(画笔,矩形[])
方法绘制点。请看以下代码片段:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    Random rnd = new Random();
    Rectangle[] myrects = new Rectangle[1000];
    for (int i = 0; i < 1000; i++) 
        myrects[i] = new Rectangle(rnd.Next(0, this.Width), rnd.Next(0, this.Height), 1, 1);
    g.FillRectangles(Brushes.Red, myrects);
}
private void Form1\u Paint(对象发送方,PaintEventArgs e)
{
图形g=e.图形;
随机rnd=新随机();
矩形[]myrects=新矩形[1000];
对于(int i=0;i<1000;i++)
myrects[i]=新矩形(rnd.Next(0,this.Width),rnd.Next(0,this.Height),1,1);
g、 填充矩形(画笔。红色,myrects);
}

请记住,必须使用
FillRectangles
方法,而不是
DrawRectangles
。当与普通的
笔一起使用时,后者将绘制一个2倍宽的矩形。红色的
没有简单的方法。我最后也做了同样的事情(做了一些修复):

public静态位图绘制(此IEnumerable points,
颜色paintColor=默认值(颜色))
{
返回点。绘制(油漆颜色、颜色、白色);
}
公共静态位图绘制(此IEnumerable points,Color paintColor,
颜色(背景色)
{
返回点。绘制(画色,背景色,(ps,最左边,最上面)=>ps);
}
公共静态位图DrawRelative(此IEnumerable points,
颜色paintColor=默认值(颜色))
{
返回点.DrawRelative(paintColor,Color.White);
}
公共静态位图DrawRelative(此IEnumerable points,
彩色颜料(颜色、背景色)
{
返回点。绘制(油漆颜色、背景色、,
(ps,最左边的,最上面的)=>ps.Select(p=>newpoint(p.X-leftmost.X,p.Y-topmost.Y));
}
静态位图绘制(这是一个数不清的点,
颜色颜料颜色,颜色底色,
(变压器)
{
points=points.ToArray();
Func horizontallSorter=ps=>ps.OrderBy(p=>p.X);
Func verticallSorter=ps=>ps.OrderBy(p=>p.Y);
var leftmost=horizontallSorter(points.First();
var topmost=垂直分拣机(点).First();
var relativePoints=变压器(点、最左侧、最顶部).ToArray();
var rightmost=horizontallSorter(relativePoints).Last();
var bottommost=verticallSorter(relativePoints).Last();
var img=新位图(最右边的.X+1,最下面的.Y+1);
使用(var g=Graphics.FromImage(img))
{
g、 清晰(背景色);
}
foreach(相对点中的var项)
img.SetPixel(项目X、项目Y、油漆颜色);
返回img;
}

绘制
方法沿
输入中指定的精确坐标绘制
DrawRelative
从X轴和Y轴上的第一个非白色点开始绘制,即所有点都相对移动,以便左/上边缘没有空白。

使用Graphics.FromImage+Graphics。DrawLines@HansPassant但是从哪个图像呢?我需要将
Image
参数传递给
Graphics.FromImage
,但如何获取该图像?如果我没有宽度和高度参数,如何创建该图像)。当然是你的位图。位图源于图像。@HansPassant是的,我明白了。我试图避免这么多的编码。如果我已经有了位图,那么它只需要更改两行。与我现在使用的
SetPixel
相比,
Graphics.DrawLines
是否有优势?@HansPassant Graphics.DrawLines没有预期的效果,它连接了阵列中的所有点。我将继续使用
SetPixel
。嘿,埃桑,这不起作用。我不记得出了什么问题,抱歉迟到了。
public static Bitmap Draw(this IEnumerable<Point> points, 
                          Color paintColor = default(Color))
{
    return points.Draw(paintColor, Color.White);
}

public static Bitmap Draw(this IEnumerable<Point> points, Color paintColor, 
                          Color backColor)
{
    return points.Draw(paintColor, backColor, (ps, leftmost, topmost) => ps);
}

public static Bitmap DrawRelative(this IEnumerable<Point> points,
                                  Color paintColor = default(Color))
{
    return points.DrawRelative(paintColor, Color.White);
}

public static Bitmap DrawRelative(this IEnumerable<Point> points,
                                  Color paintColor, Color backColor)
{
    return points.Draw(paintColor, backColor, 
                       (ps, leftmost, topmost) => ps.Select(p => new Point(p.X - leftmost.X, p.Y - topmost.Y)));
}

static Bitmap Draw(this IEnumerable<Point> points, 
                   Color paintColor, Color backColor, 
                   Func<IEnumerable<Point>, Point, Point, IEnumerable<Point>> transformer)
{
    points = points.ToArray();

    Func<IEnumerable<Point>, IEnumerable<Point>> horizontallSorter = ps => ps.OrderBy(p => p.X);
    Func<IEnumerable<Point>, IEnumerable<Point>> verticallSorter = ps => ps.OrderBy(p => p.Y);

    var leftmost = horizontallSorter(points).First();
    var topmost = verticallSorter(points).First();

    var relativePoints = transformer(points, leftmost, topmost).ToArray();

    var rightmost = horizontallSorter(relativePoints).Last();
    var bottommost = verticallSorter(relativePoints).Last();

    var img = new Bitmap(rightmost.X + 1, bottommost.Y + 1);

    using (var g = Graphics.FromImage(img))
    {
        g.Clear(backColor);
    }

    foreach (var item in relativePoints)
        img.SetPixel(item.X, item.Y, paintColor);

    return img;
}