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

Вниз

Помогите найти библиотеку (Построение B-сплайнов)   Найти похожие ветки 

 
Dimon_St   (2004-09-27 16:43) [0]

Здравствуйте. Нужна библиотека (на Delphi) для вычисления коэффицентов квадратичного и кубического B-сплайна.


 
Рамиль ©   (2004-09-27 17:11) [1]

Кубический.
unit Splains;

interface
uses SysUtils, Windows, Messages, Dialogs;

type
 TPolynom = class(TObject)
   private
     FKof: array[0..3] of extended;
   function GetKof(index: integer): extended;
   procedure SetKof(index: integer; const Value: extended);
   public
     constructor Create;
     function Value(x: extended): extended;
     property Kof[index: integer]: extended read GetKof write SetKof;
 end;

 TSplain = class(TObject)
   private
     FSplain: array of TPolynom;
     Fx: array of extended ;
 public
     constructor Create(x, f: array of extended; xprob: extended);
     function Value(x: extended): extended;
 end;

implementation
uses Progonka;

{ TSplain }

constructor TSplain.Create(x, f: array of extended; Xprob: extended);
var
 i, n: integer;
 lam, mu: extended;
 a, b, c, g, m, h: array of extended;
 Polynom: TPolynom;
begin
 n:=Length(x);
 SetLength(Fx, n);
 for i:=0 to n-1 do
  Fx[i]:=x[i];
         SetLength(m, N);
 SetLength(a, N);
 SetLength(b, N);
 SetLength(c, N);
 SetLength(g, N);
 SetLength(h, N-1);
 SetLength(FSplain, n-1);
 for i:=1 to n-2 do
 begin
   a[i]:=2;
   h[i]:=x[i+1]-x[i];
   c[i]:=h[i]/(x[i+1]-x[i-1]);
   b[i]:=1-c[i];
   g[i]:=3*(c[i]*(f[i]-f[i-1])/(x[i]-x[i-1])+
            b[i]*(f[i+1]-f[i])/(x[i+1]-x[i]));
 end;
 h[0]:=x[1]-x[0];
 c[0]:=0; b[0]:=0; c[n-1]:=0; b[n-1]:=0;
 lam:=(x[1]-x[0])/(x[2]-x[0]);
 mu:=1-lam;
 a[0]:=1; a[n-1]:=1;
 g[0]:=(1+mu)*(f[1]-f[0])/(x[1]-x[0])-mu*(f[2]-f[1])/(x[2]-x[1]);
 lam:=(x[n-1]-x[n-2])/(x[n-1]-x[n-3]);
 g[n-1]:=-lam*(f[n-2]-f[n-3])/(x[n-2]-x[n-3])+(1+lam)*(f[n-1]-f[n-2])/(x[n-1]-x[n-2]);
 SolutionProgonka(a, b, c, g, m);
 for i:=0 to n-2 do
 begin
   Polynom:=TPolynom.Create;
   Polynom.Kof[3]:= (2*f[i]-2*f[i+1]+h[i]*m[i]+h[i]*m[i+1])/((x[i+1]-x[i])*
                     (x[i+1]-x[i])*(x[i+1]-x[i]));
   Polynom.Kof[2]:= (-3*f[i]*(x[i+1]+x[i])+3*f[i+1]*(x[i+1]+x[i])-
                      h[i]*m[i]*(2*x[i+1]+x[i])-h[i]*m[i+1]*(2*x[i]+
                      x[i+1]))/((x[i+1]-x[i])*(x[i+1]-x[i])*(x[i+1]-x[i]));
   Polynom.Kof[1]:= (6*x[i]*x[i+1]*f[i]-6*x[i]*x[i+1]*f[i+1]+
                      h[i]*m[i]*(x[i+1]*x[i+1]+2*x[i]*x[i+1])+
                      h[i]*m[i+1]*(2*x[i]*x[i+1]+x[i]*x[i]))/((x[i+1]-
                      x[i])*(x[i+1]-x[i])*(x[i+1]-x[i]));
   Polynom.Kof[0]:= ((x[i+1]*x[i+1]*x[i+1]-3*x[i]*x[i+1]*x[i+1])*f[i]+f[i+1]*
                     (3*x[i]*x[i]*x[i+1]-x[i]*x[i]*x[i])-h[i]*m[i]*x[i]*
                     x[i+1]*x[i+1]-h[i]*m[i+1]*x[i]*x[i]*x[i+1])/((x[i+1]-x[i])
                     *(x[i+1]-x[i])*(x[i+1]-x[i]));
   FSplain[i]:=Polynom;
 end;
 Finalize(a);
 Finalize(b);
 Finalize(c);
 Finalize(g);
 Finalize(h);
 Finalize(m);
end;

function TSplain.Value(x: extended): extended;
var i: integer;
begin
 if (x<Fx[0]) or (x>Fx[High(Fx)]) then
   ShowMessage("Идиот!!! Х вышел за пределы по которым ты строил сплайн.");
 for i:=1 to high(Fx) do if x <= Fx[i] then break;
 result:=FSplain[i-1].Value(x);
end;

{ TPolynom }

constructor TPolynom.Create;
var
 i: integer;
begin
 for i:=0 to 3 do FKof[i]:=0;
end;

function TPolynom.GetKof(index: integer): extended;
begin
 result:=FKof[index];
end;

procedure TPolynom.SetKof(index: integer; const Value: extended);
begin
 FKof[index]:=Value;
end;

function TPolynom.Value(x: extended): extended;
var
 i: integer;
 stepen: extended;
begin
  result:=FKof[0];
  stepen:=1;
  for i:=1 to 3 do
  begin
    stepen:=stepen*x;
    result:=result+FKof[i]*stepen;
  end;
end;

end.


 
Рамиль ©   (2004-09-27 17:11) [2]

unit Progonka;

interface
uses SysUtils, Windows, Messages;

procedure SolutionProgonka(a, b, c, g:array of extended;
                           var z: array of extended);

implementation

procedure SolutionProgonka(a, b, c, g: array of extended;
                           var z: array of extended);
var
  n, i, j: integer;
  u, v: array of extended;
begin
  n:=Length(Z);
  SetLength(u, n+1);
  SetLength(v, n+1);
  v[0]:=0; u[0]:=0;
  for i:=1 to n do
  begin
    v[i]:=-b[i-1]/(a[i-1]+c[i-1]*v[i-1]);
    u[i]:=(g[i-1]-c[i-1]*u[i-1])/(a[i-1]+c[i-1]*v[i-1]);
  end;
  z[n-1]:=u[n];
  for i:=n-1 downto 1 do
  begin
    z[i-1]:=v[i]*z[i]+u[i];
  end;
end;
end.


 
Рамиль ©   (2004-09-27 17:13) [3]

За качество не ручаюсь, отрывок из не моей курсовой на третьем курсе.


 
MBo ©   (2004-09-27 17:15) [4]

>Рамиль
Это у тебя не B-сплайны, а обычные (полиномиальный базис).

>Dimon_St  
http://astronomy.swin.edu.au/~pbourke/curves/spline/
да и сам поисковиком-то поработай...


 
REA   (2004-09-27 17:18) [5]

Кубический, за качество не ручаюсь - творчески поиздевался над кодом из инета:
(*************************************************************************
&#207;&#240;&#238;&#246;&#229;&#228;&#243;&#240;&#224; Spline3BuildTable &#241;&#235;&#243;&#230;&#232;&#242;  &#228;&#235;&#255;  &#239;&#238;&#241;&#242;&#240;&#238;&#233;&#234;&#232;  &#242;&#224;&#225;&#235;&#232;&#246;&#251;  &#234;&#238;&#253;&#244;&#244;&#232;&#246;&#232;&#229;&#237;&#242;&#238;&#226;
&#234;&#243;&#225;&#232;&#247;&#229;&#241;&#234;&#238;&#227;&#238; &#241;&#239;&#235;&#224;&#233;&#237;&#224; &#239;&#238; &#231;&#224;&#228;&#224;&#237;&#237;&#251;&#236; &#242;&#238;&#247;&#234;&#224;&#236; &#232; &#227;&#240;&#224;&#237;&#232;&#247;&#237;&#251;&#236; &#243;&#241;&#235;&#238;&#226;&#232;&#255;&#236;, &#237;&#224;&#234;&#235;&#224;&#228;&#251;&#226;&#224;&#229;&#236;&#251;&#236;
&#237;&#224; &#239;&#240;&#238;&#232;&#231;&#226;&#238;&#228;&#237;&#251;&#229;.

&#194; &#228;&#224;&#235;&#252;&#237;&#229;&#233;&#248;&#229;&#236; &#239;&#238;&#241;&#242;&#240;&#229;&#237;&#237;&#224;&#255; &#242;&#224;&#225;&#235;&#232;&#246;&#224; &#232;&#241;&#239;&#238;&#235;&#252;&#231;&#243;&#229;&#242;&#241;&#255; &#244;&#243;&#237;&#234;&#246;&#232;&#229;&#233; Spline3Interpolate.

&#207;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251;:
   N       - &#247;&#232;&#241;&#235;&#238; &#242;&#238;&#247;&#229;&#234; &#236;&#232;&#237;&#243;&#241; 1.
   DiffN   - &#242;&#232;&#239; &#227;&#240;&#224;&#237;&#232;&#247;&#237;&#238;&#227;&#238; &#243;&#241;&#235;&#238;&#226;&#232;&#255;. "1" &#241;&#238;&#238;&#242;&#226;&#229;&#242;&#241;&#242;&#226;&#243;&#229;&#242; &#227;&#240;&#224;&#237;&#232;&#247;&#237;&#251;&#236; &#243;&#241;&#235;&#238;&#226;&#232;&#255;&#236;
             &#237;&#224;&#234;&#235;&#224;&#228;&#251;&#226;&#224;&#229;&#236;&#251;&#236; &#237;&#224; &#239;&#229;&#240;&#226;&#251;&#229; &#239;&#240;&#238;&#232;&#231;&#226;&#238;&#228;&#237;&#251;&#229;, "2" - &#237;&#224; &#226;&#242;&#238;&#240;&#251;&#229;.
   xs      - &#236;&#224;&#241;&#241;&#232;&#226; &#224;&#225;&#241;&#246;&#232;&#241;&#241; &#238;&#239;&#238;&#240;&#237;&#251;&#245; &#242;&#238;&#247;&#229;&#234; &#241; &#237;&#238;&#236;&#229;&#240;&#224;&#236;&#232; &#238;&#242; 0 &#228;&#238; N.
   ys      - &#236;&#224;&#241;&#241;&#232;&#226; &#238;&#240;&#228;&#232;&#237;&#224;&#242; &#238;&#239;&#238;&#240;&#237;&#251;&#245; &#242;&#238;&#247;&#229;&#234; &#241; &#237;&#238;&#236;&#229;&#240;&#224;&#236;&#232; &#238;&#242; 0 &#228;&#238; N.
   BoundL  - &#235;&#229;&#226;&#238;&#229; &#227;&#240;&#224;&#237;&#232;&#247;&#237;&#238;&#229; &#243;&#241;&#235;&#238;&#226;&#232;&#229;. &#197;&#241;&#235;&#232; DiffN &#240;&#224;&#226;&#237;&#238; 1, &#242;&#238; &#239;&#229;&#240;&#226;&#224;&#255; &#239;&#240;&#238;&#232;&#231;-
             &#226;&#238;&#228;&#237;&#224;&#255;  &#237;&#224;  &#235;&#229;&#226;&#238;&#233;  &#227;&#240;&#224;&#237;&#232;&#246;&#229;  &#240;&#224;&#226;&#237;&#224; BoundL, &#232;&#237;&#224;&#247;&#229; BoundL &#240;&#224;&#226;&#237;&#224;
             &#226;&#242;&#238;&#240;&#224;&#255;.
   BoundR  - &#224;&#237;&#224;&#235;&#238;&#227;&#232;&#247;&#237;&#238; BoundL

&#194;&#251;&#245;&#238;&#228;&#237;&#251;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255;:
   ctbl    - &#226; &#253;&#242;&#238;&#242; &#236;&#224;&#241;&#241;&#232;&#226; &#239;&#238;&#236;&#229;&#249;&#224;&#229;&#242;&#241;&#255; &#242;&#224;&#225;&#235;&#232;&#246;&#224; &#234;&#238;&#253;&#244;&#244;&#232;&#246;&#232;&#229;&#237;&#242;&#238;&#226; &#241;&#239;&#235;&#224;&#233;&#237;&#224;.
             &#221;&#242;&#224; &#242;&#224;&#225;&#235;&#232;&#246;&#224; &#232;&#241;&#239;&#238;&#235;&#252;&#231;&#243;&#229;&#242;&#241;&#255; &#244;&#243;&#237;&#234;&#246;&#232;&#229;&#233; Spline3Interpolate.
*************************************************************************)
procedure Spline3BuildTable(DiffN: Integer; x, y: TDoubleArray;
                           BoundL, BoundR: Double; var ctbl: TSplineArray);
var
 C: Boolean;
 N, G: Integer;
 Tmp: Double;
 nxm1: Integer;
 I, J: Integer;
 DX, DXJ, DYJ: Double;
 DXJP1, DYJP1: Double;
 DXP, YPPA, YPPB: Double;
 PJ, b1, b2, b3, b4: Double;
begin
 N := Length(X)-1;
 //Body
 g := (n+1) div 2;
 repeat
   i := g;
   repeat
     j := i-g;
     c := True;
     repeat
       if x[j]<=x[j+g] then
         c := False
       else
       begin
         Tmp := x[j];
         x[j] := x[j+g];
         x[j+g] := Tmp;
         Tmp := y[j];
         y[j] := y[j+g];
         y[j+g] := Tmp;
       end;
       j := j-1;
     until  not ((j>=0) and C);
     i := i+1;
   until  not (i<=n);
   g := g div 2;
 until  not (g>0);
 For i := 0 To 4 Do
   If High(ctbl[i])<>N Then
     SetLength(ctbl[i], N+1);
 N := N+1;
 if DiffN=1 then
 begin
   b1 := 1;
   b2 := 6/(x[1]-x[0])*((y[1]-y[0])/(x[1]-x[0])-BoundL);
   b3 := 1;
   b4 := 6/(x[n-1]-x[n-2])*(BoundR-(y[n-1]-y[n-2])/(x[n-1]-x[n-2]));
 end else
 begin
   b1 := 0;
   b2 := 2*BoundL;
   b3 := 0;
   b4 := 2*BoundR;
 end;
 nxm1 := n-1;
 if n>=2 then
 begin
   if n>2 then
   begin
     dxj := x[1]-x[0];
     dyj := y[1]-y[0];
     j := 2;
     while j<=nxm1 do
     begin
       dxjp1 := x[j]-x[j-1];
       dyjp1 := y[j]-y[j-1];
       dxp := dxj+dxjp1;
       ctbl[1,j-1] := dxjp1/dxp;
       ctbl[2,j-1] := 1-ctbl[1,j-1];
       ctbl[3,j-1] := 6*(dyjp1/dxjp1-dyj/dxj)/dxp;
       dxj := dxjp1;
       dyj := dyjp1;
       j := j+1;
     end;
   end;
   ctbl[1,0] := -b1/2;
   ctbl[2,0] := b2/2;
   if n<>2 then
   begin
     j := 2;
     while j<=nxm1 do
     begin
       pj := ctbl[2,j-1]*ctbl[1,j-2]+2;
       ctbl[1,j-1] := -ctbl[1,j-1]/pj;
       ctbl[2,j-1] := (ctbl[3,j-1]-ctbl[2,j-1]*ctbl[2,J-2])/pj;
       j := j+1;
     end;
   end;
   yppb := (b4-b3*ctbl[2,nxm1-1])/(b3*ctbl[1,nxm1-1]+2);
   i := 1;
   while i<=nxm1 do
   begin
     j := n-i;
     yppa := ctbl[1,j-1]*yppb+ctbl[2,j-1];
     dx := x[j]-x[j-1];
     ctbl[3,j-1] := (yppb-yppa)/dx/6;
     ctbl[2,j-1] := yppa/2;
     ctbl[1,j-1] := (y[j]-y[j-1])/dx-(ctbl[2,j-1]+ctbl[3,j-1]*dx)*dx;
     yppb := yppa;
     i := i+1;
   end;
   i:=1;
   while i<=n do
   begin
     ctbl[0,i-1] := y[i-1];
     ctbl[4,i-1] := x[i-1];
     Inc(i);
   end;
 end;
end;


 
REA   (2004-09-27 17:20) [6]

(*************************************************************************
&#194;&#251;&#247;&#232;&#241;&#235;&#229;&#237;&#232;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255; &#241;&#239;&#235;&#224;&#233;&#237;&#224; &#226; &#242;&#238;&#247;&#234;&#229; &#239;&#238; &#242;&#224;&#225;&#235;&#232;&#246;&#229; &#234;&#238;&#253;&#244;&#244;&#232;&#246;&#232;&#229;&#237;&#242;&#238;&#226;

&#212;&#243;&#237;&#234;&#246;&#232;&#255; Spline3Interpolate &#239;&#238; &#239;&#238;&#241;&#242;&#240;&#238;&#229;&#237;&#237;&#238;&#233; &#239;&#240;&#238;&#246;&#229;&#228;&#243;&#240;&#238;&#233; Spline3BuildTable
&#242;&#224;&#225;&#235;&#232;&#246;&#229; &#234;&#238;&#253;&#244;&#244;&#232;&#246;&#232;&#229;&#237;&#242;&#238;&#226; &#226;&#251;&#247;&#232;&#241;&#235;&#255;&#229;&#242; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229; &#232;&#237;&#242;&#229;&#240;&#239;&#238;&#235;&#232;&#240;&#243;&#229;&#236;&#238;&#233; &#244;&#243;&#237;&#234;&#246;&#232;&#232; &#226;
&#231;&#224;&#228;&#224;&#237;&#237;&#238;&#233; &#242;&#238;&#247;&#234;&#229;.

&#207;&#224;&#240;&#224;&#236;&#229;&#242;&#240;&#251;:
   N       - &#247;&#232;&#241;&#235;&#238; &#242;&#238;&#247;&#229;&#234; &#236;&#232;&#237;&#243;&#241; 1
   C       - &#242;&#224;&#225;&#235;&#232;&#246;&#224; &#234;&#238;&#253;&#244;&#244;&#232;&#246;&#232;&#229;&#237;&#242;&#238;&#226;, &#239;&#238;&#241;&#242;&#240;&#238;&#229;&#237;&#237;&#224;&#255; &#239;&#240;&#238;&#246;&#229;&#228;&#243;&#240;&#238;&#233;
             Spline3BuildTable
   X       - &#242;&#238;&#247;&#234;&#224;, &#226; &#234;&#238;&#242;&#238;&#240;&#238;&#233; &#226;&#229;&#228;&#229;&#236; &#240;&#224;&#241;&#247;&#229;&#242;

&#208;&#229;&#231;&#243;&#235;&#252;&#242;&#224;&#242;:
   &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229; &#234;&#243;&#225;&#232;&#247;&#229;&#241;&#234;&#238;&#227;&#238; &#241;&#239;&#235;&#224;&#233;&#237;&#224;, &#231;&#224;&#228;&#224;&#237;&#237;&#238;&#227;&#238; &#242;&#224;&#225;&#235;&#232;&#246;&#229;&#233; C, &#226; &#242;&#238;&#247;&#234;&#229; X
*************************************************************************)
function Spline3Interpolate(N: Integer; const c: TSplineArray; X: Double):Double;
var
 I: Integer;
 L: Integer;
 Half: Integer;
 First: Integer;
 Middle: Integer;
begin
 L := N;
 First := 0;
 while L>0 do
 begin
   Half := L div 2;
   Middle := First+Half;
   if C[4,Middle]<X then
   begin
     First := Middle+1;
     L := L-Half-1;
   end else L := Half;
 end;
 I := First-1;
 if I<0 then I := 0;
 Result := c[0,I]+(X-c[4,i])*(C[1,I]+(X-c[4,i])*(C[2,I]+C[3,i]*(X-c[4,i])));
end;

Типы забыл еще:
TDoubleArray = Array Of Double;
TSplineArray = Array[0..4] Of TDoubleArray;


 
Рамиль ©   (2004-09-27 17:23) [7]

MBo ©   (27.09.04 17:15) [4]
Сам спалайнами не занимался.. Странно только, вроде автор курсовой делал B-сплайны :o)


 
Dimon_St   (2004-09-27 17:33) [8]

Спасибо.


 
Dimon_St   (2004-09-27 18:21) [9]

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


 
Jeer ©   (2004-09-27 18:26) [10]

Правильно, не верь.
Все есть:))


 
Dimon_St   (2004-09-27 18:28) [11]

Вот только где?



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

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

Наверх




Память: 0.52 MB
Время: 0.04 c
8-1090282405
Sky Knight
2004-07-20 04:13
2004.10.10
Микрофон вкл/выкл


9-1086597391
Igoryok
2004-06-07 12:36
2004.10.10
Разве есть дельфих для directx9


1-1095937631
XM-AD
2004-09-23 15:07
2004.10.10
Как завершить процес???


1-1095779730
M-Alex
2004-09-21 19:15
2004.10.10
Timer


14-1095292657
Мистер Х
2004-09-16 03:57
2004.10.10
Будущее MS Windows





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский