Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

Как построить кривую Безье?   Найти похожие ветки 

 
WondeRu ©   (2005-02-17 10:03) [0]

Здравствуйте, уважаемые!

Вот задался проблемой, как построить кривую Безье! Но алгоритмов готовых так и не нахожу. В OpenGL для этого существует специальня функция...

Glu.gluNurbsCurve(theNurb,
   KnotCounter, //количество праметрических узлов кривой
   curveKnots, //указатель на массив этих узлов, array[0..N] of float;
   2,          // сколько элементов на одну точку (здесь 2 - X, Y)
   ctrlPoints, // массив опорных точек, array[0..K, 2] of float;
   4,          // порядок степени кривой + 1
   Gl.GL_MAP1_VERTEX_3);


как реализовать похожую функцию без OpenGL, чтобы получить массив вершин кривой. (на С или Делфи)

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


 
Alx2 ©   (2005-02-17 10:05) [1]

А что такое "вершина кривой"?


 
Kerk ©   (2005-02-17 10:07) [2]


> WondeRu

У меня дома исходник на делфи есть.. для лабы писал.. позже скину, если надо


 
Cosinus ©   (2005-02-17 10:07) [3]

Это не подойдет?
http://www.delphirus.com.ru/delphi-sovetid-1250.html

ПыСы Первая ссылка в яндексе :)


 
MBo ©   (2005-02-17 10:08) [4]

gluNurbsCurve, насколько я понимаю из названия и хелпа, строит Non-Uniform Rational B-Spline - кривую более общего вида, чем Безье. Так что именно тебе требуется?


 
Cosinus ©   (2005-02-17 10:11) [5]

Вот еще
http://alglib.manual.ru/interpolation/beziercurve.php
http://softsearch.ru/programs/10394.shtml


 
WondeRu ©   (2005-02-17 10:31) [6]

MBo ©   (17.02.05 10:08) [4]
Так что именно тебе требуется?


было бы здорово конечно различные строить NURBS, но думаю наврдли такой алгоритм найдется... видет только теорию на 50 страницах на страшном английском

Kerk ©   (17.02.05 10:07) [2]
У меня дома исходник на делфи есть.. для лабы писал.. позже скину, если надо

"а Маккона есть у меня дома"(с) )))
обязательно скинь!

Cosinus ©   - пасиба за ссылки!


 
MBo ©   (2005-02-17 12:12) [7]

>WondeRu
Так ты задачу опиши


 
TUser ©   (2005-02-17 12:14) [8]

Если практически говорить, то - PolyBezier и PolyDraw.
Если попрактиковаться в алгоритмах охота - то построение кБ описано в любом учебнике и на любом сайте. Делается это рекурсией - построение кривой зассматривается, как построение двух кривых меньшего размера.


 
вредитель ©   (2005-02-17 12:26) [9]

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


 
Digitman ©   (2005-02-17 12:36) [10]


> Как построить кривую Безье?


хм .. чья кривая, тот пусть сам и строит ее)
а то ить не напасешься на каждого - у одного кривая, у другого косая ..


 
WondeRu w/o client   (2005-02-17 13:57) [11]

>Так ты задачу опиши

задача такая: вышеприведенная функция через модуль OpenGL.pas в Delphi работает замечательно, а сейчас перевожу весь код на C#, используя сторонние компоненты Tao.OpenGL. Эти компоненты реализованы довольно кривоавто, но зато избавляют от мороки самому писать wraper"ы для OpenGL32.dll, Glu32.dll...

видимо из-за "косяка" в Tao данная функция не работает... поэтому приходится реализовывать самому отрисовку сплайна через отрезки...

вредитель ©   (17.02.05 12:26) [9]
ничего не понял)


 
wicked ©   (2005-02-17 14:10) [12]

найти книжку Э. Эйнджела... названия не помню, но их там два издания, необходимо второе...
там как раз эти сплайны хорошо разжеваны....


 
palva ©   (2005-02-17 14:34) [13]

Дональд Кнут в книге "Всё о метафонт" пишет об этом. Книги у меня под рукой нет, опишу своими словами идею, которая геометрически довольно проста.

Кривая начинается в точке A, идет по направлению к точке B и приходит к точке D с направления на точку С. Алгоритм предлагается следующий: Берем ломаную ABCD. X1 - середина отрезка AB, X2 - середина BC, X3 - середина CD. Заменяем ломаную ABCD на A-X1-X2-X3-D. Снова в получившейся ломаной берем середины отрезков и соединяем их от начала к концу очередной ломаной. И так, пока очередная ломаная не будет отличаться от предыдущей при прорисовке на пиксельной сетке.

Петзолд в своем двухтомнике по Windows 95 приводит описывает кривую Безье формулой:

До появления Windows 95 сплайны Безье создавались с помощью функции Polyline. Вам следовало также знать параметрические уравнения, описывающие сплайны Безье. Начальная точка (x0,y0), конечная точка (x3, y3). Две контрольные точки (x1, y1) и (x2, y2). Кривая, отображаемая в интервале t от 0 до 1 описывалась так:

x(t) = (1-t)3x0 + 3t(1-t)2x1 + 3t2(1-t)x2 +t3x3
y(t) = (1-t)3y0 + 3t(1-t)2y1 + 3t2(1-t)y2 +t3y3


 
вредитель ©   (2005-02-17 15:01) [14]

WondeRu w/o client   (17.02.05 13:57) [11]
ничего не понял)

Ээээ... попробую на пальцах. Ежели вычислять все точки кривой с одинаковым шагом, то в зависимости от кривизны, точек может быть больше или меньше чем надо и кривая получается некрасивой (толстая или ломаная). Дабы этого избежать ея строят сначала с большим шагом, вычисляя погрешность соответствия теоретической кривой, каждого полученного сегмента, и если она больше заранее установленной минимальной погрешности, то отрезок рубят на два и продолжают так рекурсивно. Погрешность, в простейшем случае, вычисляют как расстояние от точки лежащей в середине аппроксимируемого куска теоритической кривой, до точки, лежащей на середине полученного в результате аппроксимации сегмента. Т.е. Если левая точка куска (x(t), y(t)) [1], а правая (x(t + 2), y(t + 2)) [2], то находят значение (x(t + 1), y(t + 1)) [3] и вычисляют расстояние до середины прямой, проходящей через точки [1] и [2], что сделать не сложно. Если вдруг [3] оказывается точкой перегиба (или близкой к ней), то погрешность в этой точке оказывается равной нулю (аппроксимирующий отрезок пересекает кривую), и отрезок принимается, как соответствующий условиям аппроксимации, хотя погрешности у его концов могут превышать минимальную. Проблема состоит в отлове точек перегиба и поведении при их обнаружении.


 
WondeRu ©   (2005-02-17 17:08) [15]

вредитель ©   (17.02.05 15:01) [14]
мысль понял...

Реализацию я все-таки сделаю на OpenGL, выяснил же все-таки обойти (не решить) даную проблему, используя стандартную функцию gluNurbsCurve...



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.031 c
14-1108497769
тихий вовочка
2005-02-15 23:02
2005.03.06
Какой ПК брать


6-1104320720
Ertong
2004-12-29 14:45
2005.03.06
WebBrowser чужого приложения


14-1108267173
kaZaNoVa
2005-02-13 06:59
2005.03.06
Международные звонки


3-1107529765
denis24
2005-02-04 18:09
2005.03.06
select ...blob-поля + count() ...group by


14-1108560872
советчик
2005-02-16 16:34
2005.03.06
Рульный вопрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский