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

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

08.01.2025, 12:45. Показов 48148. Ответов 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
4220 / 2683 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
27.02.2025, 02:26  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
я тебя понимаю, но картинка будет перевернутой.
до этого этапа, как до Магадана раком)

я тут составил, ментальным образом, список задач на эту тему, его мя на весь энтот код хватит,
задачи энти не обязательно жестко связанны с энтим пазлом,
а имеют унифицированные цели...
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
27.02.2025, 02:36
XLAT, а мне нужно
- добавить кнопку для сохранения результата в виде изображения (реализуется за 5 мин)
- улучшить временную сложность алгоритма (самая главная задача, пока размышляю и нет решения)
- вычисления перевести на отдельный поток (реализуется быстро)
- сделать прогресс бар (это тоже реализуется быстро, но для этого нужно реализовать многопоточность, чтобы гуй не замораживался при вычислении)
- заняться самыми мелкими оптимизациями и чисткой кода (последний этап)
***
Моя самая главная проблема: я работаю над проектом где-то по 10 мин в день (а иногда 0 минут), поскольку в реальной жизни много проблем и дел...
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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,028
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
27.02.2025, 20:42
gunslinger, алгоритм раскраски реально хорош, это ты писал или взял? Я в теме Кто-нибудь знает, как рендерят такие красивые фракталы? (множество Мандельброта) обсуждал с Mysterious Light, мы, короче, пришли к выводу, что большая часть красоты полученного фрактала зависит от правильного выбора палитры. Вот, посмотри, что я получил в Mathematica на дефолтной палитре, и посмотри, что получил Mysterious Light в Кто-нибудь знает, как рендерят такие красивые фракталы? (множество Мандельброта).
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
27.02.2025, 21:15
Royal_X, указанную тобой тему я видел.

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

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

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

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

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

Добавлено через 4 минуты
gunslinger, я не знаю, как у тебя на VCL, но вот в Qt всякие обновления сцен, прогресс бара и прочие вещи, можно осуществлять только с главного потока. Например, обновить значение прогресс бара напрямую из второстепенного потока нельзя. Как же я сделал? Все просто: передаю по сигналу новое значение прогресс бара, а сам он обновляется в главном потоке. В итоге, пользовательский интерфейс работает без зависаний, независимо от потока, в котором выполняются вычисления.
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
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
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
28.02.2025, 00:24
gunslinger, сейчас норм, не зависает
Теперь осталось реализовать ввод координат, чтобы пользователь мог исследовать в любой части фрактала
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,028
28.02.2025, 00:43
Цитата Сообщение от Royal_X Посмотреть сообщение
сейчас норм, не зависает
Конечно, я же проверял.

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

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

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



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

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

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

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

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

0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
28.02.2025, 14:00
gunslinger, мое мнение в этом вопросе такое, что виновник медленной генерации это не само вычисление, а механизм прорисовки. Постепенная прорисовка непосредственно на окне это очень медленно. К тому же, попробуй, например, изменить размеры окна или перетащи окно за пределы экрана и верни его обратно, ты увидишь, что картинка исчезнет, поскольку окно не обновляется.
Т.е. ты не там ищешь решение. На языке С++ совсем не проблема создать изображение из такого количества точек. Даже питон бы справился. Ты же вычисляешь цвет пикселей, которых на окне width * height штук, не так ли? Даже для самых больших окон это не так уж много пикселей.
Но вот постепенное добавление этих точек на окно и обновление окна, это уже проблема.
Конечно, есть версия, что ты вычисляешь больше точек, чем нужно для окна. Тогда да, нужно исправить это.
Но сперва, я бы попробовал вывести изображение целиком и посмотреть, исчезла ли проблема. По идее, фрактал должен генерироваться мгновенно. Т.е. нажал на кнопку, получил картинку.
Цитата Сообщение от gunslinger Посмотреть сообщение
постепенный вывод как-то смотрится что ли лучше
и чем лучше, когда вместо мгновенного вывода, ты мучаешь проц.
Цитата Сообщение от gunslinger Посмотреть сообщение
Дело в алгоритме - он попиксельный. Нужно его как-то менять (хз как)
не ну разумеется, что алгоритм рисует попиксельно, ведь он там циклы крутит. Это трогать не нужно, алгоритм он и должен рисовать попиксельно. Я имею в виду, что просто эти пиксели нужно рисовать не непосредственно на окне, а в памяти. Т.е. создать битмап как буфер и рисовать в памяти, а потом сразу вывести готовое изображение на окно.
Фрактал должен выводиться моментально.
1
Just Do It!
 Аватар для XLAT
4220 / 2683 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 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,028
28.02.2025, 18:43
Royal_X, да пробовал я через битмап, не помогает (про это уже говорил).
Суть алгоритма еще в том, что может быть несколько итераций на каждую точку (такой принцип "фрактальной рекурсии").
Я выше ссылку на другую подобную программу кидал, там выводится картинка целиком, окно небольшое, но все равно далеко не мгновенно вывод происходит.
Так что дело ясное, что дело темное.
Тут, видимо, нужно делать с нуля и вникая во все детали. И не факт, что это поможет.
Пока так. Будет если желание - займусь (может быть).

P.S.: либо попробуй сам сделать (если интересно).
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,601
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
Закрытая тема Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru