И так, у меня курсовая называется "интерполяция полиномами второго порядка графически заданных функции"
Вот что есть в коде
Код:
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
но формулу для нахождения коэффициентов таких параметрически заданных парабол я нашел только как на картинке, но нам не хватает значении одной касательной.
В общем - как быть?