2010-11-02 3 views
1

Вот моя проблема:Фрактально сгенерированные линии с заданными конечными точками

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

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

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

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

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

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

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

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

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

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

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

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

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

+0

Я внесла свой ответ, чтобы ответить на ваш ответ на ответ @ McWafflestix. –

ответ

1

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

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

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

+0

Ударьте меня на 20 секунд! :-) –

1

Есть более простой способ. МНОГО более простой путь.

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

+0

Это выглядит намного проще! Однако я сталкиваюсь с подобной проблемой. Как вы определяете результирующую координату? Очевидно, что y-значение будет ((1/2) длина строки/j * mod), где j - степень рандомизации (в этом случае 8), а мода находится между j и -j. Но как вы определяете значение x? – Jay

+0

@Jay: ты все еще слишком задумываешься об этом. Ваша средняя точка (x3, y3) начинается между двумя конечными точками (x1, y1) и (x2, y2); x3 = (x1 + x2/2); y3 = (x1 + x2/2). Теперь, когда у вас есть ваша средняя точка, просто деформируйте ее, купите случайное количество (используя какой-либо метод, выберите случайную величину деформации (x4, y4) и добавьте ее в координаты средней точки (x3, y3), которые вы только что определили. «форма» вашего фрактала - это то, как вы определяете свою величину деформации (x4, y4). –

1

Google 'space fill curve', и вы получите снежинки Koch и фрактальные размеры между одним и двумя и всевозможные другие лакомства.

Смежные вопросы