在二维矩阵的某一点周围生成圆



我正在尝试使用c++在控制台使用随机生成的值制作高度图。我有一个数组[50,50],初始化为全0。

matrix = new int[rows * columns];
for (int i = 0; i < rows; i++) {
for (int k = 0; k < columns; k++) {
matrix[i * columns + k] = 0;
}
}

我使用循环在数组中生成随机点,并将这些点的位置存储在一个向量中。

std::vector<int> sprinklePeaks(int peakDensity, int dimension) {
int count = 0;
std::vector<int> peaks;
for (int i = 0; i < peakDensity; i++) {
int peakIndex = randomize(0, dimension);
matrix[peakIndex] = randomize(69, 99);
peaks.push_back(peakIndex);
}
return peaks;
}

问题:我试图在这些点周围生成一个随机半径的圆,并用随机生成的值填充圆,随着它们接近中心而增加,我的圆生成似乎有正确的中心坐标,但距离是错误的,没有值被添加到矩阵中。

void circleGen(std::vector<int> peaks, int dimensions) {
for (int i = 0; i < peaks.size(); i++) {
int radius = randomize(5, 15);
int area = 3.14159 * radius * radius;
int index = peaks[i];
int x = index / 50;
int y = index % 50;
// std::cout << "Peak: " << peaks[i] << "n";
// std::cout << "Peak Coordinates: [" << x << ", " << y << "]n";
int peakHeight = matrix[peaks[i]];
for (int k = 0; k < radius * 2; k++) {
for (int j = 0; j < radius * 2; j++) {
int distance = sqrt((i - radius) * (i - radius) + (j - radius) * (j - radius));
matrix[x - j * columns + y - k] = randomize(10, 20);
}
}
}
}

第一个问题可能是您没有边界检查。我认为你不应该改变矩阵(更重要的是周围的内存),如果坐标超出界限。

我看到的第二个问题是你计算了distance,但是你没有使用这个值。

第三个问题可能是您想要添加替换为值。在matrix[x - j * columns + y - k] = randomize(10, 20);中,应该是+=而不是=distance应该参与右边。或者您想要替换,但仅当新值大于现有值时。

第四,正如Andrej在评论中提到的,计算矩阵中索引的数学方法是错误的。应该使用圆括号,(x - j) * columns + y - k

最新更新