关于绘制图形数据的最佳实践

Best practice regarding plotting graph data

希望这是清楚的...

我想知道 PaintBox 控件是否允许用户从左到右滚动数据?想象它就像一个示波器显示器,其中一次捕获允许缩放和滚动。在这种情况下,我不需要缩放。所以,我的 Paintbox 是 800x600,我的数据集是 16000x600。

我可以在 800x600 区域绘制,如下所示,完全没有问题,并且可以应用缩放来获取所有数据,但我想保持 Y 轴缩放为 1 并且能够 scroll/drag left/right 并查看数据。

    for J := 1 to ((Form1.Memo1.Lines.count)-1) do
    begin
      MyTorques[J] := StrToInt(Form1.Memo1.Lines[J]);
      Tqmult := ((StrToInt(Label6.Caption) + 500) Div 600);
      Ycalc[J] := ((MyTorques[J]) Div Tqmult);
      InvY[J] := (600 - (Ycalc[J]));
      X1 := (J-1);
      Y1 := InvY[J-1];
      X2 := (J);
      Y2 := InvY[J];
        with PaintBox1.Canvas do
        begin
          pen.Style := psSolid;
          pen.Color := clBlack;
          pen.Width := 1;
          moveto(X1, Y1);
          Lineto(X2, Y2);
          Label51.Caption := IntToStr(X1);
          Label52.Caption := IntToStr(Y1);
          Label28.Caption := IntToStr(X2);
          Label29.Caption := IntToStr(Y2);
          Label35.Caption := IntToStr(Tqmult);
          Label37.Caption := IntToStr(Ycalc[J]);
          Label39.Caption := IntToStr(InvY[J]);
          Label41.Caption := IntToStr(MyTorques[J]);
        end;
      if MyTorques[J] < Smallest Then
      Begin
        Smallest := MyTorques[J];
        SmallestIndex := J;
      end;
      if MyTorques[J] > Largest Then
      begin
        Largest := MyTorques[J];
        LargestIndex := J;
      end;
      Label30.Caption := IntToStr(Smallest);
      Label31.Caption := IntToStr(SmallestIndex);
      Label32.Caption := IntToStr(Largest);
      Label33.Caption := IntToStr(LargestIndex);
    end;

那么,我的 paintbox.canvas 是否需要将尺寸设为 16000x600,并在顶部尺寸 800x600 之上 "window",并且绘画框控件可拖动并具有垂直和水平约束?

默认情况下,PaintBox 没有任何内置的滚动支持。

因此,如果您想具有滚动功能,则必须将您的 PaintBox 放入其他一些可滚动控件(如 ScrollBox)中,并将您的 PaintBox 的大小设置得足够大以包含整个绘图的渲染。

但这是一种不好的做法。为什么?这样做你将花费大量时间绘制你的情节,即使用户一次只能看到其中的一部分。

相反,您应该考虑只绘制您的用户在 sima 时间(适合 PaintBox)实际可见的部分,然后当用户滚动到图上的不同位置时重新绘制图。