Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Построение касательной к произвольной точке кривой 
:(
    Опции темы
hisashi
Дата 8.5.2014, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дано:

1. массив A размера w * h, содержащий произвольную кривую (для простоты можно считать, что она никогда не пересекает себя)
2. Точка p, принадлежащая к этой кривой

Существует ли какой-нибудь более-менее стандартизированный алгоритм построения касательной к такой кривой в точке p? И имеет ли эта задача какое-либо отношение к методике kNN?

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

Заранее спасибо.

Это сообщение отредактировал(а) hisashi - 8.5.2014, 05:55
PM MAIL   Вверх
mrgloom
Дата 8.5.2014, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



производная в точке (x0,y0)   k= dy/dx = (y1-y0)/(x1-x0) = тангенс угла наклона касательной прямой
имея точку (x0,y0) и угол наклона строим касательную.
y=k*x+b     b= y0-k*x0
PM MAIL   Вверх
hisashi
Дата 8.5.2014, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mrgloom @ 8.5.2014,  09:04)
производная в точке (x0,y0)   k= dy/dx = (y1-y0)/(x1-x0) = тангенс угла наклона касательной прямой
имея точку (x0,y0) и угол наклона строим касательную.
y=k*x+b     b= y0-k*x0

Где (x1, y1) - это соседний к (x0, y0) пиксель? Тогда получается, что k может принимать всего лишь 6 значений.
PM MAIL   Вверх
mrgloom
Дата 8.5.2014, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



так вообще то точки из которых состоит кривая хранят допустим в массиве float, а только потом это всё растеризуется на картинку и попадает уже в конкретные пиксели.
так что соседняя в массиве точка.

http://math.stackexchange.com/questions/30...nd-a-derivative
 

Это сообщение отредактировал(а) mrgloom - 8.5.2014, 10:37
PM MAIL   Вверх
hisashi
Дата 8.5.2014, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mrgloom @ 8.5.2014,  10:37)
так вообще то точки из которых состоит кривая хранят допустим в массиве float, а только потом это всё растеризуется на картинку и попадает уже в конкретные пиксели.
так что соседняя в массиве точка.

http://math.stackexchange.com/questions/30...nd-a-derivative

Все, что у меня есть - это двухмерный массив int-ов размерности (w, h). Но по ссылке довольно таки вкусно, попробуем.

Спасибо.
PM MAIL   Вверх
_Y_
Дата 10.5.2014, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



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


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


Опытный
**


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

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



Вообще говоря лучший вариант конечно аппроксимация полиномом низкой степени (те самые сплайны). Если нужна скорость и простота, тогда для любой не крайней точки, имеем двух соседей x[i-1]y[i-1] и x[i+1]y[i+1]. поскольку в действительности мы имеем ломанную, то касательная в точке x[i]y[i] определена не однозначно, но наиболее "правильный" (в сильном смысле средний) вариант провести касательную параллельно прямой, соединяющей соседние точки. Это решение опирается на следующие соображения. 
Правая касательная это прямая, являющаяся пределом секущей проходящей через данную точку и лежащую справа от  нее при стремлении правой соседней точки к данной.
Левая касательная определяется так же.
Для непрерывно дифференцируемых функций левая и правая касательные в каждой точке совпадают. В этом случае можно говорить о просто касательной. Очевидно, что левая касательная в вашем случае является прямой проходящей через точки x[i-1]y[i-1] и x[i]y[i], правая касательная - через точки x[i]y[i] и x[i+1]y[i+1]. Что будет просто касательной?
Если мы предположим, что ваш массив точек это дискретизация непрерывно дифференцируемой функции, то производная в точке x[i]y[i] может выть вычислена тремя способами:
1. Левая производная (y[i]-y[i-1])/(x[i]-x[i-1])
2. Правая производная (y[i+1]-y[i])/(x[i+1]-x[i])
3. Центральная производная (y[i+1]-y[i-1])/(x[i+1]-x[i-1])
Левая и правая производные имеют первый порядок точности аппроксимации, центральная - второй.
Таким образом, центральная производная является наиболее точной и прямая, параллельная прямой, проходящей через точки x[i-1]y[i-1] и x[i+1]y[i+1], является наилучшим приближением к касательной.

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

Если действовать честно, то получается где-то так. smile 


--------------------
Mirkes
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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