2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.



Начать новую тему Ответить на тему
 
 Аппроксимация сплайнами NURBS
Сообщение17.12.2008, 15:37 


01/09/08
17
Всем доброго времени суток!
Подскажите пожалуйста как сделать аппроксимацию NURBS-сплайнами (разновидность B-сплайнов). Что-то в интернете и в учебниках не могу найти. Есть только теория через управляющие точки. А чистой аппроксимации нет.
Дано: массив точек и значения первой производной в крайних точках (принимается, что вторая производная в крайних точках равна нулю).

 Профиль  
                  
 
 
Сообщение22.12.2008, 13:30 
Заслуженный участник
Аватара пользователя


11/04/07
1352
Москва
NURBS - очень своеобразная аппроксимация пространственных кривых. При этом часть опорных точек не принадлежат аппроксимирующей кривой. По какой причине Вам нужна именно эта аппроксимация?
Пример кривой NURBS - окружность радиуса 1.
Входной файл th_.txt
1 0 0 1
1 1 0 0.707
0 1 0 1
-1 1 0 0.707
-1 0 0 1
-1 -1 0 0.707
0 -1 0 1
1 -1 0 0.707
1 0 0 1
Текст программы на Фортране
chttp://www.gignews.com/parametric.htm
chttp://en.wikipedia.org/wiki/NURBS
c Mike Zai 2008 Dec 19

real b(100,10)
real t(100)
real x(4,9)
real y(3)
data (t(j),j=1,12)/0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4/
imax=12
kmax=3
npmax=9
open(11,file='th_.txt')
open(12,file='th_.csv')
do i=1,npmax
read (11,*) (x(j,i),j=1,4)
end do
close(11)
jmax=81
do j1=1,jmax
do i=1,100
do j=1,10
b(i,j)=0.0
end do
end do
u=4*(j1-1)/float(jmax-1)
call defb(b,u,imax,kmax,t)
do j=1,3
y(j)=0.0
end do
s=0.0
do i=1,npmax
do j=1,3
y(j)=y(j)+x(j,i)*b(i,kmax)*x(4,i)
end do
s=s+b(i,kmax)*x(4,i)
end do
if (s.ne.0) then
do j=1,3
y(j)=y(j)/s
end do
else
s=-1
end if
write(12,*) y(1),char(44),y(2),char(44),y(3)
write(*,*) u,y,s
end do
end
subroutine defb(b,u,imax,kmax,t)
real b(100,10)
real t(100)
do k=1,kmax
do i=1,imax
if (k.eq.1) then
b(i,k)=1.0
if (u.lt.t(i)) b(i,k)=0.0
if (u.gt.t(i+1)) b(i,k)=0.0
else
b(i,k)=0.0

if (t(i+k).ne.t(i+1)) then
b(i,k)=(t(i+k)-u)/(t(i+k)-t(i+1))*b(i+1,k-1)
end if
if (t(i+k-1).ne.t(i)) then

b(i,k)=(u-t(i))/(t(i+k-1)-t(i))*b(i,k-1)

end if

if (t(i+k).ne.t(i+1)) then
if (t(i+k-1).ne.t(i)) then
b(i,k)=(u-t(i))/(t(i+k-1)-t(i))*b(i,k-1)
$+(t(i+k)-u)/(t(i+k)-t(i+1))*b(i+1,k-1)

end if
end if



end if
end do
end do
return
end
Выходной файл (th_.csv) для Excel с координатами
1.000000 , 0.0000000E+00, 0.0000000E+00
0.9558616 , 0.2937853 , 0.0000000E+00
0.8138149 , 0.5810836 , 0.0000000E+00
0.5810836 , 0.8138149 , 0.0000000E+00
0.2937853 , 0.9558616 , 0.0000000E+00
0.0000000E+00, 1.000000 , 0.0000000E+00
-0.2937854 , 0.9558616 , 0.0000000E+00
-0.5810836 , 0.8138149 , 0.0000000E+00
-0.8138149 , 0.5810836 , 0.0000000E+00
-0.9558616 , 0.2937854 , 0.0000000E+00
-1.000000 , 0.0000000E+00, 0.0000000E+00
-0.9558616 , -0.2937854 , 0.0000000E+00
-0.8138149 , -0.5810837 , 0.0000000E+00
-0.5810837 , -0.8138149 , 0.0000000E+00
-0.2937854 , -0.9558616 , 0.0000000E+00
0.0000000E+00, -1.000000 , 0.0000000E+00
0.2937854 , -0.9558616 , 0.0000000E+00
0.5810837 , -0.8138149 , 0.0000000E+00
0.8138148 , -0.5810837 , 0.0000000E+00
0.9558616 , -0.2937854 , 0.0000000E+00
1.000000 , 0.0000000E+00, 0.0000000E+00

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group