천

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

· 2015-11-30 (월) 00:17:06 · 2995

<?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);
 
?> 

|
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
15-12-13 조회 2,524
15-12-13 조회 2,935
15-12-11 조회 2,596
15-12-11 조회 2,559
15-12-11 조회 2,560
15-12-10 조회 2,514
15-12-10 조회 2,581
15-12-10 조회 2,550
15-12-03 조회 3,192
15-12-03 조회 2,715
15-11-25 조회 2,795
15-11-09 조회 3,130
15-11-04 조회 2,956
15-06-09 조회 4,083
15-05-06 조회 5,082
15-03-28 조회 4,558
14-12-05 조회 4,984
14-10-25 조회 5,044
14-10-13 조회 4,263
14-10-03 조회 6,201
14-09-19 조회 4,957
14-09-18 조회 4,043
14-09-13 조회 4,602
14-09-03 조회 5,592
14-08-26 조회 4,199
14-08-26 조회 3,996
14-08-26 조회 3,971
14-08-11 조회 6,448
14-08-06 조회 4,118
14-08-06 조회 3,713
14-08-06 조회 3,924
14-08-01 조회 6,284
14-08-01 조회 3,836
14-07-30 조회 4,431
14-06-28 조회 5,156
14-06-28 조회 4,431
14-05-11 조회 4,582
14-05-09 조회 4,934
14-05-09 조회 7,695
14-04-30 조회 4,307
14-04-27 조회 4,181
14-04-25 조회 4,889
14-04-21 조회 3,871
14-04-21 조회 4,994
14-04-10 조회 4,594
14-04-01 조회 6,151
14-03-03 조회 3,527
14-02-25 조회 5,912
14-02-14 조회 5,190
14-02-13 조회 4,947
14-01-03 조회 4,436
13-12-06 조회 3,761
13-11-22 조회 5,516
13-11-18 조회 4,018
13-10-02 조회 4,438
13-10-02 조회 3,690
13-10-02 조회 3,953
13-10-02 조회 3,811
13-10-02 조회 4,177
13-09-16 조회 8,022
13-09-16 조회 5,388
13-08-18 조회 5,399
13-07-11 조회 4,051
13-07-10 조회 4,688
13-07-09 조회 4,724
13-07-09 조회 4,971
13-07-04 조회 4,479
13-07-04 조회 4,117
13-07-04 조회 4,234
13-07-01 조회 4,716
13-07-01 조회 4,540
13-07-01 조회 6,797
13-06-23 조회 4,371
13-06-05 조회 3,619
13-05-29 조회 4,865
13-05-10 조회 4,271
13-04-05 조회 4,883
13-04-05 조회 6,574
13-04-05 조회 1.1만
13-04-05 조회 7,167
13-04-05 조회 6,559
13-03-31 조회 5,829
13-03-31 조회 4,153
13-03-28 조회 4,514
13-03-28 조회 6,712
13-03-28 조회 9,194
13-03-28 조회 4,327
13-03-24 조회 3,941
13-03-21 조회 4,611
13-03-21 조회 1.8만
13-03-14 조회 3,924
13-03-10 조회 4,742
13-03-10 조회 4,495
13-03-10 조회 4,192
13-03-08 조회 5,254
13-03-08 조회 4,364
13-03-03 조회 5,014
13-03-03 조회 7,459
13-03-03 조회 4,212
13-03-03 조회 1.1만