嘿。我的数学不是很好,所以我希望有人可以帮助我。我有一维像素数组(代表一个二维图像)。为了访问特定的像素,我使用这个公式:
image.Pixels[row * imageWidth + col] = pixelColor;
这是有效的,但我还想在所选像素周围包含像素。在没有直接使用指针的情况下,最快的方法是在半径为r的所选像素周围获得一组像素并将其值设置为pixelColor?我正在尝试创建一个绘画类型的应用程序,并希望改变画笔大小,这将由半径大小决定。 谢谢你的帮助。
答案 0 :(得分:6)
我不知道具体的C#,但是你应该知道这件事
for (i=-r ; i< r ; i++) {
for (j=-(r - i); j<(r - i); j++) {
image.Pixels[(row+i)*imageWidth + (col+j)]=pixelColour;
}
}
编辑以上实际上是一个钻石,我已经给出了我的第一个黑客想法,在下面做了一个合适的圈子
for (i=-r ; i<r ; i++) {
for (j=-r; j<r; j++) {
if((i*i + j*j)<(r*r)){
image.Pixels[(row+i)*imageWidth + (col+j)]=pixelColour;
}
}
}
答案 1 :(得分:3)
简单的慢速方法是逐步调整行+ - r和col + - r中的像素范围,并计算距行和col的距离不大于r。与col的距离,行是平方根(x平方的差异+ y平方的差异)。
稍微快一点的方法是将半径的平方与x平方的差值+ y平方的差值进行比较,因为它们具有可比性。
更快的是Bresenham's circle algorithm,
另一篇文章: Bresenham's Line and Circle Algorithms
一旦你从col到任何一行的距离,就可以从col - distance到col + distance填充像素,不需要计算两者。所以你只能计算一半圆圈就可以了。