⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.~pas

📁 插值计算--计算方法_delphi.rar 计算方法课程上机作业
💻 ~PAS
📖 第 1 页 / 共 2 页
字号:
  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 + -