0

ポイントのコレクションを描画する組み込みの方法はありますか? 現在、私は次のようにしています:

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;
}

これは大変な作業のようです。左端と右端のポイントを見つけ、幅などを計算する必要があります。パフォーマンスなどについて話しているのではありません。フレームワークにこれを達成する方法があるかどうかを知るだけです。

4

2 に答える 2

0

簡単な方法はありません。私は同じことをしました(いくつかの修正を加えて):

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;
}

Drawメソッドは、入力で指定された正確な座標に沿って描画しpointsます。DrawRelativeX 軸と Y 軸に沿って最初の非白点から開始して描画します。つまり、すべての点が相対的にシフトされ、左/上端からの空白がなくなります。

于 2013-09-13T05:51:13.227 に答える
0

はい、これを行う簡単な方法があります。トリックは、Graphics点を描画するためのクラスにはメソッドがありませんが、長方形を描画するためのメソッドがあるということです。したがって、ポイントごとに多くの長方形を定義し、FillRectangles(Brush, Rectangle[])メソッドを使用してポイントを描画するだけです。このコード スニペットを見てください。

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);
}

FillRectanglesではなく、メソッドを使用する必要があることに注意してくださいDrawRectangles。後者は、通常の で使用すると、幅 2px の長方形を描画しPens.Redます。

于 2013-08-06T01:46:13.257 に答える