우선은 점 두개를 에디트 박스로 받으면
그래프를 그리는거에요
여기까지는 했는데 제가 캔버스 크기를 가로200 높이200으로 하고
그 안에 엑스축 와이축을 그린 후
그래프를 그리는데요 여기서 문제가 range를 써서
아무리 큰값이라도 이 200*200 화면안에 나타나게 하려고 하는데
도저히 안돼네요 좀 도와주세요
초보라 이주일째 이거만 하고 있어요
unit uhw;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Button1: TButton;
Edit6: TEdit;
Button2: TButton;
PaintBox: TPaintBox;
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button2Click(Sender: TObject);
procedure Edit6KeyPress(Sender: TObject; var Key: Char);
procedure Edit1Change(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
x1,y1,x2,y2,x3,y3:real;
begin
x1:=strtofloat(edit1.text);
x2:=strtofloat(edit3.text);
try
if x2=x1 then
begin
showmessage('일차 함수로 표현할 수 없습니다.')
end
else
begin
x1:=strtofloat(edit1.text);
y1:=strtofloat(edit2.text);
x2:=strtofloat(edit3.text);
y2:=strtofloat(edit4.text);
x3:=strtofloat(edit5.text);
y3:=(y2-y1)/(x2-x1)*x3+y1-(y2-y1)/(x2-x1)*x1;
edit6.text:=floattostr(y3);
end
except
on E : Exception do
ShowMessage('값을 입력하셔야 합니다.');
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not ( Key in [ '0'..'9','-','.', #8, #127, #44 ] ) then
Key := #0;
end;
procedure TForm1.Button2Click(Sender: TObject);
const
EPSILON : Single = 0;
var
x1,y1,x2,y2:real;
x,y,r:single;
i,j,rangeX,rangeY:integer;
begin
x1:=strtofloat(edit1.text);
y1:=strtofloat(edit2.text);
x2:=strtofloat(edit3.text);
y2:=strtofloat(edit4.text);
rangeX:= trunc((x1+x2)/2);
rangeY:= trunc((y1+y2)/2);
if x2=x1 then
begin
showmessage('일차 함수로 표현할 수 없습니다.')
end
else
for i:= 0 to rangeX do
for j:= 0 to rangeY do
begin
x := (i - (rangeX)/2) ;
y := (j - (rangeY)/2) ;
r :=(y2-y1)/(x2-x1)*x+y1-(y2-y1)/(x2-x1)*x1-y;
if r = EPSILON then
begin
paintbox.Canvas.pixels[i,200-j]:= clblack;
paintbox.canvas.moveto(100,0);
paintbox.canvas.lineto(100,200);
paintbox.canvas.moveto(0,100);
paintbox.canvas.lineto(200,100)
end
else
paintbox.Canvas.pixels[i, 200-j] := clWhite;
end;
end;
procedure TForm1.Edit6KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in [ #13, #8]) then Key := #0;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
if StrToIntDef(TEdit(Sender).Text, High(Integer)) = High(Integer) then
ShowMessage('숫자를 입력하세요')
else
Button1.Enabled := True;
end;
end.
좌표값을 스케일링하세요.
가령 X축 최대값이 700이라면 스케일링된 X1의 값은 X1 / 700 * 200 이 되겠죠...
^^ 항상 즐코하세요...