2016-02-06 7 views
0

Чтобы предисловие к этому вопросу: я в настоящее время студент первого курса, которому было разрешено записаться на курсы второго курса. Из-за этого я в настоящее время перепутаю язык (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; 
} 
+0

Выведите координаты каждой подсчитанной точки, она станет очевидной, где ваша ошибка. –

ответ

1

Ваш подсчитывают только четверть изображения, так что вы должны установить размер, что halfHeight, halfWidth или заполните файл нулями. Когда средство просмотра изображений считывает файл, он показывает две строки в одной строке пикселей до тех пор, пока он не достигнет конца файла, на четверть высоты изображения.

Чтобы устранить эту проблему, нужно просто вычислить остальные три четверти изображения, но я предлагаю вам отделить функцию известково из функции записи файла: делать резьбовыми Calcs положить результат в массиве (std::array или std::vector), найдите нужный цвет, а затем напишите в файл.

+0

Благодарим за помощь! Это был именно тот ответ, который мне нужен. :) – HBraaksma