![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() И так, у меня курсовая называется "интерполяция полиномами второго порядка графически заданных функции"
Вот что есть в коде Код:
var Form1: TForm1; xx: array of integer; yy: array of integer; ac, bc, cc: array of extended; s: integer = 0; //кол-во тыкнутых точек implementation uses Unit2; {$R *.dfm} Function Check:boolean;//проверка на изменение направления begin if ((xx[s-2]<xx[s-1]) and (xx[s-1]>xx[s])) or ((xx[s-2]>xx[s-1]) and (xx[s-1]<xx[s])) then begin result:=true; end else begin result:=false; end; end; Procedure Narisovat;//зарисовываем параболу по уже найденным коэффициентам var x1, x2, xn, yx: integer; begin x1:=xx[s-1]; x2:=xx[s]; Form1.Canvas.MoveTo(xx[s-1],yy[s-1]); if x2>x1 then begin for xn:=x1 to x2 do begin yx:=round((ac[s]*xn*xn)+(bc[s]*xn)+cc[s]); Form1.Canvas.LineTo(xn,yx); end; end; if x1>x2 then begin for xn:=x1 downto x2 do begin yx:=round((ac[s]*xn*xn)+(bc[s]*xn)+cc[s]); Form1.Canvas.LineTo(xn,yx); end; end; end; Procedure SSolve; //находим коэффициенты уравнения var x1, x2, y1, y2: real; K2: extended; begin x1:=xx[s-1]; x2:=xx[s]; y1:=yy[s-1]; y2:=yy[s]; СЛАУ // x1^2 x1 1 | y1 // x2^2 x2 1 | y2 // 2*x1 1 0 | K if s = 2 then K2:=1; if s > 2 then begin if check = true then begin K2:=-(2*ac[s-1]*x1+bc[s-1]); Вот тут end else begin K2:=2*ac[s-1]*x1+bc[s-1]; end; end; ac[s]:=((K2*(x2-x1)+(y1-y2))/(2*x1*x2-x1*x1-x2*x2)); bc[s]:=(K2-2*ac[s]*x1); cc[s]:=(y2-ac[s]*x2*x2-x2*(K2-2*ac[s]*x1)); Narisovat; end; procedure TForm1.onclick(Sender: TObject; Button: TMouseButton;//начало проги идет отсюда Shift: TShiftState; X, Y: Integer); begin inc(s); Form1.canvas.pen.color:=clBlack; Form1.Canvas.Ellipse(x-3, y-3, x+3, y+3); setlength(xx,s+1); setlength(yy,s+1); setlength(ac,s+1); setlength(bc,s+1); setlength(cc,s+1); xx[s]:=X; yy[s]:=Y; if s >= 2 then begin if (xx[s]<>xx[s-1]) or (yy[s]<>yy[s-1]) then begin if (abs(xx[s]-xx[s-1])<2) then begin Form1.Canvas.MoveTo(xx[s-1],yy[s-1]); Form1.Canvas.LineTo(xx[s],yy[s]); end else begin SSolve; end; end; end; end; Программа строит параболы через квадратичные уравнения, коэффициенты для уравнения находятся через СЛАУ(но я в программе выразил эти коэффициенты вручную, так проще и в плане кода и программы вообще), в качестве связывающего звена между параболами идут уравнения касательной. залил картинку "прога.jpg" - в ней видно что сначала программа рисует все нормально, но как только новая точка(x3) стала левее(до этого все новые точки были правее старых), так есть изменила направление - сплайн вышел корявый, не правильный, стрелками показано какой был сплайн без минуса в месте, где в коде написано большими буквами "вот тут", ну и с плюсом. В идеале надо чтобы нарисовалась парабола вроде как фиолетовой на картинке. Но такую фиолетовую параболу невозможно воспроизвести через простые y=a*x^2+b*x+c, так как часть фиолетовой параболы находится правее точки X2(так есть в уравнение по два раза будут подставляться некоторые значения X - а уравнение должно выдавать разные Y). Преподавателем было намекнуто в таком случае рисовать через систему X(t)=a*t^2+b*t+c Y(t)=n*t^2+m*t+h но формулу для нахождения коэффициентов таких параметрически заданных парабол я нашел только как на картинке, но нам не хватает значении одной касательной. В общем - как быть? Последний раз редактировалось HotDogich, 27.05.2011 в 19:29. |
#2
|
|||
|
|||
![]() Ладно, спасибо всем кто думал прочитать всё это и возможно попытаться мне решить - но мы с преподом решили что я сделаю сплайны на основе кривых Безье.
|