2

コンポーネントが本当に好きなので、Lazarus を使用していTChartます。次のような不等式を解決するプログラムを作成しました。

http://img692.imageshack.us/img692/5659/esl6.png

(デルタ = 判別式) 2x^2+6x+4>0 の解はx<-2x>-1です。これは正しいですが、ご覧のTPictureとおり、下にチャート付きの画像を表示するコンポーネントがあります。Gimpで作りました。

いくつかの適切なコンポーネントを使用してグラフを作成したいと思います。すでに述べたように、Lazarus でそれらを見つけましたが、Delphi XE5 でも何か方法があるかどうか知っていますか? どこを見ればいいですか?

4

1 に答える 1

9

まず、あなたのセット表記は非常に奇妙です。つまり、S = (−∞, −2) ∪ (−1, ∞)、つまり、S は 2 つの開区間の和集合です。S = [−2, −1]^C または S = {x ∈ ℝ: x < −2 または 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 )

于 2013-10-21T12:41:27.450 に答える