2017-05-09 1 views
0

고정밀 측정을위한 어플리케이션을 프로그래밍 중입니다. 이제 문제가 생겼어.두 점을 통과하는 정확한 원을 그립니다.

사용자는 원의 지름을 나타내는 X 축에서 세그먼트를 선택할 수 있습니다. 선택한 지름이 픽셀 길이가 짝수 일 경우 선택된 두 끝점을 통해 문제의 원을 그리는 방법 이 경우 원의 원점은 두 픽셀 사이에 있으므로 두 원 중 하나를 선택하게되어 원을 하나 이동합니다. 픽셀 왼쪽 또는 오른쪽. 사실 하나의 픽셀이 포함되고 선택된 세그먼트의 다른면에 다른 픽셀이 추가 되었기 때문에 모양이 변경되지는 않지만, 영역 주변의 세그먼트의 길이를 기반으로 사각형을 그릴 필요가있는 경우 어떻게됩니까? 그런 다음 원과 정사각형이 잘못된 장소에 닿습니다.

일반적으로 이러한 상황에서 수행되는 작업은 무엇입니까?

+0

일반적으로 수행되는 작업은 원의 중심이 반 화소 경계에 있도록 허용하는 것입니다. –

+0

그리고 이것이 정확히 어떻게 이루어 졌습니까? 제 말은, 삼각 함수 또는 원 방정식으로 극 좌표계와 직교 좌표계를 사용하여 상상할 수있는 올바른 원을 그립니다. 그러나 원점을 그려야하는 경우 원점을 어디에 두어야합니까? 두 픽셀을 모두 사용하거나 수학적으로 정확하지 않다는 사실을 단순히 무시합니까? 두 픽셀 사이를 그릴 수는 없습니다. : D – Dalen

답변

0

ImageDraw.Draw.ellipse은 매개 변수로 테두리 상자를 사용합니다. 원의 중심이 어디로가는 지 상관하지 않습니다.

원 개요는 내가 수행 한 테스트에서 경계 상자의 모든 4 가장자리를 포함합니다. 나는 네가 네 자신의 시험을하는 것도 제안한다.

일단 원의 지름과 중심을 가지면 임의의 두 점에서 경계 상자를 계산하는 것이 쉽습니다.

diameter = ((x2 - x1)**2 + (y2 - y1)**2) ** 0.5 
radius = diameter/2 
xC, yC = (x1 + x2)/2.0, (y1 + y2)/2.0 
bbox = [round(xC - radius), round(yC - radius), round(xC + radius), round(yC + radius)] 
+0

그래, 나도 알아,하지만 난 아직도 그것을 사용할 때 무슨 일이 일어날 지 신경써. 실제 타원을 원 대신 그려서 경계 상자 사각형의 모든면을 측면 D의 길이가 균일하게 만지게 할 수 있습니까? 아니면 실제 원을 그리지 만 R = int (D/2.0)를 사용하고 한 픽셀을 오른쪽으로두고 하나의 다운 서클 무료? – Dalen

관련 문제