Статических массивов в нём нет, просто много классов, экземпляры которых создаются на стеке. Перевод их в кучу ничего не изменил в работе программы, однако потребовалось некоторое время для замены '.' на '->'. За это я и недолюбливаю С++, что если изменить способ создания объекта, придётся переделывать уйму кода, в Delphi, например, всегда '.'. 😉
Создавать на стеке имеет смысл, когда объектов относительно мало. Сталкивался с таким что Visual Studio выдаёт предупреждение о превышении размера стека, вариант с заданием размера стека типа #pragma comment(linker, "/STACK:размер_стека") не есть хорошо, по сему если много объектов то нужно их создавать в куче.
std::vector это само собой, но это по сути динамический массив. А когда нужен указатель, например, на единственный объект класса? Использовать std::vector для него одного как то коряво получается. а std::unique_ptr<T> или std::shared_ptr<T> - как раз для такого случая.
procedure Fresnel; const window_size = 10.0; var x, y: integer; dx, hw, hh, m, n, f: double; lens: array of array of double; begin hw := Width * 0.5; hh := Height * 0.5; dx := window_size / Width; SetLength(lens, Width, Height); for x := 0 to Width - 1 do for y := 0 to Height - 1 do lens[x, y] := cos(Density * (sqr(dx * (x - hw)) + sqr(dx * (y - hh))));
m := -MaxInt; n := MaxInt; for x := 0 to Width - 1 do for y := 0 to Height - 1 do begin m := Max(m, lens[x, y]); n := Min(n, lens[x, y]); end;
m := (m - n + 1e-10); for x := 0 to Width - 1 do for y := 0 to Height - 1 do begin f := (lens[x, y] - n) / m * 100; Bmp.Pixel[x, y] := ColorMap.IterToColor(f); end; end;
Вообще тема с рендерингом фракталов в видео формате очень актуальна. На том же ютуб уйма подобных фрактальных трипов, причём все используют не только разные координаты конечных минибротов, но и различные цветовые карты для раскрашивания фракталов.
Посмотрите видео, как изменяется фрактал Мандельброта с увеличением зума до 3.9e¹⁴²⁹. И в итоге (конец видео) Вы увидите изначальный фрактал, вот Вам и самоподобие ) https://www.youtube.com/watch?v=thlvdXfl0KA
А какая собственно разница каким оператором можно получить доступ к полям указателя класса
'.'
или'->'
?Можно например предварительно разименовать указатель, и получить доступ через
'.'
, что то вроде:*(a).b == a->b
В том то и дело, программа на первый взгляд работает нормально, однако некоторые её функции начинают вести себя странно.
Совершенно верно. Пример тому - фракталы Ляпунова, которые могут изображать интересные сюрреалистические картины 😉
Статических массивов в нём нет, просто много классов, экземпляры которых создаются на стеке. Перевод их в кучу ничего не изменил в работе программы, однако потребовалось некоторое время для замены
'.'
на'->'
. За это я и недолюбливаю С++, что если изменить способ создания объекта, придётся переделывать уйму кода, в Delphi, например, всегда'.'
. 😉Создавать на стеке имеет смысл, когда объектов относительно мало. Сталкивался с таким что Visual Studio выдаёт предупреждение о превышении размера стека, вариант с заданием размера стека типа
#pragma comment(linker, "/STACK:размер_стека")
не есть хорошо, по сему если много объектов то нужно их создавать в куче.std::vector это само собой, но это по сути динамический массив. А когда нужен указатель, например, на единственный объект класса? Использовать std::vector для него одного как то коряво получается. а std::unique_ptr<T> или std::shared_ptr<T> - как раз для такого случая.
Помню в let был ещё в Basic на ZX Spectrum )
Посмотрел и понял - Rust это сборная солянка из разных языков )
рэнжи, оператор as, синтаксис передачи параметров в функции явно из Паскаля.
let из Javasript, остальное из С/С++
Как то привычка сложилась: выделил память - освободи. Хотя умные указатели скорее всего и ввели чтобы забыть об освобождении )
Нет там не используется случайность, цвет зависит от некоторого параметра алгоритма.
procedure Fresnel;
const
window_size = 10.0;
var
x, y: integer;
dx, hw, hh, m, n, f: double;
lens: array of array of double;
begin
hw := Width * 0.5;
hh := Height * 0.5;
dx := window_size / Width;
SetLength(lens, Width, Height);
for x := 0 to Width - 1 do
for y := 0 to Height - 1 do
lens[x, y] := cos(Density * (sqr(dx * (x - hw)) + sqr(dx * (y - hh))));
m := -MaxInt;
n := MaxInt;
for x := 0 to Width - 1 do
for y := 0 to Height - 1 do
begin
m := Max(m, lens[x, y]);
n := Min(n, lens[x, y]);
end;
m := (m - n + 1e-10);
for x := 0 to Width - 1 do
for y := 0 to Height - 1 do
begin
f := (lens[x, y] - n) / m * 100;
Bmp.Pixel[x, y] := ColorMap.IterToColor(f);
end;
end;
Также интересны и другие аттракторы-карты:
У меня такие круги получились как то, типа дифракционных колец Френеля )
У меня такой вот коврик получился )
Подобные фигуры также создают некоторые аттракторы, например "Фазовая карта Чирикова"
А можно поинтересоваться, что такого имеется в Rust, чего нет в С++?
P.S. C Rust вообще не знаком.
Такой ещё вопрос к автору: по какой причине Вы использовали именно Rust в смеси с С++, когда можно было данный проект сделать полностью на С++?
Вообще тема с рендерингом фракталов в видео формате очень актуальна. На том же ютуб уйма подобных фрактальных трипов, причём все используют не только разные координаты конечных минибротов, но и различные цветовые карты для раскрашивания фракталов.
Посмотрите видео, как изменяется фрактал Мандельброта с увеличением зума до 3.9e¹⁴²⁹. И в итоге (конец видео) Вы увидите изначальный фрактал, вот Вам и самоподобие ) https://www.youtube.com/watch?v=thlvdXfl0KA
X=0.27533764774673799358866712482462788156671406989542628591627436306743751013023030130967197535665363986058288420463735384997362663584446169657773339617717365950286959762265485804783047336923365261060963100721927003791989610861331863571141065592841226995797739723012374298589823921181693139824190379745910243872940870200527114596661654505 Y=0.006759649405327850670181700456194929502189750234614304846357269137106731032582471677573582008294494705826194131450773107049670717146785957633119244225710271178867840504202402362491296317894835321064971518673775630252745135294700216673815790733343134984120108524001799351076577642283751627469315124883962453013093853471898311683555782404
Zoom=9e300