Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Помогите найти библиотеку (Построение 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.036 c
1-1095960132
lipskiy
2004-09-23 21:22
2004.10.10
Как назначить PopupMenu на один из пунктов MainMenu (Срочно!!!)


14-1095779829
}|{yk
2004-09-21 19:17
2004.10.10
Ура! Справедливое решение УЕФА


14-1095100742
Knight
2004-09-13 22:39
2004.10.10
Банк идей...


1-1096014105
Kniaz
2004-09-24 12:21
2004.10.10
Проверка файла


9-1086797256
karlsn
2004-06-09 20:07
2004.10.10
ии в игре типа "генералов"