На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> 3 Spline
    Здраствуйте.Помогите решить вторую половину задачи.
    Первая половина представлена в файле.Её суть: дан отрезок и функция.Разделить отрезок на N равных частей
    и таблицу результатов занести в файл.
    А вот со второй задачей я вряд ли справлюсь.Её суть: между точками x[i] и x[i+1] построить кубический сплайн!!!
    Прикреплённый файлПрикреплённый файлTAB.RAR (0.49 Кбайт, скачиваний: 149)
        Да был я там.Скачал delphi исходник.Да так и ничего и не понял.
          Хорошо, А тебе именно для интерполяции или чего-то другого?

          Добавлено
          И, вообще, какие параметры даны, а что надо вычислить.
          Приведи полностью задание.
            Вобщем, если ты читал статью, которую ты привёл, то всё тоже самое, только за исключением следующего:
            между точками x[i] и x[i+1], которые у меня выводятся в файл в моей программе построить кубический сплайн
            (нарисовать его).Тоесть, если точке N=4, то будет три кубических сплайна (естественно коэффициенты у них будут разные в зависимости точек x): первый сплайн между a=x[1] и x[2]; второй - между x[2] и x[3]; третий - между x[3] и x[4]=b.
              Ну что - теперь ясно?
                Falex, мне то ясно: надо или самому думать, или искать в интернете.
                Мне это не надо, поэтому не ищу.
                  А как тогда построить несколько графиков функции на разных отрезках.Например:
                  x*x на [5,10]
                  x*x*x на [10,15]
                  exp(x) на [15,20]
                      Чтобы это всё в цикле было.
                      Если я например найду эти полиномы для всех точек, то мне надо их как-то нарисовать (причёт строго между точками)!!
                        Falex, похоже, ты просто хочешь, чтобы за тебя написали программу. <_<
                        Если так, то я могу направить топик прямо в раздел "Работа". Там за деньги тебе с радостью помогут.

                        Цитата Falex @
                        мне надо их как-то нарисовать (причёт строго между точками)!

                        Пример там есть! Только бери, да подставляй свои функции.
                          Интересно как я деньги буду платить?
                          P.S>Но я не собираюсь.
                            Вот это тебе, возможно, поможет.
                            ExpandedWrap disabled
                              {$N+}
                              Unit Curves;
                              Interface
                              Uses Graph;
                              Procedure Curve (x1, y1, x2, y2, x3, y3: Integer; Segments: Word);
                              Procedure CubicBezierCurve (x1, y1, x2, y2, x3, y3, x4, y4: Integer; Segments: Word);
                              Procedure BSpline (NumPoints: Word;
                                    Points: array of pointtype; Segments: Word);
                              Procedure Catmull_Rom_Spline (NumPoints: Word; Points: Array Of pointtype; Segments: Word);
                              {----------------------------------------------------------------------------}
                              Implementation
                              Procedure Curve (x1, y1, x2, y2, x3, y3: Integer; Segments: Word);
                              { Draw a curve from (x1,y1) through (x2,y2) to (x3,y3) divided in
                                "Segments" segments }
                              Var
                                lsteps, ex, ey, fx, fy: LongInt;
                                t1, t2: Integer;
                               
                              Begin
                                x2:=(x2 SHL 1)-((x1+x3) SHR 1);
                                y2:=(y2 SHL 1)-((y1+y3) SHR 1);
                                lsteps:=Segments;
                                If (lsteps<2) then lsteps:=2;
                                If (lsteps>128) then lsteps:=128;  { Clamp value to avoid overcalculation }
                                ex:=(LongInt (x2-x1) SHL 17) DIV lsteps;
                                ey:=(LongInt (y2-y1) SHL 17) DIV lsteps;
                                fx:=(LongInt (x3-(2*x2)+x1) SHL 16) DIV (lsteps*lsteps);
                                fy:=(LongInt (y3-(2*y2)+y1) SHL 16) DIV (lsteps*lsteps);
                                Dec (lsteps);
                                While lsteps>0 Do Begin
                                  t1:=x3;
                                  t2:=y3;
                                  x3:=(((fx*lsteps+ex)*lsteps) SHR 16)+x1;
                                  y3:=(((fy*lsteps+ey)*lsteps) SHR 16)+y1;
                                  Line (  t1,t2,x3,y3 );
                                  Dec (lsteps);
                                End;
                                Line (  x3,y3,x1,y1 );
                              End;
                               
                              Procedure CubicBezierCurve (x1, y1, x2, y2, x3, y3, x4, y4: Integer; Segments: Word);
                              { Draw a cubic bezier-curve using the basis functions directly }
                              Var
                                tx1, tx2, tx3, ty1, ty2, ty3, mu, mu2, mu3, mudelta: Real;
                                xstart, ystart, xend, yend, n: Integer;
                               
                              Begin
                                If (Segments<1) then Exit;
                                If Segments>128 then Segments:=128; { Clamp value to avoid overcalculation }
                               
                                mudelta:=1/Segments;
                                mu:=0;
                                tx1:=-x1+3*x2-3*x3+x4; ty1:=-y1+3*y2-3*y3+y4;
                                tx2:=3*x1-6*x2+3*x3;   ty2:=3*y1-6*y2+3*y3;
                                tx3:=-3*x1+3*x2;   ty3:=-3*y1+3*y2;
                               
                                xstart:=x1;
                                ystart:=y1;
                                mu:=mu+mudelta;
                                For n:=1 to Segments Do Begin
                                  mu2:=mu*mu;
                                  mu3:=mu2*mu;
                                  xend:=Round (mu3*tx1+mu2*tx2+mu*tx3+x1);
                                  yend:=Round (mu3*ty1+mu2*ty2+mu*ty3+y1);
                                  Line (  xstart, ystart, xend, yend );
                                  mu:=mu+mudelta;
                                  xstart:=xend;
                                  ystart:=yend;
                                End;
                              End;
                               
                              Procedure Catmull_Rom_Spline (NumPoints: Word; Points: Array Of pointtype; Segments: Word);
                              { Draw a spline approximating a curve defined by the array of points.   }
                              { In contrast to the BSpline this curve will pass through the points    }
                              { defining is except the first and the last point. The curve will only  }
                              { pass through the first and the last point if these points are given   }
                              { twice after eachother, like this:                    }
                              { Array of points:                             }
                              {                                   }
                              {  First point defined twice           Last point defined twice     }
                              {   |-----|                |----------|         }
                              { (0,0),(0,0),(100,100),....,(150,100),(200,200),(200,200)      }
                              { the curve defined by these points will pass through all the points.   }
                              Function Calculate (mu: Real; p0, p1, p2, p3: Integer): Integer;
                               
                              Var
                                mu2, mu3: Real;
                               
                              Begin
                                mu2:=mu*mu;
                                mu3:=mu2*mu;
                                Calculate:=Round ((1/2)*(mu3*(-p0+3*p1-3*p2+p3)+
                                             mu2*(2*p0-5*p1+4*p2-p3)+
                                             mu *(-p0+p2)+(2*p1)));
                              End;
                               
                              Var
                                mu, mudelta: Real;
                                x1, y1, x2, y2, n, h: Integer;
                               
                              Begin
                                If (NumPoints<4) Or (NumPoints>16383) then Exit;
                                mudelta:=1/Segments;
                                For n:=3 to NumPoints-1 Do Begin
                                  mu:=0;
                                  x1:=Calculate (mu,Points[n-3].x,Points[n-2].x,Points[n-1].x,Points[n].x);
                                  y1:=Calculate (mu,Points[n-3].y,Points[n-2].y,Points[n-1].y,Points[n].y);
                                  mu:=mu+mudelta;
                                  For h:=1 to Segments Do Begin
                                    x2:=Calculate (mu,Points[n-3].x,Points[n-2].x,Points[n-1].x,Points[n].x);
                                    y2:=Calculate (mu,Points[n-3].y,Points[n-2].y,Points[n-1].y,Points[n].y);
                                    Line (  x1, y1, x2, y2 );
                                    mu:=mu+mudelta;
                                    x1:=x2;
                                    y1:=y2;
                                  End;
                                End;
                              End;
                              Procedure BSpline (NumPoints: Word;
                                         Points: Array of Pointtype; Segments: Word);
                              type Rmas=array[0..10] of real;
                              Var i,oldy,oldx,x,y,j:integer;
                                  part,t,xx,yy,xmin,xmax,sum:real;
                                  dx,dy,wx,wy,px,py,xp,yp,temp,path,zc,u:Rmas;
                               
                              Function f(g:real):real;
                              begin
                                    f:=g*g*g-g;
                              end;
                               
                              Begin
                                    if NumPoints>10 then exit;
                                  oldx:=999;
                                  x:=Points[0].x;
                                  y:=Points[0].y;
                                  zc[0]:=0.0;
                                  for i:=1 to NumPoints do
                                  begin
                                     xx:=Points[i-1].x-Points[i].x; yy:=Points[i-1].y-Points[i].y;
                                     t:=sqrt(xx*xx+yy*yy);
                                     zc[i]:=zc[i-1]+t;     {establish a proportional linear progression}
                                  end;
                               
                               {Calculate x & y matrix stuff}
                                  for i:=1 to NumPoints-1 do
                                  begin
                                     dx[i]:=2*(zc[i+1]-zc[i-1]);
                                     dy[i]:=2*(zc[i+1]-zc[i-1]);
                                  end;
                                  for i:=0 to NumPoints-1 do
                                  begin
                                     u[i]:=zc[i+1]-zc[i];
                                  end;
                                  for i:=1 to NumPoints-1 do
                                  begin
                                     wy[i]:=6*((Points[i+1].y-Points[i].y)/u[i]-(Points[i].y-Points[i-1].y)/u[i-1]);
                                     wx[i]:=6*((Points[i+1].x-Points[i].x)/u[i]-(Points[i].x-Points[i-1].x)/u[i-1]);
                                  end;
                                  py[0]:=0.0; px[0]:=0.0;    px[1]:=0; py[1]:=0;
                                  py[NumPoints]:=0.0; px[NumPoints]:=0.0;
                                  for i:=1 to NumPoints-2 do
                                  begin
                                     wy[i+1]:=wy[i+1]-wy[i]*u[i]/dy[i];
                                     dy[i+1]:=dy[i+1]-u[i]*u[i]/dy[i];
                                     wx[i+1]:=wx[i+1]-wx[i]*u[i]/dx[i];
                                     dx[i+1]:=dx[i+1]-u[i]*u[i]/dx[i];
                                  end;
                                  for i:=NumPoints-1 downto 1 do
                                  begin
                                     py[i]:=(wy[i]-u[i]*py[i+1])/dy[i];
                                     px[i]:=(wx[i]-u[i]*px[i+1])/dx[i];
                                  end;
                               
                               { Draw spline  }
                                  for i:=0 to NumPoints-1 do
                                  begin
                                     for j:=0 to 30 do
                                     begin
                                    part:=zc[i]-(((zc[i]-zc[i+1])/30)*j);
                                    t:=(part-zc[i])/u[i];
                                    part:=t*Points[i+1].y+(1-t)*Points[i].y+u[i]*u[i]*(f(t)*py[i+1]+f(1-t)*py[i])/6.0;
                                    y:=round(part);
                                    part:=zc[i]-(((zc[i]-zc[i+1])/30)*j);
                                    t:=(part-zc[i])/u[i];
                                    part:=t*Points[i+1].x+(1-t)*Points[i].x+u[i]*u[i]*(f(t)*px[i+1]+f(1-t)*px[i])/6.0;
                                    x:=round(part);
                                    if oldx<>999 then line(oldx,oldy,x,y);
                                    oldx:=x;
                                    oldy:=y;
                                  end;
                                   end;
                                end;
                              END.
                              Интересно - что это такое?И как этим unitom пользоваться?
                              Лучше на моём примере бы объяснил!

                              Добавлено
                              Пример для этого unita есть?
                              А то вот та кне получается:
                              ExpandedWrap disabled
                                program spline;
                                uses crt,graph,splineUnit;
                                begin
                                grDriver:=Detect;
                                InitGraph(grDriver,gMode,'c:\pascal');
                                Curve(0,0,5,5,8,8,3);
                                end.
                                ExpandedWrap disabled
                                  program CurveTst;
                                  uses Crt, Graph,
                                       v256,{}  (* модуль поддержки 256-цветных режимов графики *)
                                       Curves;
                                   
                                  Const
                                     segments = 30;
                                  var
                                     x1, y1,
                                     x2, y2,
                                     x3, y3,
                                     gd, gm : integer;
                                   
                                  begin
                                  {     gd := Detect;
                                       InitGraph (gd, gm, '..\bgi');{}
                                       SetVMode(v640x480);{}
                                   
                                  {     SetBkColor(LightGray);{}
                                   
                                       repeat
                                             ClearDevice;
                                             x1 := random (GetMaxX);
                                             y1 := random (GetMaxY);
                                             x2 := random (GetMaxX);
                                             y2 := random (GetMaxY);
                                             x3 := random (GetMaxX);
                                             y3 := random (GetMaxY);
                                   
                                             SetColor (1 + Random (GetMaxColor));
                                             Curve (x1, y1, x2, y2, x3, y3, segments);
                                             delay (600)
                                       until keypressed;
                                   
                                       CloseGraph;
                                  end.
                                Сообщение отредактировано: Romtek -

                                Прикреплённый файлПрикреплённый файлV256.zip (4.08 Кбайт, скачиваний: 181)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0460 ]   [ 15 queries used ]   [ Generated: 2.05.24, 06:21 GMT ]