Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3

Совместное создание игры

08.01.2025, 12:45. Показов 45124. Ответов 942
Метки нет (Все метки)

 Комментарий администратора 
Обсуждение вынесено из темы Ищу человека для совместного изучения программирования


Цитата Сообщение от Royal_X Посмотреть сообщение
Вот на моем неигровом ноуте последний UE без проблем запускается и не тормозит даже.
ок.
если ТС готов варганить со мной сапера, то я сделаю ещё одну попытку его(пожалуй 4 версию) установить и испытать.

собсно что нужно: формально отображать некие графические модели на экране в нужном его месте нужного масштаба,
для теста сойдут спрайты - а потом можно и анимированные модели голых девочек,
на усмотрение геймдиза))

и больше ничаво.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2025, 12:45
Ответы с готовыми решениями:

Для чего создан язык С++?
Для чего создан язык С++????

создан массив
создан массив автовладельцев, для каждого известны Ф.И.О., номер, адрес...,Выяснить есть ли автовладельцы у которых имеются больше 1-ой...

Теория игр, массивы
Есть задание (прикрепил его в виде файла к сообщению). Есть решение для 12-ого варианта на BORLANDC, у меня 2-ой. Я изменил в начале...

942
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
27.02.2025, 02:26  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
я тебя понимаю, но картинка будет перевернутой.
до этого этапа, как до Магадана раком)

я тут составил, ментальным образом, список задач на эту тему, его мя на весь энтот код хватит,
задачи энти не обязательно жестко связанны с энтим пазлом,
а имеют унифицированные цели...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,252
27.02.2025, 02:36
XLAT, а мне нужно
- добавить кнопку для сохранения результата в виде изображения (реализуется за 5 мин)
- улучшить временную сложность алгоритма (самая главная задача, пока размышляю и нет решения)
- вычисления перевести на отдельный поток (реализуется быстро)
- сделать прогресс бар (это тоже реализуется быстро, но для этого нужно реализовать многопоточность, чтобы гуй не замораживался при вычислении)
- заняться самыми мелкими оптимизациями и чисткой кода (последний этап)
***
Моя самая главная проблема: я работаю над проектом где-то по 10 мин в день (а иногда 0 минут), поскольку в реальной жизни много проблем и дел...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,252
27.02.2025, 16:16
Image Assemble Tool (находится во вложении в архиве)

Представляю мою программу



Что умеет программа:
- удобный выбор папки с кусками
- удобный выбор пропорций изображения из списка, причем, дефолтно выбрано среднее значение
- отображение полезной информации в окне лога (название выбранной папки, количество загруженных кусков, разрешение куска, время старта сборки, время окончания сборки, потраченное время, разрешение полученного изображения)
- отображения понятным языком всех ошибок
- защита от дурака: кнопки выбора папки и старта неактивны во время процесса сборки
- показ прогресса сборки в процентах
- сохранение полученного изображения в PNG, JPG, BMP
- реализована многопоточность, а это означает, что пользовательский интерфейс полностью активен и не фризится во время процесса сборки

***
Прога без проблем собирает куски из Совместное создание игры

Она также собирает 384 куска из поста Совместное создание игры, но с незначительными артефактами, учитывая, что разрешение куска 32 х 32 небольшое, что не позволяет алгоритму принимать однозначные решение.

Будет время и желание, можно улучшить алгоритм сборки.

Найдете баги - пишите)

Для создания кусков в целях тестирования моей проги, можете использовать бесплатные сервисы в инете, например, https://imagy.app/split-image/
Вложения
Тип файла: 7z ImageAssembleTool.7z (7.28 Мб, 11 просмотров)
3
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
27.02.2025, 17:47
А я немного доработал рисование фрактала Жулиа ("случайно" задаются шаг и цвет, можно менять размеры окна и сохранять картинку в bmp с помощью ПКМ):



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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonClick(TObject *Sender)
{
//  PaintBox->Canvas->FillRect(PaintBox->Canvas->ClipRect);
  Refresh();
 
  struct Complex // Обьявляем структрура для хранения комплексных чисел
  {
    long double real; // Действительная часть
    long double image; // Мнимая часть
  };
 
  const int iteration = 500; // Обьявляем и инициализируем константу, которая хранит количество итераций
  const int max = 32; // Обьявляем и инициализируем константу, которая хранит максимальное значение,
  // Которое не должно превосходить сумма квадратов действительной и мнимой части комплексного числа
 
  Complex zComplex; // Обьявляем обьекты структуры Complex
  Complex tempComplex; // Которые будут хранить
  Complex cComplex; // Комплексные числа
 
  int valueX; // Координаты по Ох
  int valueY; // Координаты по Оу
  int counter; // Счетчик
 
  int lengthX; // Длина поля по Ох
  int lengthY; // Длина поля по Оу
 
  TColor color; // Цвета для закрашивания пикселей
  TColor secondColor; // Для RGB формата
  TColor thirdColor;
 
  lengthX = PaintBox->Width / 2; // Считываем половину длины поля по Ох
  lengthY = PaintBox->Height / 2; // Считываем половину длины поля по Оу
 
  srand(time(0));
  int i = 6, j = 9, k = 11;
  i = rand() % (i + 1), j = rand() % (j + 1), k = rand() % (k + 1);
  double step = 1. / pow(10, random(4) + 3) * (random(9) + 1);
  Caption = "Фрактал: шаг = " + String(step) + "; ширина = " + String(PaintBox->Width) + ", высота = " + String(PaintBox->Height);
  Caption = Caption + "; цвет (на основе RGB) = " + String(i) + ", " + String(j) + ", " + String(k);
 
  for (valueY = -lengthY; valueY < lengthY; valueY++)
    for (valueX = -lengthX; valueX < lengthX; valueX++)
    {
      counter = 0; // Обнуляем счетчик
      zComplex.real = valueX * step; // Инициализируем действительную
      zComplex.image = valueY * step; // И мнимую часть комплексного числа
      cComplex.real = -0.56267837374; // Инициализируем действительную и
      cComplex.image = 0.65679461735; // Мнимую часть комплексного числа
 
//    cComplex.real = -0.743643900055;
//    cComplex.image = 0.131825890901;
//    cComplex.real = -0.70176;
//    cComplex.image = -0.3842;
 
      // Считаем фрактал Жулиа пока сумма квадратов действительной и мнимой части
      // Комплексного числа меньше констанкты max и пока значение счетчика
      // counter меньше чем число итераций
      while (std::pow(zComplex.real, 2) + std::pow(zComplex.image, 2) < max && counter < iteration)
      {
        tempComplex = zComplex; // Копируем комплексное число во временную структуру
        // Считаем новые значения действительной части комплексного числа
        zComplex.real = std::pow(tempComplex.real, 2) - std::pow(tempComplex.image, 2) + cComplex.real;
        // Считаем новые значения мнимой части комплексного числа
        zComplex.image = 2 * tempComplex.real * tempComplex.image + cComplex.image;
        counter++; // Инкрементируем значение счетчика
      }
 
      // Если значение счетчика меньше, чем число итераций
      if (counter < iteration)
      {
        color = TColor(counter * i % 255); // Определяем первый цвет
        secondColor = TColor(counter * j % 255); // Определяем второй цвет
        thirdColor = TColor(counter * k % 255); // Определяем третий цвет
        // Заполняем пиксель сформируемым цветом
        PaintBox->Canvas->Pixels[lengthX + valueX * (1 + 0 * cos(M_PI/2))]
                                [lengthY + valueY * (1 + 0 * sin(M_PI/2))] =
                                TColor(RGB(color, secondColor, thirdColor));
      }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
  String dir = ExtractFilePath(ParamStr(0));
  SetCurrentDir(dir);
  SavePictureDialog->InitialDir = dir;
  SavePictureDialog->FileName = SecondsBetween(Now(), 0);
  if (SavePictureDialog->Execute())
  {
    Graphics::TBitmap *bitmap = new Graphics::TBitmap;
    int w = PaintBox->Width, h = PaintBox->Height;
    bitmap->Width = w;
    bitmap->Height = h;
    bitmap->Canvas->CopyRect(Rect(0, 0, w, h), PaintBox->Canvas, Rect(0, 0, w, h));
    String filename = SavePictureDialog->FileName, ext = ExtractFileExt(filename);
    bitmap->SaveToFile(filename + (ext == "" ? ".bmp" : ""));
    delete bitmap;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBoxMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
  N1->Enabled = (PaintBox->Canvas->Pixels[X][Y] != 15790320);  // clBtnFace
}

Некоторые картинки:
Вложения
Тип файла: zip fractal_julia.zip (1.40 Мб, 2 просмотров)
2
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,252
27.02.2025, 20:42
gunslinger, алгоритм раскраски реально хорош, это ты писал или взял? Я в теме Кто-нибудь знает, как рендерят такие красивые фракталы? (множество Мандельброта) обсуждал с Mysterious Light, мы, короче, пришли к выводу, что большая часть красоты полученного фрактала зависит от правильного выбора палитры. Вот, посмотри, что я получил в Mathematica на дефолтной палитре, и посмотри, что получил Mysterious Light в Кто-нибудь знает, как рендерят такие красивые фракталы? (множество Мандельброта).
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
27.02.2025, 21:15
Royal_X, указанную тобой тему я видел.

Код для фрактала изначально взял чужой (как-то говорил об этом) Совместное создание игры (он у меня давно на компе был) и немного подправил (выбор исходных цветов в интервале через рандом).
Возможно, вот оригинал (точно уже не помню, но скорей всего он): Вращение фрактала Жюлиа.

Кстати, программа не подвисает и не глючит? У меня иногда да, если вне среды запустить.
Хочу еще в поток отрисовку поместить (если нормально получится сделать, в чем не уверен - формошлепство реально сушит [оставшиеся] мозги).
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,252
27.02.2025, 21:21
Цитата Сообщение от gunslinger Посмотреть сообщение
Кстати, программа не подвисает и не глючит?
ну если во время отрисовки кликать, то подвисает. Но ты кинь в отдельный поток, и все будет норм.
Только, тебе нужно будет расчет делать в отдельном потоке, а отрисовку в главном, потому что, полагаю, что нельзя менять форму с другого потока.

Еще, не нужно выводить на окно постепенно, это неэффективно. Рисуй весь фрактал в буфере в памяти, а потом выводи на окно готовое изображение.
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
27.02.2025, 22:27
Royal_X, я раньше в потоке только расчеты делал, но не рисование. AntiFreeze (компонент) не в счет, там "автоматика". Включил - и либо работает, либо нет.
Причем нужно тогда еще запретить изменение размеров формы, на которых много чего завязано.
Насчет вывода картинки сразу, а не постепенно - нужно тогда прогрессбар прикрутить или наподобие.
Мне кажется, что постепенный вывод как-то смотрится что ли лучше, но хз.

Короче, надо посмотреть, что получится, а что нет. И нужно ли это.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,252
27.02.2025, 22:47
Цитата Сообщение от gunslinger Посмотреть сообщение
И нужно ли это.
не ну ненормально, что если во время вывода кликать по любой области программы, то она зависает.
я же тоже ради этого в своей программе Совместное создание игры реализовал многопоточность. Юзеры очень часто кликают по интерфейсу во время ожидания и эти зависания могут их разочаровывать.

Добавлено через 2 минуты
Цитата Сообщение от gunslinger Посмотреть сообщение
постепенный вывод как-то смотрится что ли лучше
постепенный вывод можешь оставить, ну и черт с ней с этой производительностью, только реализуй многопоточность

Добавлено через 4 минуты
gunslinger, я не знаю, как у тебя на VCL, но вот в Qt всякие обновления сцен, прогресс бара и прочие вещи, можно осуществлять только с главного потока. Например, обновить значение прогресс бара напрямую из второстепенного потока нельзя. Как же я сделал? Все просто: передаю по сигналу новое значение прогресс бара, а сам он обновляется в главном потоке. В итоге, пользовательский интерфейс работает без зависаний, независимо от потока, в котором выполняются вычисления.
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
28.02.2025, 00:16
Цитата Сообщение от Royal_X Посмотреть сообщение
Юзеры очень часто кликают по интерфейсу во время ожидания и эти зависания могут их разочаровывать.
У меня подвисало не из-за кликов, а хз по какой причине (я так и не понял). При запуске через среду проблемы не возникало.

Цитата Сообщение от Royal_X Посмотреть сообщение
постепенный вывод можешь оставить, ну и черт с ней с этой производительностью, только реализуй многопоточность
Вывод сразу, а не постепенно, происходит примерно с такой же скоростью. Дело в алгоритме - он попиксельный.
Нужно его как-то менять (хз как), или выигрыша в скорости не будет особо.
Поэтому оставил постепенный вывод.

Добавил один поток. Нужно было просто попиксельную отрисовку "синхронизировать". Вроде работает.

Unit1.cpp:
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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  Thread(0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N1Click(TObject *Sender)
{
  String dir = ExtractFilePath(ParamStr(0));
  SetCurrentDir(dir);
  SavePictureDialog->InitialDir = dir;
  SavePictureDialog->FileName = SecondsBetween(Now(), 0);
  if (SavePictureDialog->Execute())
  {
    Graphics::TBitmap *bitmap = new Graphics::TBitmap;
    int w = PaintBox->Width, h = PaintBox->Height;
    bitmap->Width = w;
    bitmap->Height = h;
    bitmap->Canvas->CopyRect(Rect(0, 0, w, h), PaintBox->Canvas, Rect(0, 0, w, h));
    String filename = SavePictureDialog->FileName, ext = ExtractFileExt(filename);
    bitmap->SaveToFile(filename + (ext == "" ? ".bmp" : ""));
    delete bitmap;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBoxMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
  N1->Enabled = (PaintBox->Canvas->Pixels[X][Y] != 15790320);  // clBtnFace
}

Unit2.cpp:
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <vcl.h>
#pragma hdrstop
 
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
 
//---------------------------------------------------------------------------
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(&UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall Thread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall Thread::Thread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
  int valueX; // Координаты по Ох
  int valueY; // Координаты по Оу
  int counter; // Счетчик
 
  int lengthX; // Длина поля по Ох
  int lengthY; // Длина поля по Оу
 
  TColor color; // Цвета для закрашивания пикселей
  TColor secondColor; // Для RGB формата
  TColor thirdColor;
//---------------------------------------------------------------------------
void __fastcall Thread::Execute()
{
  //---- Place thread code here ----
 
  //Form1->PaintBox->Canvas->FillRect(Form1->PaintBox->Canvas->ClipRect);
  Form1->Refresh();
 
  Form1->Button->Enabled = 0;
  Form1->N1->Visible = 0;
 
  struct Complex // Обьявляем структрура для хранения комплексных чисел
  {
    long double real; // Действительная часть
    long double image; // Мнимая часть
  };
 
  const int iteration = 500; // Обьявляем и инициализируем константу, которая хранит количество итераций
  const int max = 32; // Обьявляем и инициализируем константу, которая хранит максимальное значение,
  // Которое не должно превосходить сумма квадратов действительной и мнимой части комплексного числа
 
  Complex zComplex; // Обьявляем обьекты структуры Complex
  Complex tempComplex; // Которые будут хранить
  Complex cComplex; // Комплексные числа
 
 
  lengthX = Form1->PaintBox->Width / 2; // Считываем половину длины поля по Ох
  lengthY = Form1->PaintBox->Height / 2; // Считываем половину длины поля по Оу
 
  srand(time(0));
  int i = 6, j = 9, k = 11;
  i = rand() % (i + 1), j = rand() % (j + 1), k = rand() % (k + 1);
  double step = 1. / pow(10, random(4) + 3) * (random(9) + 1);
  Form1->Caption = "Фрактал: шаг = " + String(step) + "; ширина = " + String(Form1->PaintBox->Width) +
                   ", высота = " + String(Form1->PaintBox->Height);
  Form1->Caption = Form1->Caption + "; цвет (на основе RGB) = " + String(i) + ", " + String(j) + ", " + String(k);
 
  Form1->BorderIcons = TBorderIcons(1);  // biSystemMenu
 
  //Form1->BorderStyle = bsSingle;
  Form1->Constraints->MaxHeight = Form1->Height;
  Form1->Constraints->MaxWidth  = Form1->Width;
  Form1->Constraints->MinHeight = Form1->Height;
  Form1->Constraints->MinWidth  = Form1->Width;
 
  for (valueY = -lengthY; valueY < lengthY; valueY++)
    for (valueX = -lengthX; valueX < lengthX; valueX++)
    {
      counter = 0; // Обнуляем счетчик
      zComplex.real = valueX * step; // Инициализируем действительную
      zComplex.image = valueY * step; // И мнимую часть комплексного числа
      cComplex.real = -0.56267837374; // Инициализируем действительную и
      cComplex.image = 0.65679461735; // Мнимую часть комплексного числа
 
//    cComplex.real = -0.743643900055;
//    cComplex.image = 0.131825890901;
//    cComplex.real = -0.70176;
//    cComplex.image = -0.3842;
 
      // Считаем фрактал Жулиа пока сумма квадратов действительной и мнимой части
      // Комплексного числа меньше констанкты max и пока значение счетчика
      // counter меньше чем число итераций
      while (std::pow(zComplex.real, 2) + std::pow(zComplex.image, 2) < max && counter < iteration)
      {
        tempComplex = zComplex; // Копируем комплексное число во временную структуру
        // Считаем новые значения действительной части комплексного числа
        zComplex.real = std::pow(tempComplex.real, 2) - std::pow(tempComplex.image, 2) + cComplex.real;
        // Считаем новые значения мнимой части комплексного числа
        zComplex.image = 2 * tempComplex.real * tempComplex.image + cComplex.image;
        counter++; // Инкрементируем значение счетчика
      }
 
      // Если значение счетчика меньше, чем число итераций
      if (counter < iteration)
      {
        color = TColor(counter * i % 255); // Определяем первый цвет
        secondColor = TColor(counter * j % 255); // Определяем второй цвет
        thirdColor = TColor(counter * k % 255); // Определяем третий цвет
 
        Synchronize(&Update);  // синхронизация
      }
    }
 
  Form1->BorderIcons = TBorderIcons(7);  // biSystemMenu (1), biMinimize (2), biMaximize (4)
 
  //Form1->BorderStyle = bsSizeable;
  Form1->Constraints->MaxHeight = 0;
  Form1->Constraints->MaxWidth  = 0;
  Form1->Constraints->MinHeight = 550;
  Form1->Constraints->MinWidth  = 650;
 
  Form1->Button->Enabled = 1;
  Form1->N1->Visible = 1;
}
//---------------------------------------------------------------------------
void __fastcall Thread::Update()
{
  // Заполняем пиксель сформируемым цветом
  Form1->PaintBox->Canvas->Pixels[lengthX + valueX][lengthY + valueY] = TColor(RGB(color, secondColor, thirdColor));
}
Вложения
Тип файла: zip fractal_julia.zip (1.40 Мб, 4 просмотров)
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,252
28.02.2025, 00:24
gunslinger, сейчас норм, не зависает
Теперь осталось реализовать ввод координат, чтобы пользователь мог исследовать в любой части фрактала
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
28.02.2025, 00:43
Цитата Сообщение от Royal_X Посмотреть сообщение
сейчас норм, не зависает
Конечно, я же проверял.

Насчет координат - это можно сделать (если нужно).
Изначально я делал "случайную" генерацию, но почти всегда происходило попадание в "пустоту".

Шаг (step) не хочу менять - пусть продолжает выпадать в некотором диапазоне, как и цвета (так "веселее").
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
28.02.2025, 02:21
Решил все-таки шаг добавить - так удобней будет область ограничивать.

Код мало поменялся, поэтому его не выкладываю (да и кому он нужен , главное - результат).



Картинки:
Вложения
Тип файла: zip fractal_julia.zip (1.41 Мб, 2 просмотров)
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
28.02.2025, 02:52
Вот еще пара картинок (большего размера):

0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
28.02.2025, 13:39
Есть совет по оптимизации построения фрактала (даже два, но второй слишком сложный для меня - я даже с первым не справился).
Но я либо не понял, как это применить, либо руки кривые. Результат пока отсутствует.

Еще хороший сайт с информацией по соответствующей тематике.
Можно самостоятельно попробовать сделать свою реализацию.

Кроме того, это всего лишь небольшая часть "айсберга": кроме "стандартных" фракталов вида z2 + c есть еще куча других (много их) формул, с которыми можно экспериментировать.

Ну и несколько картинок:

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,252
28.02.2025, 14:00
gunslinger, мое мнение в этом вопросе такое, что виновник медленной генерации это не само вычисление, а механизм прорисовки. Постепенная прорисовка непосредственно на окне это очень медленно. К тому же, попробуй, например, изменить размеры окна или перетащи окно за пределы экрана и верни его обратно, ты увидишь, что картинка исчезнет, поскольку окно не обновляется.
Т.е. ты не там ищешь решение. На языке С++ совсем не проблема создать изображение из такого количества точек. Даже питон бы справился. Ты же вычисляешь цвет пикселей, которых на окне width * height штук, не так ли? Даже для самых больших окон это не так уж много пикселей.
Но вот постепенное добавление этих точек на окно и обновление окна, это уже проблема.
Конечно, есть версия, что ты вычисляешь больше точек, чем нужно для окна. Тогда да, нужно исправить это.
Но сперва, я бы попробовал вывести изображение целиком и посмотреть, исчезла ли проблема. По идее, фрактал должен генерироваться мгновенно. Т.е. нажал на кнопку, получил картинку.
Цитата Сообщение от gunslinger Посмотреть сообщение
постепенный вывод как-то смотрится что ли лучше
и чем лучше, когда вместо мгновенного вывода, ты мучаешь проц.
Цитата Сообщение от gunslinger Посмотреть сообщение
Дело в алгоритме - он попиксельный. Нужно его как-то менять (хз как)
не ну разумеется, что алгоритм рисует попиксельно, ведь он там циклы крутит. Это трогать не нужно, алгоритм он и должен рисовать попиксельно. Я имею в виду, что просто эти пиксели нужно рисовать не непосредственно на окне, а в памяти. Т.е. создать битмап как буфер и рисовать в памяти, а потом сразу вывести готовое изображение на окно.
Фрактал должен выводиться моментально.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
28.02.2025, 18:32  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
я работаю над проектом где-то по 10 мин в день (а иногда 0 минут), поскольку в реальной жизни много проблем и дел...
я вчера посмотрел сериал Уэйн 2019 сразу все серии - ничо так - зачет.
далее пошёл на трубу смотреть подкасты.

вот один тут c кибердедом прямо в мою тему зашёл.

в чем суть:
1. я решил добавить класс с резаком картинок, чтобы иметь тестовый материал.
2. резак, как резак, но сразу возникло несколько вопросов, один из них, как его отображать на экран.
3. речь не про юзверьский дизайн - речь про кодерский.
4. у мя уже был класс для отображения загруженного таска.
5. делать же для резак отдельный отобразитель это, ясень, не кошерно.
6. поэтому опять и снова возник вопрос об универсальных интефейсах.
7. но мы же хотим быстро за 10 минут, правда?
8. так вот тут как раз рассказывал про три языка программирования, которые создавались под проект Буран.
9. и они, вот же, ёшкинкот, были не совместимы между собой просто никак.

... цифры кончились ...

короче, пришлось унифицировать уже имеющийся отобразитель

код резака

тут c тестом поигрался чуток:


теперь думаю, куда двигать дальше - а распутье большое - тасклист == 100500 тасков)
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
28.02.2025, 18:43
Royal_X, да пробовал я через битмап, не помогает (про это уже говорил).
Суть алгоритма еще в том, что может быть несколько итераций на каждую точку (такой принцип "фрактальной рекурсии").
Я выше ссылку на другую подобную программу кидал, там выводится картинка целиком, окно небольшое, но все равно далеко не мгновенно вывод происходит.
Так что дело ясное, что дело темное.
Тут, видимо, нужно делать с нуля и вникая во все детали. И не факт, что это поможет.
Пока так. Будет если желание - займусь (может быть).

P.S.: либо попробуй сам сделать (если интересно).
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,252
28.02.2025, 19:07
Цитата Сообщение от XLAT Посмотреть сообщение
я решил добавить класс с резаком картинок, чтобы иметь тестовый материал.
а я поленился написать код на С++, резал сперва на сайте, ссылка которого в посте с моей готовой прогой Совместное создание игры Кстати, не знаю, ты видел, что я закончил прогу?

А потом переименовывал куски рандомно в Total Commander.

Потом вообще, начал резать в Wolfram Mathematica))) которая уже давно не система компьютерной алгебры общего назначения, а научный универсальный инструмент, который умеет делать всё что угодно.

Смешно, что ни Photoshop, ни Gimp не располагают быстрым методом для обрезки, только с танцами с бубном.

А вот Wolfram Mathematica вычисляет, как правильно резать, режет одной командой, а потом достаточно просто экспортирует изображения под рандомными именами.
0
28.02.2025, 19:24

Не по теме:

Royal_X, у меня те твои программы, что "заточены" под Win 10+, не работают на 7-ке. Так что "хнык-хнык" (смайлик).

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.02.2025, 19:24

Решение матричных игр. Есть у кого такая программа написанная уже...
Требуется программа по решению матричных игр... С выбором размера матрицы и выдачей решения... Может кто смогёт такую сбатцать?

Запуск приложений(старых игр) в оконном режиме
День добрый, подскажите, хотелось бы реализовать свое желание запуска старых игр windo`вых(типа StarCraft) в оконном режиме, с чего начать,...

Алгоритм календаря игр (например в футболе)
необходимо составить календарь футбольных матчей, допустим есть 6 команд char *teams = {&quot;TEAM A&quot;,&quot;TEAM B&quot;,&quot;TEAM...

Движок для игр
Всем привет!!!, хотел узнать возможно ли создать движок на C++ чтобы экспортировать модели из 3ds max а после в самом движке можно было...

Выбор IDE для создания 2D игр
Здравствуйте. Задача сделать пака 2ух – мерные драчки загружая в проект анимацию-как удар(ы) и реакция на удар...(лучше всего секвенцию...


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

Или воспользуйтесь поиском по форуму:
900
Закрытая тема Создать тему
Новые блоги и статьи
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru