Плавный спектр для рендеринга Мандельброта

Хороший вопрос. У меня был тот же вопрос, и я нашел его здесь. Реальный ответ: @ Dan-Paradox, нет стандартного синтаксического способа сделать это. Итак, все эти ответы - это множество альтернатив, чтобы обойти проблему.

Я сам прочитал ответы и особо не нашел ни одного из них идеальным для моего личного соглашения. Метод, который я, вероятно, придерживаюсь, использует конструктор по умолчанию и метод set:

class MyClass
{
  int x,y,z;
public:
  MyClass(): x(0), y(0), z(0) {}
  MyClass(int _x,int _y,int _z): x(_x), y(_y), z(_z) {} // for single declarations
  void set(int _x,int _y,int _z)
  {
    x=_x;
    y=_y;
    z=_z;
  }
};

Стандартный конструктор инициализации все еще существует, поэтому я все еще могу его инициализировать, t нужно больше одного, но в противном случае у меня есть метод set, который устанавливает все переменные, которые инициализируются в конструкторе. Таким образом, я мог бы сделать что-то вроде этого:

int len=25;
MyClass list = new MyClass[len];
for(int i = 0; i < len; i++)
  list[i].set(1,2,3);

Это прекрасно работает и протекает естественным образом, не делая код запутанным.


Теперь это мой ответ для тех, кто задается вопросом, как объявите массив объектов, которые должны быть инициализированы.

В частности, вы пытаетесь дать массив идентификаторов автомобилей, которые, я полагаю, вы хотите всегда быть уникальными. Вы можете сделать это с помощью моего метода, который я объяснил выше, а затем в цикле for использовать i+1 в качестве аргумента, переданного методу set, но из того, что я прочитал в ваших комментариях, кажется, что вы хотите Иды более внутренне инициированы, так что по умолчанию у каждого автомобиля есть уникальный идентификатор, даже если кто-то использует ваш класс Car.

Если это то, что вы хотите, вы можете использовать статический член:

class Car
{
  static int current_id;
  int id;
public:
  Car(): id(current_id++) {}

  int getId() { return id; }
};
int Car::current_id = 1;

...

int cars=10;
Car* carlist = new Car[cars];

for(int i = 0; i < cars; i++)
  cout<<carlist[i].getId()<<" "; // prints "1 2 3 4 5 6 7 8 9 10"

Таким образом, вам не нужно беспокоиться об инициализации идентификаторов, поскольку они управляются внутри.

30
задан Nick Johnson 15 December 2008 в 19:26
поделиться

4 ответа

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

4
ответ дан Nick Johnson 16 December 2008 в 05:26
поделиться
  • 1
    Вы имеете в виду вручную поиск ссылки? That' s больше последнее средство, чем хорошее решение. – Šime Vidas 20 February 2013 в 03:12

Используйте гладкий алгоритм окраски для вычисления всех значений в области просмотра, затем отобразите палитру от самого низкого до самого высокого значения. Таким образом, как Вы увеличиваете масштаб, и более высокие значения больше не видимы, палитра уменьшится также. С теми же константами для n и B Вы закончите с диапазоном 0,0 к 1,0 для, полностью уменьшил набор, но при более глубоком масштабировании динамический диапазон уменьшится, для высказывания 0.0 0,1 при 200%-м масштабировании, 0.0 к 0,0001 при 20 000%-м масштабировании, и т.д.

5
ответ дан Sparr 15 December 2008 в 19:26
поделиться

Кажется простым сделать методом проб и ошибок. Предположите, что можно определить HSV1, и HSV2 (оттенок, насыщенность, значение) конечной точки окрашивает Вас, хотят использовать (черный и белый; синий и желтый; темно-красный и светло-зеленый; и т.д.), и предполагают, что у Вас есть алгоритм для присвоения значения P между 0,0 и 1.0 к каждому из пикселей. Тогда цвет того пикселя становится

(H2 - H1) * P + H1 = HP
(S2 - S1) * P + S1 = SP
(V2 - V1) * P + V1 = VP

С тем сделанным, просто наблюдайте результаты и посмотрите, как Вам нравятся они. Если алгоритм для присвоения P непрерывен, то градиент должен быть гладким также.

4
ответ дан Paul Brinkley 15 December 2008 в 19:26
поделиться
  • 1
    " можно отладить строку JavaScript line" - bulit-в JSON.stringify() не реализован в JavaScript, но собственном коде. Вы can' t отлаживают его с Firebug. – Šime Vidas 19 February 2013 в 16:15

Это алгоритм сглаживания цвета:

Допустим, вы начинаете с комплексного числа z0 и повторяете n раз, пока оно не исчезнет. Пусть конечной точкой будет zn .

Сглаженное значение будет

nsmooth := n + 1 - Math.log(Math.log(zn.abs()))/Math.log(2)

Это работает только для Мандельброта, если вы хотите вычислить сглаженную функцию для множеств Джулии, используйте

Complex z = new Complex(x,y);
double smoothcolor = Math.exp(-z.abs());

for(i=0;i<max_iter && z.abs() < 30;i++) {
    z = f(z);
    smoothcolor += Math.exp(-z.abs());
}

Затем smoothcolor находится в интервале (0, max_iter) .

Разделите smoothcolor на max_iter , чтобы получить значение от 0 до 1.

Чтобы получить плавный цвет из значения:

Это может быть вызвано, например (в Java):

Color.HSBtoRGB(0.95f + 10 * smoothcolor ,0.6f,1.0f);

, поскольку первое значение в параметрах цвета HSB используется для определения цвета из цветового круга.

32
ответ дан 27 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: