【问题标题】:How to draw a parabola如何画抛物线
【发布时间】:2013-10-21 12:08:39
【问题描述】:

我使用 Lazarus 是因为我非常喜欢 TChart 组件。我编写了一个程序来解决一些不等式,例如:

(Delta = Discriminant) 2x^2+6x+4>0 的解是x<-2x>-1。这是正确的,但正如您所见,我在下面有一个TPicture 组件,它显示了一张带有图表的图片。我是用 Gimp 做的。

我想使用一些合适的组件制作图表。正如我已经说过的,我在 Lazarus 上找到了它们,但是您知道 Delphi XE5 上是否也有任何方法吗?哪里可以看?

【问题讨论】:

  • 你的设置符号很奇怪。你的意思是 S = (−∞, −2) ∪ (−1, ∞),也就是说,S 是两个开区间的并集。你也可以写成 S = [−2, −1]^C 或 S = {x ∈ ℝ: x −1}。另外,您的图片肯定不是抛物线;它看起来更像双曲线。
  • 您可以在 TImage 感兴趣的区间内绘制曲线,并使用它而不是手绘图片......还是我误解了什么?
  • 刚刚检查了Delphi XE5 feature matrix;它包含 TeeChart Standard,因此 Delphi XE5 中提供了 TChart 组件(如果您愿意的话)。
  • 由于 Lazarus 的成本低于 XE5 的任何部分,我认为这不是一个选择。

标签: delphi lazarus


【解决方案1】:

首先,你的集合符号很奇怪。您的意思是 S = (−∞, −2) ∪ (−1, ∞),即 S 是两个开区间的并集。您也可以写成 S = [−2, −1]^C 或 S = {x ∈ ℝ: x −1}。另外,您的图片肯定不是抛物线;它看起来更像双曲线。

无论如何,绘制函数图 f: ℝ → ℝ 很简单。您只需要处理逻辑坐标系和屏幕坐标系之间的坐标转换。定义

type
  TRealVector = record
    X, Y: real;
  end;

作为 ℝ² 中的一个点,您的地图是

const
  xmin = -10;
  xmax = 10;
  ymin = -10;
  ymax = 10;

function TForm5.LogToScreen(LogPoint: TRealVector): TPoint;
begin
  result.X := round(ClientWidth * (LogPoint.X - xmin) / (xmax - xmin));
  result.Y := ClientHeight - round(ClientHeight * (LogPoint.Y - ymin) / (ymax - ymin));
end;

function TForm5.ScreenToLog(ScreenPoint: TPoint): TRealVector;
begin
  result.X := xmin + (ScreenPoint.X / ClientWidth) * (xmax - xmin);
  result.Y := ymin + (ymax - ymin) * (ClientHeight - ScreenPoint.Y) / ClientHeight;
end;

那么你只需要绘制!

procedure TForm5.FormPaint(Sender: TObject);
var
  PrevPoint, CurrPoint: TPoint;
  x: integer;
  logx: real;
  logy: real;
  y: integer;
begin
  PrevPoint := Point(-1, -1);
  Canvas.Brush.Color := clWhite;
  Canvas.FillRect(ClientRect);
  for x := 0 to ClientWidth - 1 do
  begin
    logx := ScreenToLog(Point(x, 0)).X;
    logy := logx*logx; // y = f(x)
    y := LogToScreen(RealVector(logx, logy)).Y;
    CurrPoint := Point(x, y);
    if PrevPoint.X = -1 then
      Canvas.MoveTo(CurrPoint.X, CurrPoint.Y)
    else
      Canvas.LineTo(CurrPoint.X, CurrPoint.Y);
    PrevPoint := CurrPoint;
  end;
end;

别忘了:

procedure TForm5.FormResize(Sender: TObject);
begin
  Invalidate;
end;


(来源:rejbrand.se

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-21
    • 2011-07-02
    • 2018-09-13
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多