2013-08-05 46 views
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; 
} 

這似乎很多工作。我必須找到自己最左邊和最右邊的點,計算寬度等。我不是在談論表現或任何事情。只要知道框架是否有辦法實現這一點。

+0

使用Graphics.FromImage + Graphics.DrawLines –

+0

@HansPassant,但從哪個圖像?我需要將'Image'參數傳遞給'Graphics.FromImage',但是如何獲取該圖像?如果我沒有寬度和高度參數,如何創建該圖像)。 – nawfal

+0

當然你的位圖。位圖來自Image。 –

回答

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輸入指定的確切座標繪製。 DrawRelative從X軸和Y軸的第一個非白點開始繪製,即所有點都是相對移動,以便從左/上邊緣沒有空白。

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。當與普通Pens.Red一起使用時,後者將繪製一個2px寬的矩形。

+0

嘿Ehsan,這沒有奏效。我不記得出了什麼問題,很抱歉遲到了。 – nawfal

相關問題