📄 unit1.~pas
字号:
y_df := N - 1; //Y坐标等分单元格数
unit_x_range := xw / x_df; //X坐标等分单元格长度
unit_y_range := yh / y_df; //Y坐标等分单元格长度
//画出X,Y坐标轴上的"|"
self.PaintBox1.Canvas.Pen.Color := clWhite;
i_height := 10; //"|"的高度
co_margin := 10; //底边标注与X坐标的距离
self.PaintBox1.Canvas.MoveTo(x0, y0);
for j := 1 to N - 1 do
begin
xi := Round(x0 + j * unit_x_range);
self.PaintBox1.Canvas.MoveTo(xi, y0);
Self.PaintBox1.Canvas.LineTo(xi, y0 - i_height); //画下边
self.PaintBox1.Canvas.MoveTo(xi, margin);
Self.PaintBox1.Canvas.LineTo(xi, margin + i_height); //画上边
end;
for j := 1 to N - 1 do
begin
yi := Round(y0 - j * unit_y_range);
self.PaintBox1.Canvas.MoveTo(x0, yi);
Self.PaintBox1.Canvas.LineTo(x0 + i_height, yi); //画左边
self.PaintBox1.Canvas.MoveTo(x0 + xw, yi);
Self.PaintBox1.Canvas.LineTo(x0 + xw - i_height, yi); //画右边
end;
//画出X数组的值在坐标下面
self.PaintBox1.Canvas.Font.Color := clWhite;
self.PaintBox1.Canvas.Font.Size := 10;
for i := 1 to N + 1 do
begin
xi := Round(x0 + (i - 1) * unit_x_range);
t := X[1] + (i - 1) * X_range / x_df;
x_string := floattostr(t);
x_string_width := self.PaintBox1.Canvas.TextWidth(x_string);
self.PaintBox1.Canvas.TextOut(xi - Trunc(x_string_width / 2), y0 +
co_margin, x_string);
end;
//画出Y轴的坐标
for j := 1 to N + 1 do
begin
yi := Round(y0 - (j - 1) * unit_y_range);
t := min + (j - 1) * Y_range / y_df;
y_string := floattostr(t);
y_string_width := self.PaintBox1.Canvas.TextWidth(y_string);
y_string_height := self.PaintBox1.Canvas.TextHeight(y_string);
self.PaintBox1.Canvas.TextOut(x0 - co_margin - y_string_width, yi -
trunc(y_string_height / 2), y_string);
end;
end;
procedure TForm_main.PaintBox1Paint(Sender: TObject);
begin
// self.PaintFrame();
end;
procedure TForm_main.Button2Click(Sender: TObject);
var
i, j, x_df, y_df, xi, yi, i_height, co_margin: integer;
yh, xw : integer;
sw : integer;
margin, x0, y0 : integer;
dy, dx : double;
t, max, min, X_range, Y_range, unit_x_range, unit_y_range: double;
x_string_width, y_string_width, y_string_height: integer;
x_string, y_string: string;
flag, n_cj : integer;
//100等份 每个点的坐标
PX : array[1..PN + 1] of double;
PY : array[1..PN + 1] of double;
sx : double;
begin
// {
//--------------------------开始画边框------------------------------------------
Y_range := 0;
self.PaintBox1.Canvas.Pen.Color := clWhite;
margin := 50; //设置边距
yh := self.PaintBox1.Height - 2 * margin;
xw := self.PaintBox1.Width - 2 * margin;
x0 := margin;
y0 := margin + yh;
self.PaintBox1.Canvas.MoveTo(margin, margin); //画边框
self.PaintBox1.Canvas.LineTo(margin, yh + margin);
self.PaintBox1.Canvas.LineTo(xw + margin, yh + margin);
self.PaintBox1.Canvas.LineTo(xw + margin, margin);
self.PaintBox1.Canvas.LineTo(margin, margin);
X_range := X[N] - X[1]; //画坐标
max := Y[1];
min := Y[1];
for i := 2 to N do
begin
if Y[i] >= max then
max := Y[i];
if Y[i] <= min then
min := Y[i];
end;
Y_range := 0;
Y_range := max - min;
x_df := N - 1; //X坐标等分单元格数
y_df := N - 1; //Y坐标等分单元格数
unit_x_range := xw / x_df; //X坐标等分单元格长度
unit_y_range := yh / y_df; //Y坐标等分单元格长度
self.PaintBox1.Canvas.Pen.Color := clWhite; //画出X,Y坐标轴上的"|"
i_height := 10; //"|"的高度
co_margin := 10; //底边标注与X坐标的距离
self.PaintBox1.Canvas.MoveTo(x0, y0);
for j := 1 to N - 1 do
begin
xi := Round(x0 + j * unit_x_range);
self.PaintBox1.Canvas.MoveTo(xi, y0);
Self.PaintBox1.Canvas.LineTo(xi, y0 - i_height); //画下边
self.PaintBox1.Canvas.MoveTo(xi, margin);
Self.PaintBox1.Canvas.LineTo(xi, margin + i_height); //画上边
end;
for j := 1 to N - 1 do
begin
yi := Round(y0 - j * unit_y_range);
self.PaintBox1.Canvas.MoveTo(x0, yi);
Self.PaintBox1.Canvas.LineTo(x0 + i_height, yi); //画左边
self.PaintBox1.Canvas.MoveTo(x0 + xw, yi);
Self.PaintBox1.Canvas.LineTo(x0 + xw - i_height, yi); //画右边
end;
self.PaintBox1.Canvas.Font.Color := clWhite; //画出X数组的值在坐标下面
self.PaintBox1.Canvas.Font.Size := 10;
for i := 1 to N do
begin
xi := Round(x0 + (i - 1) * unit_x_range);
t := X[1] + (i - 1) * X_range / x_df;
x_string := floattostr(t);
x_string_width := self.PaintBox1.Canvas.TextWidth(x_string);
self.PaintBox1.Canvas.TextOut(xi - Trunc(x_string_width / 2), y0 +
co_margin, x_string);
end;
for j := 1 to N do //画出Y轴的坐标
begin
yi := Round(y0 - (j - 1) * unit_y_range);
t := min + (j - 1) * Y_range / y_df;
y_string := floattostr(t);
y_string_width := self.PaintBox1.Canvas.TextWidth(y_string);
y_string_height := self.PaintBox1.Canvas.TextHeight(y_string);
self.PaintBox1.Canvas.TextOut(x0 - co_margin - y_string_width, yi -
trunc(y_string_height / 2), y_string);
end;
//-------------------------------------画边框结束-------------------------------
//------------------------------计算插值----------------------------------------
if self.RadioButton1.Checked then
flag := 1;
if self.RadioButton2.Checked then
flag := 2;
if self.RadioButton3.Checked then
begin
//flag := 3;
showmessage('还没有完成!');
end;
if self.RadioButton4.Checked then
flag := 4;
n_cj := strtoint(self.Edit_num.Text); //次数
sx := (X[N] - X[1]) / PN; //PN等份后 ,每等份的值
for i := 1 to PN + 1 do //分成PN等分,共有PN+1个点
begin
PX[i] := X[1] + (i - 1) * sx;
case flag of
1: PY[i] := self.Lagrange(PX[i], n_cj + 1);
2: PY[i] := self.Newton(PX[i], n_cj + 1);
3: PY[i] := self.Split(PX[i]);
4: PY[i] := self.Cut_linear(PX[i]);
end;
end;
inc(paint_num); //每画一次改变颜色
//绘制插值曲线 @_@
case paint_num of
1: PaintBox1.Canvas.Pen.Color := clYellow;
2: PaintBox1.Canvas.Pen.Color := clGreen;
3: PaintBox1.Canvas.Pen.Color := clRed;
4: PaintBox1.Canvas.Pen.Color := clMaroon;
5: PaintBox1.Canvas.Pen.Color := clOlive;
6: PaintBox1.Canvas.Pen.Color := clNavy; //
7: PaintBox1.Canvas.Pen.Color := clPurple;
8: PaintBox1.Canvas.Pen.Color := clGray;
9: PaintBox1.Canvas.Pen.Color := clSilver;
10: PaintBox1.Canvas.Pen.Color := clWhite;
else
begin
PaintBox1.Canvas.Pen.Color := clBlack; //表示不再画出来
MessageDlg('已经画了10条,不能再画了!', mtInformation, [mbOk], 0);
exit;
end;
end;
// PaintBox1.Canvas.Pen.Color:=clYellow;
for j := 1 to PN do
begin
self.PaintBox1.Canvas.MoveTo(trunc(x0 + (PX[j] - X[1]) / X_range * xw),
trunc(y0 - (PY[j] - min) / (max - min) * yh));
self.PaintBox1.Canvas.LineTo(trunc(x0 + (PX[j + 1] - X[1]) / X_range * xw),
trunc(y0 - (PY[j + 1] - min) / (max - min) * yh));
end;
// }
end;
//----------------------------------------------------------------------------------------------------------
//------------坐标显示------------
procedure TForm_main.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; Xp,
Yp: Integer);
var
x0, y0, margin, xw, yh: integer;
C_X, C_Y, y_max, y_min: double;
i, j : integer;
begin
margin := 50;
xw := self.PaintBox1.Width - 2 * margin;
yh := self.PaintBox1.Height - 2 * margin;
x0 := margin;
y0 := yh + margin;
y_max := 0;
y_min := 0;
for i := 2 to N do
begin
if Y[i] >= y_max then
y_max := Y[i];
if Y[i] < y_min then
y_min := Y[i];
end;
// C_X := X[1] + (Xp - margin) / xw * (X[N] - X[1]);
// C_Y := y_min + (y0 - Yp) / yh * (y_max - y_min);
C_X := X[1] + (Xp - margin) / xw * (X[N] - X[1]);
C_Y := 0.037 + (y0 - Yp) / yh * (1 - 0.037);
// self.StatusBar1.Panels.Items[0].Text := 'X= ' + floattostr(C_X);
// self.StatusBar1.Panels.Items[1].Text := 'Y= ' + floattostr(C_Y);
self.StatusBar1.Panels.Items[0].Text := inttostr(xp) + ' ';
self.StatusBar1.Panels.Items[1].Text := inttostr(yp);
// 668 720
end;
procedure TForm_main.Button_resetClick(Sender: TObject);
begin
PaintBox1.Refresh; //清除图象
paint_num := 0; //线条数目清0
end;
procedure TForm_main.N1Click(Sender: TObject);
begin
//保存
end;
procedure TForm_main.N2Click(Sender: TObject);
begin
PaintBox1.Refresh; //清除图象
paint_num := 0; //线条数目清0
end;
procedure TForm_main.Button_testpicClick(Sender: TObject);
var
i, j, x_df, y_df, xi, yi, i_height, co_margin: integer;
yh, xw : integer;
sw : integer;
margin, x0, y0 : integer;
dy, dx : double;
t, max, min, X_range, Y_range, unit_x_range, unit_y_range: double;
x_string_width, y_string_width, y_string_height: integer;
x_string, y_string: string;
flag, n_cj : integer;
//100等份 每个点的坐标
PX : array[1..PN + 1] of double;
PY : array[1..PN + 1] of double;
sx : double;
tempy : real; //对Y的值进行处理
begin
//--------------------------开始计算数据------------------------------------------
memo1.Clear;
fun100(1.1, 2.2, 3);
//--------------------------开始画边框------------------------------------------
Y_range := 0;
self.PaintBox1.Canvas.Pen.Color := clWhite;
margin := 50; //设置边距
yh := self.PaintBox1.Height - 2 * margin;
xw := self.PaintBox1.Width - 2 * margin;
x0 := margin;
y0 := margin + yh;
self.PaintBox1.Canvas.MoveTo(margin, margin); //画边框
self.PaintBox1.Canvas.LineTo(margin, yh + margin);
self.PaintBox1.Canvas.LineTo(xw + margin, yh + margin);
self.PaintBox1.Canvas.LineTo(xw + margin, margin);
self.PaintBox1.Canvas.LineTo(margin, margin);
// X_range := X[N] - X[1]; //画坐标
X_range := 10; //画坐标
//max := Y[1];
// min := Y[1];
max := 1;
min := 0.03;
for i := 2 to N do
begin
if Y[i] >= max then
max := Y[i];
if Y[i] <= min then
min := Y[i];
end;
// max := 1;
// min := 0.03;
Y_range := 0;
Y_range := max - min;
x_df := N - 1; //X坐标等分单元格数
y_df := N - 1; //Y坐标等分单元格数
unit_x_range := xw / x_df; //X坐标等分单元格长度
unit_y_range := yh / y_df; //Y坐标等分单元格长度
self.PaintBox1.Canvas.Pen.Color := clWhite; //画出X,Y坐标轴上的"|"
i_height := 10; //"|"的高度
co_margin := 10; //底边标注与X坐标的距离
self.PaintBox1.Canvas.MoveTo(x0, y0);
for j := 1 to N - 1 do
begin
xi := Round(x0 + j * unit_x_range);
self.PaintBox1.Canvas.MoveTo(xi, y0);
Self.PaintBox1.Canvas.LineTo(xi, y0 - i_height); //画下边
self.PaintBox1.Canvas.MoveTo(xi, margin);
Self.PaintBox1.Canvas.LineTo(xi, margin + i_height); //画上边
end;
for j := 1 to N - 1 do
begin
yi := Round(y0 - j * unit_y_range);
self.PaintBox1.Canvas.MoveTo(x0, yi);
Self.PaintBox1.Canvas.LineTo(x0 + i_height, yi); //画左边
self.PaintBox1.Canvas.MoveTo(x0 + xw, yi);
Self.PaintBox1.Canvas.LineTo(x0 + xw - i_height, yi); //画右边
end;
self.PaintBox1.Canvas.Font.Color := clWhite; //画出X数组的值在坐标下面
self.PaintBox1.Canvas.Font.Size := 10;
for i := 1 to N do
begin
xi := Round(x0 + (i - 1) * unit_x_range);
t := X[1] + (i - 1) * X_range / x_df;
x_string := floattostr(t);
x_string_width := self.PaintBox1.Canvas.TextWidth(x_string);
self.PaintBox1.Canvas.TextOut(xi - Trunc(x_string_width / 2), y0 +
co_margin, x_string);
end;
for j := 1 to N do //画出Y轴的坐标
begin
yi := Round(y0 - (j - 1) * unit_y_range);
t := min + (j - 1) * Y_range / y_df;
y_string := floattostr(t);
y_string_width := self.PaintBox1.Canvas.TextWidth(y_string);
y_string_height := self.PaintBox1.Canvas.TextHeight(y_string);
self.PaintBox1.Canvas.TextOut(x0 - co_margin - y_string_width, yi -
trunc(y_string_height / 2), y_string);
end;
//-------------------------------------画边框结束-------------------------------
//------------------------------计算插值----------------------------------------
PaintBox1.Canvas.Pen.Color := clwhite; // clYellow; //
////////////////
max := 1;
min := 0.03;
////////////////
for j := 1 to 99 do
begin
// {原函数
PaintBox1.Canvas.MoveTo(trunc(x0 + (Points[j, 1] + 5) / X_range * xw),
trunc(y0 - (Points[j, 2] - min) / (max - min) * yh));
PaintBox1.Canvas.LineTo(trunc(x0 + (Points[j + 1, 1] + 5) / X_range * xw),
trunc(y0 - (Points[j + 1, 2] - min) / (max - min) * yh));
showmessage('hi');
// PaintBox1.Canvas.Refresh;
PaintBox1.Update;
//}
{
//插值计算
if Points[j, 3]<-1 then tempy:=0;
if Points[j, 3]>2 then tempy:=1;
PaintBox1.Canvas.MoveTo(trunc(x0 + (Points[j, 1] + 5) / X_range * xw),
trunc(y0 - (tempy - min) / (max - min) * yh));
PaintBox1.Canvas.LineTo(trunc(x0 + (Points[j + 1, 1] + 5) / X_range * xw),
trunc(y0 - (tempy - min) / (max - min) * yh));
}
end;
memo1.Lines.LoadFromFile('func1.txt');
end;
procedure TForm_main.FormResize(Sender: TObject);
begin
// self.Button_testpic.Click;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -