Чтобы предисловие к этому вопросу: я в настоящее время студент первого курса, которому было разрешено записаться на курсы второго курса. Из-за этого я в настоящее время перепутаю язык (C++), который у меня на самом деле не было времени, чтобы учиться (первые годы в основном изучают C#), поэтому этот код может быть не очень красивым.Резьбовая программа Мандельброта C++
Наше задание двоякое. Во-первых, нам нужно написать программу, которая выводит изображение Мандельброта в PPM. Чтобы достичь этого, я следил за учебником Youtube here.
Вторая часть задания - сделать программу многопоточной. По сути, программа должна использовать 4 потока, каждый из которых рисует четверть изображения.
С этой целью я изменил код из видеоурока и преобразовал основной метод в метод. Теперь я пытаюсь правильно сделать первую четверть изображения. Я полагал, что способ сделать это, чтобы настроить
for (int y = 0; y < imageHeight; y++) //Rows!
{
for (int x = 0; x < imageWidth; x++) //Columns! (pixels in every row)
{
в
for (int y = 0; y < halfHeight; y++) //Rows!
{
for (int x = 0; x < halfWidth; x++) //Columns! (pixels in every row)
{
Однако, вместо того, чтобы рисовать верхнюю левую четверть, как я подозревал, программа привлекла по всей ширине, повторяется после полумесячная отметка ширины изображения была достигнута и только тянулась вдоль четверти высоты (see image)
Как мне нравится учиться на своих ошибках, я хотел бы знать, что именно здесь происходит.
Благодарим Вас за помощь в программировании салага из :)
Полный программный код ниже.
#include "stdafx.h"
#include <fstream>
#include <iostream>
int imageWidth = 512, imageHeight = 512, maxN = 255, halfWidth = 256, halfHeight = 256;
double minR = -1.5, maxR = 0.7, minI = -1.0, maxI = 1.0;
std::ofstream f_out("output_image.ppm");
int findMandelbrot(double cr, double ci, int max_iterations)
{
int i = 0;
double zr = 0.0, zi = 0.0;
while (i < max_iterations && zr * zr + zi * zi < 4.0)
{
double temp = zr * zr - zi * zi + cr;
zi = 2.0 * zr * zi + ci;
zr = temp;
i++;
}
return i;
}
double mapToReal(int x, int imageWidth, double minR, double maxR)
{
double range = maxR - minR;
return x * (range/imageWidth) + minR;
}
double mapToImaginary(int y, int imageHeight, double minI, double maxI)
{
double range = maxI - minI;
return y * (range/imageHeight) + minI;
}
void threadedMandelbrot()
{
for (int y = 0; y < halfHeight; y++) //Rows!
{
for (int x = 0; x < halfWidth; x++) //Columns! (pixels in every row)
{
//... Find the real and imaginary values of c, corresponding
// to that x,y pixel in the image
double cr = mapToReal(x, imageWidth, minR, maxR);
double ci = mapToImaginary(y, imageHeight, minI, maxI);
//... Find the number of iterations in the Mandelbrot formula
// using said c.
int n = findMandelbrot(cr, ci, maxN);
//... Map the resulting number to an RGB value.
int r = (n % 256);
int g = (n % 256);
int b = (n % 256);
//... Output it to the image
f_out << r << " " << g << " " << b << " ";
}
f_out << std::endl;
}
}
int main()
{
//Initializes file
f_out << "P3" << std::endl;
f_out << imageWidth << " " << imageHeight << std::endl;
f_out << "256" << std::endl;
//For every pixel...
threadedMandelbrot();
f_out.close();
std::cout << "Helemaal klaar!" << std::endl;
return 0;
}
Выведите координаты каждой подсчитанной точки, она станет очевидной, где ваша ошибка. –