Поиск:

Ответ в темуСоздание новой темы Создание опроса
> кривая линия 
:(
    Опции темы
bagos
Дата 29.3.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 17.6.2006

Репутация: нет
Всего: 1



Надеюсь в нужный раздел пишу. Задача изначально показалось мне не сложной (сказывается плохое знание математики), но в результате я даже близко не знаю в какую область мне смотреть.
Нужно сделать след.: есть точка А, с заданными координатами и точка Б, координаты которой тоже известны. Требуется такая функция, которая рисовала случайную кривую из точки А в точку Б.
Прошу помощи, любые полезные советы по теме.

PM MAIL   Вверх
mrgloom
Дата 29.3.2012, 16:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



попробуйте сплайны.

а так если любая кривая то это может быть отрезок.

PM MAIL   Вверх
_Y_
Дата 29.3.2012, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Если нужна именно функция, в смылсе математическая функция, то все очень просто.

Берем почти любую математическую функцию по вкусу (кроме Y=const и Y=a*X   smile ). Например, полином, скажем Y=a*X^3+b*X^2+c*X+d Понятное дело, раз полином третьего порядка,  то таких полиномов через две точки можно провести бесконечное множество. Но! Полином будет единственным (в смысле все его коэффициенты можно будет посчитать) если будем иметь не две точки, а четыре. Датчиком случайных чисел "придумываем" две недостающие точки, по четырем точкам находим коэффициенты полинома и, бинго, имеем случаюную кривую, проходящую через две точки.

Как вариант, можно случайным образом выбирать не две дополнительные точки, а два из четырех коэффициентов того же полинома. Тогда оставшиеся два коэффициента можно будет найти по двум точкам. В плане загрузки компа так, наверное, будет даже быстрее.

------------------------------- 

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

1. Закрашиваем изображение белым.
2. Закрашиваем черным пиксель, соответствующий первой точке.
3. Случайным образом выбираем любой белый пиксель, соседствующий с предидущей точкой. Если все окружение черное и белого пикселя выбрать нельзя "змея завела себя в тупик", начинаем опять с пункта 1.
4. Закрашиваем пиксель черным. Проверяем не является ли вновь выбранный пиксель второй точкой. Если да, дело сделано. Если нет - переходим к пункту 3.

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



--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Mirkes
Дата 29.3.2012, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



_Y_,  предложил два крайних способа. Есть и промежуточные варианты. Например.
1. ставим перо в первую точку. 
2. Определяем направление ко второй точке. Случайным образом добавляем +- один пиксел к меньшему из смещений от первой точки ко второй.
3. если не попали во вторую точку, то переходим к шагу 2.

Такая случайная кривая будет более "нацеленной" на вторую точку.


--------------------
Mirkes
PM MAIL   Вверх
nworm
Дата 29.3.2012, 17:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



bagos

Скажите кратко, зачем нужна эта кривая. Данная информация может помочь выбрать правильный способ построения кривой.
PM MAIL WWW   Вверх
baldina
Дата 29.3.2012, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



Цитата(mrgloom @  29.3.2012,  16:24 Найти цитируемый пост)
попробуйте сплайны.

я бы даже сказал - кривые безье. достаточно случайным образом выбрать третью точку.
PM MAIL   Вверх
Pavia
Дата 29.3.2012, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



bagos, 
Не тот вы форум выбрали. Вам на gamedave надо.
Ищите в интернете статьи про создание молний в играх. 
Хорошие случайные эффекты, вещь сложная тут лучше искать что-то готовая. Случайность там воспринимается несколько иначе, чем в теории вероятности. 

По памяти так. Берем прямую разбиваем на 1-5 участок произвольной длины. случайно отконяем от прямой линии на 10-20% длины.
Затем  второй проход где каждый участок ещё бъётся тоже случайно.

Если надо гладкую кривую, то тут используешь взвешенный сплайн.

Добавлено через 6 минут и 17 секунд
http://primat.org/publ/28-1-0-279
PM MAIL   Вверх
_Y_
Дата 29.3.2012, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Сплайны я проигнорировал. С одной стороны, сплайн - не одна функция, а метод соединения точек множеством функций-кусочков. С другой, как-то не очень случайная кривая сплайном получается ИМХО. Случайны только точки сплайн задающие и порядок самого сплайна.

Но всеми руками присоединяюсь к вопросу nworm-а. Зная цель задачи, можно дать более дельный совет.  


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
bagos
Дата 29.3.2012, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 17.6.2006

Репутация: нет
Всего: 1



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

nworm, вы правы мне следовало наверно сразу сказать для чего нужна эта функция, но я посчитал что задача чисто математическая...
Пишется программный комплекс, в котором предусматривается система так сказать "эмулирования присутствия человека" (своего рода защита, о которой подробней уже рассказать к сожалению не могу :( ).
Один из модулей системы задает точки на экране (позиции, в которые должен попасть курсор). Так и получается что система генерирует случайные координаты рабочей области (экрана). И уже и одной такой координаты нужно попасть в другую. Понятное дело что какую функцию траектории движения не создай, на человеческие движения курсором мышки это врятли будет похоже)))) НО
Тут по сути главное чтобы траектория движения не была прямой, ведь человек порой движет курсор мышки к нужной области потом раз десять подергает в разыне стороны или покрутит вокруг нужное ему области круговыми движениями и т.д.
Думаю для данной задачи вполне достаточно что хоть синусоида рисовалась из одной точки в другую...хотя.. smile
Еще раз спасибо за ответы, и жду ваших комментариев.
PM MAIL   Вверх
Pavia
Дата 30.3.2012, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 6.12.2008

Репутация: 11
Всего: 12



bagos, 
Попросите ваших колег поставить программку, которая записывает движения. Скажите что нужно для научных исследований. 
При моделировании будете использовать готовые записи. Для увеличения выборки комбинируете куски из нескольких записей.

Добавлено через 7 минут и 42 секунды
Или подойдут случайные блуждания. Алгоритм простой в случайном направление выбираются движение со случайными числами.
Правда по прямой они не двигаются, только по окружности.
PM MAIL   Вверх
_Y_
Дата 30.3.2012, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



Цитата(bagos @  29.3.2012,  23:30 Найти цитируемый пост)
эмулирования присутствия человека

Чувствуется мне, что человеческое поведение будет достаточно достоверно эмулироваться последовательностью шагов, описываемых уравнениеми второго порядка. Для начала я бы попробовал такой алгоритм:

1. Задаем точки старта (S) и  финиша (F).
2. Присваиваем точке промежуточного старта значение точки старта:  s=S
3. Выбираем третью случайную точку (R). При этом берем не равномерное случайное распределение, а распределение с вероятностью возрастающей по мере приближения к прямой, соединяющей s и F. Человек - не дурак (ну не совсем дурак smile ) и чаще старается двигаться поближе к кратчайшему расстоянию.
4. Выбираем точку промежуточного финиша (f) случайным образом отличающуюся от F. При этом распределение вероятности куполообразное по обоим координатам и купол тем "острее", чем меньше расстояние между  s и F.
5. Находим участок кривой, соединяющий  s и f. Этот участок будет описываться уравнением второго порядка Y=a*X*X+b*X+c. Коэффициенты уравнения ищем по трем точкам  s, R  и f.
6. Проверяем отклонение точки  f от финиша F. Если отклонение меньше заданной допустимой ошибки (разрешения экрана или разрешения мыши или.....), то задача решена. Если расстояние больше допустимого, продолжаем - идем к пункту 7.
7. Назначаем найденную конечную точку началом следующего отрезка s=f
8. Идем на следующую иттерацию - возвращаемся на пункт 3.

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


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
bagos
Дата 30.3.2012, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 17.6.2006

Репутация: нет
Всего: 1



Большое вам спасибо, остановился на двух вариантах, на безье и уравнении второго порядка. Потом отпишусь о результатах.
PM MAIL   Вверх
TiBogom
Дата 3.4.2012, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 30.3.2012

Репутация: нет
Всего: нет



Реализовал алгоритм, используя кривую Безье по 4 точкам. В целом получается не плохо. Правда от человеческого поведения сильно отличается :(
Подумал насчет записи пользовательских движений, и если честно не представляю как потом полученные данные можно использовать.
Если записывать координаты перемещение курсора в массив, то как потом применить полученные данные?
Либо записывать видео экрана как пользователь водит курсором мышки по нему и затем изучать и пытаться построить модель...
даже не знаю.
У кого какие мысли по этому поводу?

Извиняюсь что от другого имени пишу, потерялся пароль на тот логин(

Это сообщение отредактировал(а) TiBogom - 3.4.2012, 13:44
PM MAIL   Вверх
nworm
Дата 3.4.2012, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



Ещё можно строить кривую за кривой по результатам действия пользователя.
1 кривая - первый записанный вариант (массив x,y)
2 кривая - 2-й записанный вариант (тоже массив x,y)
и т.д.

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

Исследовательская задача это. Возможно, длительная.
PM MAIL WWW   Вверх
baldina
Дата 3.4.2012, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 4
Всего: 101



Цитата(TiBogom @  3.4.2012,  13:43 Найти цитируемый пост)
от человеческого поведения сильно отличается

это потому что она гладкая. у человека рука дрожит, линия ломаная, вид зависит от скорости перемещения мыши и длины линии.
может результаты будут лучше, если рисовать прямую, внося на каждом шаге случайную погрешность. распределение случайных чисел лучше брать не равномерное, а нормальное.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1432 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.