Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 100

Mandelbrot set

20.05.2020, 14:18. Показов 1357. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Недавно я сделал Mandelbrot set. С большой вероятностью он работает корректно

Мне необходимо сделать его с OpenMP

1) код работает в параллели с OpenMP

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

Есть какие идеи как можно сделать OpenMP? буду очень признателен!!!!





C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <fstream>
#include <vector>
#include <complex>
#include <chrono>
#include <omp.h> 
 
using namespace std;
 
typedef vector<int> Array1D;
typedef vector<Array1D> Array2D;
typedef vector<Array2D> Image;
 
// точка c пренадлежит Mandelbrot Set?
bool mandelbrot(complex<double> c, vector<int>& pixel) {
    int max_iteration = 500, iteration = 0;
    complex<double> z(0, 0);
 
    while ( abs(z) <= 4 && (iteration < max_iteration) ) {
        z = z * z + c;
        iteration++;
    }
 
    if (iteration != max_iteration) {
        // как вычислить эти значения, чтобы раскрасить выходные данные?
        
        //       (thread-id возможно?
        pixel = {255, 255, 255}; // ouside -> white 255,255,255
        return false;
    }
    
    pixel = {0, 0, 0}; // ouside -> white 255,255,255
    return true;
}
 
int main(int argc, char **argv)
{
    int width = 1200, height = 1200; 
 
    int i, j, pixels_inside=0;
 
    // Image data structure: 
    // - for each pixel we need red, green, and blue values (0-255)
    // -  используются 3 различных матрицы для соответствующих каналов
    int channels = 3; // red, green, blue
    Image image(channels, Array2D(height, Array1D(width)));
 
    vector<int> pixel = {0,0,0}; // red,green,blue (each range 0-255)
    complex<double> c; 
 
    
     auto t1 = omp_get_wtime(); //  time  OpenMP
 
    for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
            c = complex<double>( 2.0*((double)j/width-0.75), ((double)i/height-0.5)*2.0);
            
            if ( mandelbrot(c, pixel) ) pixels_inside++;
            
            // применить к изображению
            for (int ch = 0; ch < channels; ch++) 
                image[ch][i][j] = pixel[ch];
        }
    }
    
 
     auto t2 = omp_get_wtime(); //  time OpenMP
    
    // save image
    std::ofstream ofs("mandelbrot.ppm", std::ofstream::out);
    ofs << "P3" << std::endl;
    ofs << width << " " << height << std::endl;
    ofs << 255 << std::endl;
 
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            ofs << " " << image[0][i][j] << " " << image[1][i][j] << " " << image[2][i][j] << std::endl;
        }
    }
    ofs.close();
 
    cout << "Total pixels inside: " << pixels_inside << endl;
    cout << "Execution time (without disk I/O)): " << chrono::duration<double>(t2 - t1).count() << endl;
 
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.05.2020, 14:18
Ответы с готовыми решениями:

Позиция элемента в контейнере STL кон. SET, поиск контейнер set словарь позиция
Есть код №1. Он выводить на экран позицию нужного мне слова (только если в середине 1 слово а не 2 и больше например только...

Поменять в настройке Character Set на Use Multy-Byte Character Set
При компиляции не видет файла .exe на форуме прочитал , что нужно поменять в настройке Character Set на Use Multy-Byte Character Set ...

Use Multi-Byte Character Set , Use Unicode Character Set
TCHAR*buf = new TCHAR; GetWindowText(hwnd__etit_box, buf, GetWindowTextLength(hwnd_etit_box) + 1); WriteFile(hFile,buf,...

8
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2020, 14:46
Цитата Сообщение от Wannani Посмотреть сообщение
Есть какие идеи как можно сделать OpenMP? буду очень признателен!!!!
Что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#pragma omp parallel
{
    vector<int> pixel = {0,0,0}; // red,green,blue (each range 0-255)
    complex<double> c; 
 
#pragma omp for collapse(2)
    for (int i = 0; i < height; i++) 
    {
        for (int j = 0; j < width; j++) 
        {
            c = complex<double>(2.0 * ((double)j / width - 0.75), ((double)i / height - 0.5) * 2.0);
 
            if (mandelbrot(c, pixel))
            {
#pragma omp atomic
                pixels_inside++;
            }
 
            // применить к изображению
            for (int ch = 0; ch < channels; ch++)
                image[ch][i][j] = pixel[ch];
        }
    }
}
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 100
20.05.2020, 14:54  [ТС]
Спасибо! А "Код цветокодирует выходное изображение так, чтобы работа, выполняемая оприделенным потоком становится видимым (можно использовать любой цвет)"

Это какой параметр изменить?

vector<int> pixel = {0,0,0}; // red,green,blue (each range 0-255

Этот? строка 48 в моем коде
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2020, 14:57
Цитата Сообщение от Wannani Посмотреть сообщение
Этот? строка 48 в моем коде
Наверное. Сделай его в зависимости от omp_get_thread_num()
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 100
20.05.2020, 15:06  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Сделай
как это сделать?

Добавлено через 5 минут
Возможно в этой части?

C++
1
2
3
4
5
6
7
 if (iteration != max_iteration) {
        // как вычислить эти значения, чтобы раскрасить выходные данные?
        
        //       (thread-id возможно?
        pixel = {255, 255, 255}; // ouside -> white 255,255,255
        return false;
    }
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2020, 15:07
Цитата Сообщение от Wannani Посмотреть сообщение
как это сделать?
omp_get_thread_num() это просто число, от 0 до 8, например (по количеству процессоров). Ты не знаешь как поставить цвет в соответствие числу? Воспользуйся, например switch-case
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 100
20.05.2020, 15:17  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
switch-case
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma omp parallel
{
   int pixel = omp_get_thread_num();
switch (pixel) {
  case 1:
   vector<int> pixel = {255,0,0};
    break;
  case 2:
     vector<int> pixel = {0,0,255};
    break;
  case 3:
     vector<int> pixel = {0,255,0};
    break;
}
    complex<double> c; 
 
#pragma omp for collapse(2)
    for (int i = 0; i < height; i++) 
    {
        for (int j = 0; j < width; j++) 
        {
Так или что то упустил?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.05.2020, 15:32
Цитата Сообщение от Wannani Посмотреть сообщение
Так или что то упустил?
Не знаю, проверь. У тебя pixel вроде присваивается в функции mandelbrot
0
0 / 0 / 0
Регистрация: 20.04.2020
Сообщений: 100
20.05.2020, 15:37  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
проверь
Скорее всего не так, запускается консоль и ничего не происходит, буду копать дальше
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.05.2020, 15:37
Помогаю со студенческими работами здесь

Union(Set set1, Set set2) и intersect(Set set1, Set set2)
Напишите методы union(Set set1, Set set2) и intersect(Set set1, Set set2), реализующих операции объединения и пересечения двух множеств....

Ошибка SQL запрос: SET CHARACTER SET 'utf8';
Два года назад на одном из форумов некто задал вопрос (см. ниже), на который так никто и не ответил. У меня сейчас точная копия проблемы....

Чем отличается guid id {get; set;} от int id {get; set;}
Подскажите пожалуйста чем отличается guid id {get; set;} от int id {get; set;}?

Чем отличается private set от set?
Чем отличается private set от set? Зачем это вообще используется?

Аналог в VB: Set myfileobject = server.CreateObject('scripting.filesystemobject') Set mytextfile = myfileobject.CreateTextFile('C:1.txt') ?
Mojno li ispol'zovat' v VB shto to identichnoe etim strochkam : Set myfileobject = server.CreateObject('scripting.filesystemobject') ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru