유

bresenham 알고리즘을 이용한 직선, 원, 타원 그리기

· 2010-08-27 (금) 18:44:05 · 4123

http://blog.hansune.com/95

여기 참고 해서 php용으로 만들었습니다.

그런데 결과물은 php내장함수와 거의 똑같네요.
좀 다를 줄 알았는데......

php 내장함수를 사용하지 않고 원이나 타원 직선을 그릴수 있는 정도에 만족해야 할듯합니다.

알고리즘에 대한 설명은 없습니다.

test.php
-----------------------------------------------------------------------------------------------------------------------------
<?php

//직선 그리기
function imageline_bresenham(& $im, $startX, $startY, $endX, $endY, $color){

  //기준점 계산, 작은 쪽이 출발점, 큰쪽이 도착점
  if($endX < $startX){

    $dx = $startX - $endX;
    $tmpX = $endX;
    $tmpgoX = $startX; 
  }
  else{

    $dx = $endX - $startX;
    $tmpX = $startX;
    $tmpgoX = $endX;
  }

  if($endY < $startY){

    $dy = $startY - $endY;
    $tmpY = $endY;
    $tmpgoY = $startY;
  }
  else{

    $dy = $endY - $startY;
    $tmpY = $startY;
    $tmpgoY = $endY;
  }


  /* 기울기에 따른 계산*/

  if($dx >= $dy) { //기울기가 1보다 작거나 같을때

    $d = $dy * 2 - $dx;        //d의 값을 초기화
    $incrE = $dy * 2;         // E로의 이동을 위해서 쓰이는 증가
    $incrNE = ($dy - $dx) * 2;   // NE로의 이동을 위해서 쓰이는 증가
    $start = $tmpX;
    $end = $tmpgoX;
  }
  else { //기울기가 1보다 클때

    $d = $dx * 2 - $dy;
    $incrE = $dx * 2;
    $incrNE = ($dx - $dy) * 2;
    $start = $tmpY;
    $end = $tmpgoY;
  }

  //x, y 좌표 초기화
  $x = $startX;
  $y = $startY;

  imagesetpixel($im, $x, $y, $color);//시작점 찍음

  while($start < $end) {

    if( $d <= 0) { /*D값이 0보다 작으면 E를 선택 하나의 축만 이동*/

      $d += $incrE;
      if($dx >= $dy) { // 기울기가 1보다 작을때 X좌표만 증가

        if($endX < $startX)
          $x--;
        else
          $x++;
      }
      else {         // 기울기가 1보다 클때 Y좌표만 증가

        if($endY < $startY)
          $y--;
        else
          $y++;
      }
    }
    else {     /*D값이 0보다 클때 NE를 선택 X,Y 를 같이 이동시킨다.*/

      $d += $incrNE;
      if($endX < $startX)
        $x--;
      else
        $x++;

      if($endY < $startY)
        $y--;
      else
        $y++;
    }

    imagesetpixel($im, $x, $y, $color);
    $start ++;
  }
}

 

function imagearc_bresenham(& $im, $centerX, $centerY, $width, $height, $color) {

  $w_r = ceil($width / 2);
  $h_r = ceil($height / 2);
  $x = 0;
  $y = $h_r;
  $w_r_square  = $w_r * $w_r;
  $h_r_square  = $h_r * $h_r;

  $d = (4 * $h_r_square  + $w_r_square  * (1 - (4 * $h_r))) / 4;

  imagesetpixel($im, $x + $centerX, $y + $centerY, $color);
  imagesetpixel($im, $centerX - $x, $y + $centerY, $color);
  imagesetpixel($im, $x + $centerX, $centerY - $y , $color);
  imagesetpixel($im, $centerX - $x, $centerY - $y, $color);

 

  // $x 독립변수 구간
  while($h_r_square  * $x < $w_r_square  * $y){

    ++$x;

    if($d < 0){

      $d += $h_r_square  * (2 * $x + 1);
    }
    else {

      --$y;

      $d += $h_r_square  * (2 * $x + 1) - (2 * $w_r_square  * $y);
    }

    imagesetpixel($im, $x + $centerX, $y + $centerY, $color);
    imagesetpixel($im, $centerX - $x, $y + $centerY, $color);
    imagesetpixel($im, $x + $centerX, $centerY - $y, $color);
    imagesetpixel($im, $centerX - $x, $centerY - $y, $color);
  }

 

  // $y 독립변수 구간
  $x = $w_r;

  $y = 0;

  $d = (4 * $w_r_square  + $h_r_square  * (1 - (4 * $w_r))) / 4;

  imagesetpixel($im, $x + $centerX, $y + $centerY, $color);
  imagesetpixel($im, $centerX - $x, $y + $centerY, $color);
  imagesetpixel($im, $x + $centerX, $centerY - $y, $color);
  imagesetpixel($im, $centerX - $x, $centerY - $y, $color);

 

  while($h_r_square  * $x > $w_r_square  * $y){

    ++$y;

    if($d < 0){

      $d += $w_r_square  * (2 * $y + 1);

    }
    else {

      --$x;

      $d += $w_r_square  * (2 * $y + 1) - (2 * $h_r_square  * $x);
    }

 

    imagesetpixel($im, $x + $centerX, $y + $centerY, $color);
    imagesetpixel($im, $centerX - $x, $y + $centerY, $color);
    imagesetpixel($im, $x + $centerX, $centerY - $y, $color);
    imagesetpixel($im, $centerX - $x, $centerY - $y, $color);
  }
}

 

$w = 400;
$h = 800;

$im = imagecreatetruecolor($w, $h);
$red = imagecolorallocate($im, 255, 0, 0);

 


imageline_bresenham($im, 200, 200, 100, 0, $red);
imageline_bresenham($im, 200, 200, 400, 100, $red);
imageline_bresenham($im, 200, 200, 400, 200, $red);
imageline_bresenham($im, 200, 200, 400, 300, $red);
imagearc_bresenham($im, 200, 200, 180, 360, $red);
imagearc_bresenham($im, 100, 200, 200, 200, $red);

imageline($im, 200, 600, 100, 400, $red);
imageline($im, 200, 600, 400, 500, $red);
imageline($im, 200, 600, 400, 600, $red);
imageline($im, 200, 600, 400, 700, $red);
imagearc($im, 200, 600, 180, 360, 0, 360, $red);
imagearc($im, 100, 600, 200, 200, 0, 360, $red);

header('Content-Type: image/png');
imagepng($im);

?>
샘플 : http://apmusers.com/php_arc.php

[이 게시물은 관리자님에 의해 2011-10-31 17:16:08 PHP & HTML에서 이동 됨]
|
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
12-08-29 조회 4,165
12-08-07 조회 3,826
12-08-03 조회 3,643
12-07-31 조회 3,748
12-07-30 조회 3,700
12-07-16 조회 3,895
12-07-15 조회 3,731
12-07-07 조회 3,591
12-07-06 조회 3,801
12-07-03 조회 3,753
12-06-29 조회 3,366
12-06-22 조회 3,738
12-06-17 조회 3,997
12-05-21 조회 3,921
12-05-02 조회 3,446
12-05-02 조회 4,241
12-05-02 조회 3,365
12-04-30 조회 3,562
12-04-30 조회 3,241
12-03-17 조회 4,104
12-03-10 조회 3,436
12-03-08 조회 3,961
12-03-03 조회 3,677
12-02-27 조회 5,091
12-02-17 조회 4,386
12-02-16 조회 4,667
12-02-03 조회 3,334
12-01-31 조회 3,243
12-01-24 조회 3,241
12-01-17 조회 3,942
12-01-05 조회 3,489
11-12-30 조회 3,220
11-12-23 조회 4,776
11-12-08 조회 3,540
11-12-07 조회 4,503
11-11-27 조회 3,926
11-11-25 조회 4,254
11-11-23 조회 3,703
11-11-22 조회 3,559
11-11-09 조회 3,267
11-10-23 조회 3,209
11-10-19 조회 3,159
11-10-08 조회 2,843
11-10-04 조회 2,843
11-10-04 조회 5,306
11-09-01 조회 4,378
11-08-13 조회 2,559
11-08-06 조회 3,238
11-07-11 조회 3,637
11-06-27 조회 2,993
11-06-21 조회 2,657
11-06-13 조회 2,470
11-06-07 조회 2,477
11-05-26 조회 2,434
11-04-20 조회 2,761
11-03-21 조회 2,863
11-03-18 조회 2,557
11-03-11 조회 2,572
11-02-07 조회 2,402
11-01-18 조회 2,724
11-01-12 조회 2,444
11-01-06 조회 2,534
10-12-10 조회 2,799
10-12-09 조회 2,651
10-12-08 조회 5,081
10-11-29 조회 2,912
10-11-28 조회 2,823
10-11-28 조회 2,656
10-11-19 조회 2,846
10-11-04 조회 2,719
10-10-21 조회 2,443
10-10-19 조회 3,408
10-10-12 조회 2,731
10-10-07 조회 2,557
10-09-30 조회 3,519
10-09-17 조회 3,932
10-09-17 조회 3,874
10-05-31 조회 3,584
09-12-31 조회 3,719
09-07-23 조회 5,043
08-09-16 조회 3,247
08-09-06 조회 2,988
08-09-04 조회 3,408
08-08-16 조회 4,439
08-08-15 조회 3,311
08-08-14 조회 4,526
08-08-12 조회 3,993
08-07-23 조회 2,811
08-07-10 조회 3,762
08-07-04 조회 2,988
08-06-27 조회 7,628
08-06-19 조회 4,938
08-05-27 조회 5,541
08-05-25 조회 5,376
08-05-23 조회 3,452
08-05-23 조회 4,618
08-05-21 조회 4,970
08-05-20 조회 4,083
08-05-20 조회 3,311
08-04-18 조회 4,379