Поточная программа Мандельброта C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Поточная программа Мандельброта C++

Сообщение Anonymous »

В предисловии: в настоящее время я учусь на первом курсе, и мне разрешили записаться на некоторые курсы второго курса. Из-за этого в настоящее время я разбираюсь с языком (C++), на изучение которого у меня нет времени (первокурсники в основном изучают C#), поэтому этот код может быть некрасивым.

Наша задача двоякая. Во-первых, нам нужно написать программу, которая выводит изображение Мандельброта в формате PPM. Чтобы добиться этого, я воспользовался туториалом на YouTube.

Вторая часть задания — сделать программу многопоточной. По сути, программа должна использовать 4 потока, каждый из которых рисует четверть изображения.

С этой целью я изменил код из видеоурока и преобразовал main в метод. Сейчас я пытаюсь правильно сделать первую четверть изображения. Я решил, что это можно сделать с помощью корректировки

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)
{


Однако вместо того, чтобы рисовать верхнюю левую четверть, как я подозревал, программа рисовала по всей ширине, повторяя себя после достижения половины ширины изображения, и нарисовал только четверть высоты
(см. изображение)

Поскольку мне нравится учиться на своих ошибках, мне бы хотелось знать, что именно происходит здесь ошибка.

Спасибо, что помогли новичку в программировании :)

Полный код программы ниже.

#include "stdafx.h"
#include
#include

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

Подробнее здесь: https://stackoverflow.com/questions/352 ... -program-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»