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

Mandelbrot set

20.05.2020, 14:18. Показов 1390. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Вот уже год прошел, как у меня домен в reg.ru ...
Etyuhibosecyu 16.04.2026
И ничего они мне не сделали. Если отвязать карту, никакие услуги они не навяжут. Я бы с радостью продлил еще на два года, чтобы не мучиться с временным доменом и меня уже знали по red-star-soft. com,. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru