ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2D 직선 그리는 방법
    3D Graphics/Software Rendering 2007. 3. 26. 15:50
    728x90

    두점 (x1,y1), (x2,y2)를 잇는 직선을 그릴때 다음과 같은 방법을 사용합니다.

    첫번째로 간단하게 직선의 기울기를 이용해 그리는 방법입니다.

    직선의 기울기는 (y2-y1) / float(x2-x1)으로 구합니다. 이때 분모가 음수가 되면 안되기에

    x1과 x2를 비교해서 큰값이 x2에 들어가도록 스왑해야 합니다..

    이런게 저장한 기울기를 저장하고...
     
    int gradient = (y2-y1) / float(x2-x1);

    x값이 1증가할때 y값을 구해서 그려나가면 됩니다.

    int i, y;

    y = y1;
    for (i=x1; i< x2; i++)
    {
       y+=gradient*i;
       PutPixel(i,y,color); //화면에 점을 찍는 함수.
    }

    다음은 완성되 라인 함수입니다. 클리핑 처리는 하지 않았네요.

    void Line(int x1, int y1, int x2, int y2, BYTE color)
    {
       int i,temp,y;
       float gradient;

       if (x2 > x1)
       {
          temp = x1;
          x1 = x2;
          x2 = temp;

          temp = y1;
          y1 = y2;
          y2 = temp;
       }

     gradient = (float)((y2-y1) / float(x2-x1));
     
       for (i=x1; i< x2; i++)
      {
          y+=gradient*i;
          PutPixel(i,y,color);
      }
    }

    위 방법에는 문제점이 있는데 실수를 정수형으로 변환하는데는 생각보다 많은 연산이
     
    일어난다는 겁니다. 이걸 조금더 개선한 나머지를 이용한 알고리즘이 있습니다.

       for (i=x1; i< x2; i++)
      {
          y += y%i;
          PutPixel(i,y,color);
      }

    실수 연산대신 정수의 나머지 연산를 사용하게 보이시죠?? 이렇게하면 상당히 속도를 개선시

    킬수가 있습니다~^^

    그외에도 정수 연산만으로 직선을 그리기위해 브로즈넴 알고리즘과 중점(Mid point)알고리즘

    이라는게 있습니다. 이에 대해서는 시간이 되는데로 다시 다루도록 할께요~^^

    댓글

Designed by black7375.