Q&A

  • 이차함수 그래프를 그리고 싶은데요.......
이차함수 (ex y=2*(x*x))와 같은 함수의 그래프를
그릴려고 하는데요
어떻게 해야하나요?
델파이를 이제 막 시작한 풋내기라 잘모르겠습니다.
제발 가르쳐 주세요.
감사함니다.
1  COMMENTS
  • Profile
    김지엽 2003.01.14 19:35
    정말 초보시라서 아무것도 모른다는 전제 하에 설명 함 드려볼께요.
    언젠가는 정말 아무것도 모르는 분이 볼 수도 있을거 같아서..
    -------------------------------
    중요한 것은, 이것이 이차함수라는 자체가 아니라 이차함수의 그래프를 '어떻게' 그리려고 하는가 입니다.

    우선은 함수에 등장하는 변수들이 지정되어 있어야 할 것이고..
    그것을 어떤 방식으로 그래픽 공간에 사상(mapping) 할지를 생각해 봐야 하겠지요. 이런 경우에라면 단지 y 변수는 세로 좌표(역방향), x변수는 가로 좌표(정방향)에 놓으면 된다고 볼 수도 있겠지만, 그래프를 통해서 어떤 모습을 보여주고자 하는가에 의해서, 이런 매핑 방법은 바뀔 수 있을 겁니다.

    가장 간단하게, TImage 콘트롤을 하나 폼에 올려놓으시고, 그 크기를 원하시는 대로 (아마도 크기를 100 단위 정도로 끊어 잡으시는게 나중에 화면 계산하기 편할 겁니다.) 조정 한 후에 그 아래에 버튼 놓으시고 더블클릭 하여 버튼 더블클릭 이벤트 프로시져를 만듭니다. 여기에 루프문을 구현해 봅니다.

    이 이벤트에서는, 전역변수로 지정한 X, Y의 값을 루프문으로 돌리는게 가장 주요한 요지일 것입니다.

    for ... to .. do begin
    y = 2 * X^2
    end;

    이 함수의 개형을 잘 살펴 보면 X에 대한 선형함수이므로 X를 일정한 공번역(Domain)내에서 변화시키면서 Y값을 계산하여 뿌려주면 되겠죠.

    또, 변수 x,y에서의 1의 변화가 화면에서는 픽셀 몇 개의 변화를 의미하면 적절할까 한번 생각해 보구요.  여기서는, X = -10 ~ 10 구간의 그래프를 200*200사이즈의 TImage 에 뿌려준다고 가정해 봅시다.
    그러면 실제 X의 구간은 20인데 그래프 구간은 200픽셀. 그러니깐, 1 픽셀의 변화는 0.1 X의 변화라고 볼 수 있겠죠.
    따라서 실제 픽셀값의 계산을 위해서는, 0.1 X 마다 함수를 돌려 계산 해주면 되겠죠. 그 담에 y값의 변역을 생각해 봅니다. x가 -10,10일 때의 y값은 200이겠군요. 그리고 x가 0일 때 0이니까.. y는 0..200 사이에 나타날 것입니다.
    좌표가 200이니까 그대로 표시해 줘도 무방하겠지만, 이렇게 되면 그래프가 왜곡되어서 나타날 것입니다. (X축 방향으로 잡아 늘인 모양으로 왜곡) Y좌표축을 따라서 이미지 길이를 늘려줘도 무방하고, 그냥 이렇게 표현해도 무방할 것입니다.

    var
    pxlx : integer;
    pxly : integer;
    begin
      with Image1 do begin
        for pxlx := -100 to 100 do begin
          pxly := (2*pxlx^2);
         (* 우리가 산술적으로 상상하는 y축 증가방향과
             화면에서의 비트맵 상하 증가 방향은 서로 반대이므로..
            [y축 최대값] - [y축 값] 하여 그래프를 역전시켜준다.
            또, x축에 대해서는 -100 ~100 구간을 0~200 구간에
            매핑시키기 위하여 100 만큼 shift 시켜준다.               *)
          bitmap.canvas.Pixels(100 + pxlx, 200 - pxly) := clblack;
        end;
      end;
    end;

    이렇게 하면 일단 그래프는 그려질겁니다만.. 사실 이 외에 생각해 봐야 할 문제가 많습니다.

    예를 들어, 실행시 입력된 X구간이나 Y구간에 대해 그래프를 그려야 한다면.. 이런 경우에는 따로 계산함수가 구현된 function을 만들고, 구간값에 대하여 어떤 비율로 그래픽을 수행할 것인지를 계산하는 function, 그리고 전체적으로 그래프를 그려주는 procedure을 구현해 주는 편이 좋을 것입니다.

    또, 만약 X,Y비율 문제로, 찍고자 하는 그래프의 픽셀값이 예정된 비트맵 공간을 벗어날때는 어떻게 할 것인가. 이 문제도 생각해 봐야 하겠죠. 이 문제의 해답은 어떤 목적으로 어떻게 그래프를 찍으려 하는가에 따라서 틀릴겁니다.

    대개의 실용적(?)인 프로그램에 있어서는, 화면 비율과 값 대역이 일단 정해지고 나면 틀어지는 일은 거의 없을 것입니다. 만약 수학 프로그램을 구성한다면, 단지 이러한 문제 뿐만이 아니라 비선형함수를 어떻게 구현할 것인가 라는 문제도 주어지겠네요.

    비선형함수에 대해서는 시중에 '수치해석'이라는 이름으로 나와있는 책들을 보면 어떻게 구현하는지 자세하게 설명하고 있을 겁니다. 대개는 C나 비쥬얼베이직 같은걸로 구현하고 있겠지만, 델파이로 구현하는 것도 그리 어렵지 않습니다. 아니, 사실 델파이로 구현하는 것이 로직 측면에서는 훨씬 쉽습니다.

    걍.. 어차피 아무도 답변 안하실거 같아서 올려봤습니다.
    그리고 뒤져보진 않았지만, 과거 게시판을 보면 이 부분에 대한 답변이 어디엔가는 또 있을 듯도 합니다.
    그럼.