Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите найти библиотеку (Построение B-сплайнов) [D6, D7]


Dimon_St ©   (2004-09-27 16:43:00) 

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


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

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


Jeer   (2004-09-27 18:26:00) [2]

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


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

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


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

Спасибо.


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

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


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

(*************************************************************************
Âû÷èñëåíèå çíà÷åíèÿ ñïëàéíà â òî÷êå ïî òàáëèöå êîýôôèöèåíòîâ

Ôóíêöèÿ Spline3Interpolate ïî ïîñòðîåííîé ïðîöåäóðîé Spline3BuildTable
òàáëèöå êîýôôèöèåíòîâ âû÷èñëÿåò çíà÷åíèå èíòåðïîëèðóåìîé ôóíêöèè â
çàäàííîé òî÷êå.

Ïàðàìåòðû:
   N       - ÷èñëî òî÷åê ìèíóñ 1
   C       - òàáëèöà êîýôôèöèåíòîâ, ïîñòðîåííàÿ ïðîöåäóðîé
             Spline3BuildTable
   X       - òî÷êà, â êîòîðîé âåäåì ðàñ÷åò

Ðåçóëüòàò:
   çíà÷åíèå êóáè÷åñêîãî ñïëàéíà, çàäàííîãî òàáëèöåé C, â òî÷êå 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]


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

Кубический, за качество не ручаюсь - творчески поиздевался над кодом из инета:
(*************************************************************************
Ïðîöåäóðà Spline3BuildTable ñëóæèò  äëÿ  ïîñòðîéêè  òàáëèöû  êîýôôèöèåíòîâ
êóáè÷åñêîãî ñïëàéíà ïî çàäàííûì òî÷êàì è ãðàíè÷íûì óñëîâèÿì, íàêëàäûâàåìûì
íà ïðîèçâîäíûå.

 äàëüíåéøåì ïîñòðåííàÿ òàáëèöà èñïîëüçóåòñÿ ôóíêöèåé Spline3Interpolate.

Ïàðàìåòðû:
   N       - ÷èñëî òî÷åê ìèíóñ 1.
   DiffN   - òèï ãðàíè÷íîãî óñëîâèÿ. "1" ñîîòâåòñòâóåò ãðàíè÷íûì óñëîâèÿì
             íàêëàäûâàåìûì íà ïåðâûå ïðîèçâîäíûå, "2" - íà âòîðûå.
   xs      - ìàññèâ àáñöèññ îïîðíûõ òî÷åê ñ íîìåðàìè îò 0 äî N.
   ys      - ìàññèâ îðäèíàò îïîðíûõ òî÷åê ñ íîìåðàìè îò 0 äî N.
   BoundL  - ëåâîå ãðàíè÷íîå óñëîâèå. Åñëè DiffN ðàâíî 1, òî ïåðâàÿ ïðîèç-
             âîäíàÿ  íà  ëåâîé  ãðàíèöå  ðàâíà BoundL, èíà÷å BoundL ðàâíà
             âòîðàÿ.
   BoundR  - àíàëîãè÷íî BoundL

Âûõîäíûå çíà÷åíèÿ:
   ctbl    - â ýòîò ìàññèâ ïîìåùàåòñÿ òàáëèöà êîýôôèöèåíòîâ ñïëàéíà.
             Ýòà òàáëèöà èñïîëüçóåòñÿ ôóíêöèåé 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]=0) and C);
     i := i+1;
   until  not (i0);
 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


MBo   (2004-09-27 17:15:00) [8]

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

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


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

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


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

Кубический.
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:00) [11]

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо