Q&A

  • 한번만 알려주세요 그래프에 관한건데요
우선은 점 두개를 에디트 박스로 받으면

그래프를 그리는거에요

여기까지는 했는데 제가 캔버스 크기를 가로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.

1  COMMENTS
  • Profile
    최용일 2004.07.23 00:31
    안녕하세요. 최용일입니다.

    좌표값을 스케일링하세요.

    가령 X축 최대값이 700이라면 스케일링된 X1의 값은 X1 / 700 * 200 이 되겠죠...

    ^^ 항상 즐코하세요...