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