我在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);
}
}
}
cloudPoints
是List<Point>
,其中包含pictureBox1
图片中存在的所有像素。
可能是14000或20。
例如,在索引0中,我看到x = 122 y = 34
现在rect是一个使用鼠标移动绘制的矩形。
然后我发送到CloudEnteringAlert
Paint方法的像素坐标以黄色绘制/颜色。
现在它将为cloudPoints
列表中的所有像素绘制/着色。
但我想改变它所以它只会绘制/着色我绘制的矩形内的像素坐标。
因此,例如,如果cloudPoints
中的像素存在于绘制矩形的区域客户端中,则仅发送此坐标。并非cloudPoints
中的所有坐标都只包含绘制矩形中的坐标。
答案 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