如何根据List <point>?</point>的坐标获取绘制的矩形客户区中的所有像素

时间:2015-01-27 12:11:23

标签: c# .net winforms

我在pictureBox1绘画事件中有这段代码:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (cloudPoints != null)
    {
        if (DrawIt)
        {
            e.Graphics.DrawRectangle(pen, rect);
            int w = rect.Width;
            int h = rect.Height;
            int area = h * w;

            CloudEnteringAlert.pointtocolorinrectangle = cloudPoints;
            Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height, PixelFormat.Format32bppArgb);
            CloudEnteringAlert.Paint(e.Graphics, 1, 200, bmp);
        }
    }   
}

cloudPointsList<Point>,其中包含pictureBox1图片中存在的所有像素。 可能是14000或20。 例如,在索引0中,我看到x = 122 y = 34

现在rect是一个使用鼠标移动绘制的矩形。

然后我发送到CloudEnteringAlert Paint方法的像素坐标以黄色绘制/颜色。 现在它将为cloudPoints列表中的所有像素绘制/着色。

但我想改变它所以它只会绘制/着色我绘制的矩形内的像素坐标。

因此,例如,如果cloudPoints中的像素存在于绘制矩形的区域客户端中,则仅发送此坐标。并非cloudPoints中的所有坐标都只包含绘制矩形中的坐标。

2 个答案:

答案 0 :(得分:1)

使用Rectangle.Contains(Point)方法。因此,如果您想获取矩形内的点,只需过滤列表

var pointsAffected = cloudPoints.Where(pt => rect.Contains(pt))

答案 1 :(得分:0)

如果您有矩形的宽度和高度,并且说左上角坐标为x0,y0,那么要过滤坐标列表,您可以认为所需的区域内的所有坐标x,y都是在以下等式中:

(x0 < x < (x0+width)) and (y0 < y < (y0+width)). 

根据这个你可以用这个限制过滤你的像素:类似于答案形式@hometoast

cloudPoints.Where(pt => pt.x < (x0+width) && pt.x>x0 &&pt.y>y0 && pt.y< (y0+width)))

对于圆形和其他数字,您可以使用类似的公式来过滤像素。圆的示例是:(x-x0)^2 + (y-y0)^2 <= r^2