bresenham 알고리즘을 이용한 직선, 원, 타원 그리기
여기 참고 해서 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
게시글 목록
| 번호 | 제목 |
|---|---|
| 29519 | |
| 13798 | |
| 21031 | |
| 430 | |
| 426 | |
| 13796 | |
| 422 | |
| 418 | |
| 13793 | |
| 415 | |
| 29513 |
HTML
2.php 초보탈출(배열)
5
|
| 13791 | |
| 407 | |
| 392 | |
| 383 | |
| 381 | |
| 371 | |
| 368 | |
| 13785 |
MySQL
php 초보 탈출 (기초 및 변수 편)
5
|
| 364 | |
| 361 | |
| 21027 | |
| 29509 |
HTML
php 는 얼마나 유연한가?
3
|
| 29507 | |
| 357 | |
| 13779 | |
| 356 | |
| 29505 | |
| 13778 |
JavaScript
onmouseover시 onmouseout까지 따라다니는 레이어 띄우기..
|
| 13775 | |
| 29504 | |
| 13774 |
JavaScript
현재 페이지 저장하기
|
| 353 | |
| 350 | |
| 346 | |
| 13773 |
JavaScript
프린트 출력 자바스크립트 소스
|
| 29494 |
HTML
HTML5 가이드
9
|
| 25166 | |
| 13771 |
Flash
video 태그
1
|
| 13769 | |
| 340 | |
| 329 | |
| 13765 |
Flash
HTML5 동영상 출력 관련 맛보기!
3
|
| 324 | |
| 319 | |
| 318 | |
| 314 | |
| 312 | |
| 310 | |
| 307 | |
| 300 | |
| 299 | |
| 13761 |
jQuery
Jquery 1.3.2 Cheat Sheet
3
|
| 13758 | |
| 13756 | |
| 13754 |
기타
특정 IP 차단하기
1
|
| 13752 |
JavaScript
php호스팅을 하고있는데 mssql에 있는 데이터를 가져와야합니다.
1
|
| 13750 | |
| 29493 |
HTML
아이피 차단소스
|
| 29492 | |
| 13749 |
JavaScript
특정아이피와 포트에 접속 가능할경우
|
| 13747 |
PHP
검색사이트 긁어오기
1
|
| 29489 | |
| 13746 |
JavaScript
링크를 클릭했을때 클릭수를 카운트
|
| 13745 | |
| 13744 | |
| 13743 |
MySQL
온라인 로또복권
|
| 13742 | |
| 29488 |
HTML
한국일보 실시간 속보보기
|
| 13740 |
JavaScript
법원경매넷 문서 파징 프로그램
1
|
| 13739 |
기타
후이즈검색 소스
|
| 13738 | |
| 13737 | |
| 13731 | |
| 13730 |
JavaScript
Session.Timeout 최대값은 24시간
|
| 13729 | |
| 13728 | |
| 13727 | |
| 29487 |
HTML
국가별 다른 페이지 엑세스
|
| 13726 |
JavaScript
ASP에서 배달 확인/ 읽음 확인 구현 방법
|
| 13725 |
기타
오버플로 에러
|
| 13724 |
기타
데이타 합치기
|
| 13723 | |
| 29486 | |
| 13722 |
기타
중복체크
|
| 13721 |
기타
접속자 목록
|
| 13720 | |
| 29485 |
HTML
현재, 이전페이지 url 호출
|
| 13719 |
JavaScript
case 문
|
| 21013 | |
| 21007 | |
| 13715 | |
| 13713 |
정규표현식
grep을 사용한 파일내용 찾기
1
|
| 13710 |
JavaScript
awk 사용하기
2
|
| 13707 | |
| 13705 |
JavaScript
프로세스별 메모리 사용량 보기
1
|
| 13700 | |
| 25155 | |
| 13698 |
JavaScript
UTF-8 한글 TEST
1
|
| 13697 |
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기