我正在使用Lazarus,因为我非常喜欢TChart
组件。我已经制定了一个解决一些不等式的程序,如:
(Delta =判别式)2x ^ 2 + 6x + 4> 0的解是x<-2
和x>-1
。这是正确的,但正如您所看到的,我在下面有一个TPicture
组件,显示带有图表的图片。我用Gimp做到了。
我想使用一些适当的组件制作图表。正如我已经说过的那样,我在Lazarus上找到了它们,但是你知道Delphi XE5上是否有任何方法呢?我在哪里可以看看?
答案 0 :(得分:9)
首先,你的设置符号很奇怪。你的意思是S =( - ∞,-2)∪(-1,∞),即S是两个开放区间的并集。您还可以写S = [ - 2,-1] ^ C或S = {x∈ℝ:x&lt; -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;