2009-10-12 3 views
0

gd 라이브러리의 imagefilledpolygon()으로 인해 문제가 발생했습니다.PHP - 다각형 GD 라이브러리의 버그?

일부 이유로 내 라인 중 일부가 1px에서 끝나기 때문에 imagepixelset을 사용하여 디버그하기로 결정하여 내 모양 점의 색상을 빨간색으로 설정했습니다.

alt text http://www.degreeshowcase.com/other/1.gif 만약 당신이 그림의 일부 포인트 모양을 볼 수 있습니다 ... 일부는 외부 .... 그 매우 비논리적입니다.

사람이 해결책이 있습니까 (사진은 더 볼 수 있도록하기 위해 확장 된)?

업데이트 : 위의 모양에 대한

내 포인트였다 : 0,0 40,0 40,20 20,20 20,40 0,40

내가 요구하는 모양의 높이와 폭 생산 된 것은 20의 배수 여야합니다 .... 그러나 어떤 이유로 든 모양의 일부가 21 픽셀 높이 또는 너비로 끝납니다.

내가 원하는 모양을 얻는 데 필요한 점을 알아 내기 위해 스크립트를 만들었지 만 나는 왜 그런 식으로 일할 수 없으며 모든 모양을 수정하는 스크립트를 만들 수 없습니다.

<?php 

// set up array of points for polygon 
$values = array(0,0, 39,0, 39,20, 19,20, 19,39, 0,39); 

//My original values were 0,0 40,0 40,20 20,20 20,40 0,40 
//I do not understand why some values require minus 1 and others can remain as they were (a multiple of 20) 

// create image 
$image = imagecreatetruecolor(40, 40); 

// allocate colors 
$bg = imagecolorallocate($image, 200, 200, 200); 
$blue = imagecolorallocate($image, 0, 0, 255); 

// fill the background 
imagefilledrectangle($image, 0, 0, 39, 39, $bg); 

// draw a polygon 
imagefilledpolygon($image, $values, 6, $blue); 

// flush image 
header('Content-type: image/png'); 
imagepng($image); 
imagedestroy($image); 


?> 
+1

일부 코드가 없으면 어떤 일이 발생했는지 알지 못합니다. – Jacco

+0

반올림 오류? –

+0

정수에 20을 곱하여 포인트가 생성되는 오류를 반올림 할 수 없습니다.한 순간 나는 포인트를 제공 할 것이다 – Mark

답변

1

현재 GD 라이브러리를 개발 한 사람에게 '권선 수 알고리즘'을 따른 것으로 설명했는데 이는 here입니다. 예제 이미지를 보았을 때, 'winding number algorithm'의 작동 방식이 일치하지만 함수는이를 고려하여 입력 된 모양을 생성해야합니다.

이 함수를 사용하여 오목한 다각형을 정확하게 생성하는 유일한 방법은 좌표에 굴곡 규칙을 적용하고 그에 따라 조정하는 다른 함수를 작성하는 것입니다. 함수.

2

제 생각에 너비가 위치와 섞여 있습니다.

예를 들어, 0px에서 9px까지의 줄은 10px 길이입니다 ... position 대신 두 번째 매개 변수로 length를 사용하면 길이가 11px 길어집니다.

일부 코드를 볼 수 있다면 확인할 수 있습니다.

+0

나는 그것을 궁금해했다. 그러나 모양을 이루는 사각형은 모두 20px x 20px 그리고 나는 모두 20으로 나눌 수있는 점을 확인했습니다 ... – Mark

+0

다각형의 경우에는 너비가 없어야합니다. 외곽선 포인트의 위치 만. – Joey

+0

당신은 부분적으로 옳은 것처럼 보입니다. 그러나 점 중 일부는 "-1"이되어서는 안됩니다 ... 매우 이상합니다. – Mark

1

일반 폴리곤 렌더링은 2 개의 다각형이 모서리를 공유하는 경우 각 픽셀이 하나의 다각형에만있을 수 있도록합니다. 2 개의 사각형을 그린 다음 서로 인접하여 공통 에지를 공유한다고 생각하면 가장자리를 따라 픽셀을 두 번 렌더링하고 싶지는 않습니다. 여기 다각형 내부 고려되어야 다각형의 에지 화소를 판정에 대한 설명이있다

: http://www.gameprogrammer.com/5-poly.html 일반적인 해결책은 다각형의 좌측 픽셀과 상단 가장자리가 속한 "라고한다

오른쪽 및 아래쪽 가장자리의 픽셀은 다각형에 연결되지 않습니다. GD가 어떤 솔루션을 사용하는지 100 % 확신하지는 못했지만 이에 대한 문서를 찾을 수는 없었습니다. 그러나 이와 비슷한 결과를 기대합니다.

+0

의 ... 광장에서 : 오른쪽 상단에있는 픽셀에 닿아 왼쪽 상단의 픽셀이 완전히 모양에 , 왼쪽 하단의 오른쪽 하단의 픽셀이 대각선으로 만나는 경우 왼쪽 하단의 픽셀이 상단 측면을 만지고 있습니다 하지만 그렇지 않다면 ... 한 픽셀 만이 – Mark

+0

외부에 있습니다. 예제는 내가 결정할 수있는 정상적인 픽셀 선택 규칙을 따르지 않는 것처럼 보이므로보고있는 결과를 설명하는 방법을 잘 모릅니다. GD 라이브러리가 픽셀이 폴리곤 내부 또는 외부에 있는지 결정하는 방법을 설명하는 명확한 문서가 필요합니다. –

+0

GD 라이브러리의 제작자와 이야기했습니다. 그는 굴곡 규칙을 기반으로한다고 말합니다. http://en.wikipedia.org/wiki/Point_in_polygon 제목 아래에 "권선 수 알고리즘" 권선 설명되어 있습니다. 숫자는 여기 http://en.wikipedia.org/wiki/Winding_number에 설명되어 있습니다 하지만 내 삶은 내 좌표를 조정할 방법을 찾지 못합니다. – Mark