まず、あなたのセット表記は非常に奇妙です。つまり、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 )