Фрактально сгенерированные линии с заданными конечными точками - PullRequest
1 голос
/ 03 ноября 2010

Вот моя проблема:

У меня есть две случайные точки (x, y) и (x2, y2). Я хотел бы провести «случайный шаг» или фрактальную линию между ними. Я создал ситуацию, в которой расстояние и направление шага генерируются случайным образом на основе матрицы вероятностей. Однако, оставляя это только к направлению этой матрицы, у линии будет случайная конечная точка, которую невозможно предопределить заранее. Поэтому я попытался установить границы для моей линии, где - если точка падает - местоположение корректируется соответствующим образом. Эти границы не работают.

В идеале, мои границы - это круг, созданный каждой случайной точкой на противоположных концах области. Я пробовал следующее.

  1. Я настроил цикл, который будет перебирать каждую точку x линии, используя переменную i , которая начинается с меньшего из x и x2 и движется в направлении большего.

  2. Я установил переменную j , к которой будет добавлен случайный шаг, и инициализировал ее эквивалентным значением y для меньшего значения x (если x1 больше, установлено значение y1 еще установлен на х).

  3. Я установил переменную, которая содержит наклон теоретической прямой линии между x, y и x1, y1.

  4. Я установил матрицу вероятностей, которая принимает переменную mod и устанавливает для нее значение в диапазоне от 8 до -8.

  5. Я установил проверки, чтобы запретить формирование линии за пределами данной плоскости.

  6. Я настроил проверку, чтобы определить, является ли переменная i на единицу меньше, чем большее из x и x2. Если это так, переменная j устанавливается на значение y этого значения x;

Именно в этот момент мне не удается найти подходящий алгоритм для настройки окончательной проверки. Вот что я хотел бы сделать алгоритм:

A. Я хотел бы, чтобы он мог, учитывая случайное значение x между x и x1, определить, находится ли текущая переменная j , добавленная к текущей переменной mod , вне сгенерированного круга по двум вышеупомянутым пунктам (см. второй абзац). Если это не так, добавьте мод в переменную j и увеличьте цикл.

B. Если эта точка выходит за границы, я бы хотел, чтобы направление шага было изменено на обратное (например, от -6 до 6 и от 2 до -2), и такая же проверка должна быть сделана снова.

C. Если добавление в любом направлении выведет его за границы (что, скорее всего, произойдет около дальнего конца круга, где границы сужают больше всего), я хотел бы иметь возможность проходить через цикл, который проверяет каждое значение и его обратное начиная с 0 и переходя к последовательно большим значениям, пока не будет определено работоспособное значение.

Я надеюсь, что вы, опытные математики и программисты, видите в этом непреодолимую проблему. Это поставило меня в тупик на три недели, и у меня кончились идеи.

Ответы [ 3 ]

1 голос
/ 03 ноября 2010

Есть более простой способ.Гораздо проще.

Вы уже знаете свои конечные точки.Если вы хотите сгенерировать фрактальную линию между двумя вашими конечными точками, просто возьмите отрезок, который определяется вашими двумя конечными точками, и разбейте его на две части, добавив новую промежуточную точку, которая смещена от текущей линии на случайную величинуизменение этой величины и направления, на которое вы смещаете, будет эффективно определять «форму» вашего фрактала).Теперь у вас есть два отрезка, которые соединяют ваши исходные конечные точки;для увеличения случайности повторите на каждом из двух отрезков.

1 голос
/ 03 ноября 2010

Google 'кривая заполнения пространства', и вы получите размеры снежинки и фрактала Коха между одним и двумя, и все виды других вкусностей.

1 голос
/ 03 ноября 2010

Обычный способ создания фрактальных ребер - начать с прямой линии и рекурсивно подразделить в соответствии с некоторым правилом, которое может быть детерминированным или недетерминированным (то есть допускает некоторую случайность).

В зависимости от ваших требований может потребоваться, чтобы ваше правило не допускало пересечения линий. Может оказаться достаточным наложить некоторый максимальный угол между линией и линиями, возникающими в результате ее подразделения (я думаю, <45 °). Но не цитируйте меня об этом. </p>

Простой алгоритм для этого состоит в том, чтобы сместить середину линии перпендикулярно линии на некоторое случайное расстояние пропорционально длине линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...