2010-12-27 4 views
8

간략한 배경 : 웹 기반 그리기 응용 프로그램에서 제어 포인트를 통과하는 1px 두께의 스플라인을 그릴 필요가 있습니다.도면 별칭, 픽셀 완전 1px 스플라인 (Catmull-Rom, 구체적으로)

내가 고민하는 문제는 1px 연필 도구를 사용하는 것처럼 p1과 p2 사이에 각 픽셀을 그릴 필요가 있다는 것입니다. 따라서 앤티 앨리어스가없고 한 번에 한 픽셀 씩 표시됩니다. 브러쉬 시스템이 브러시 팁을 캔버스에 적용하기위한 픽셀 좌표를 갖는 지 여부에 따라 선/곡선 라이브러리 코드를 사용하지 않고 수동으로 수행해야합니다.

기본적으로 Bresenham 알고리즘과 같은 것으로부터 나온 1 픽셀 스테핑을 Catmull-Rom 방정식에 의해 반환 된 좌표와 결합해야합니다. 나는 Catmull-Rom 점이 균일하게 분포되어 있지 않기 때문에 문제가 있습니다 (그래서 저는 곡선에 100 개의 픽셀이 있어야하고 방정식을 100 번 실행해야한다고 말할 수는 없습니다). 나는 X와 Y 델타의 최대 추정 시작 값을 사용하고 Bresenham과의 간격을 채우려고했지만 반올림으로 인해 여전히 "더티"섹션으로 끝납니다 (예 : 라인이 명확하게 위로 이동하고 맞지만 여전히 동일한 Y 구성 요소로 두 개의 픽셀을 가져 와서 선의 "뚱뚱한"섹션이됩니다).

나는 스플라인을 그리는 거의 모든 그래픽 프로그램이 내가 뒤따라 오는 깨끗한 픽셀 커브를 지원해야하기 때문에 이것이 해결되었다고 확신한다. 꽤 많은 수학 연구를 한 후에도, 나는 조금 혼란스럽고 여전히 해결책이 없습니다. 어떤 충고?

편집 :이처럼 보이는 예상 결과가있을 수 있습니다

alt text

(이 추정치는 유의) :

여기에 내가 렌더링해야 할 수도 곡선의 예 alt text

Catmull-Rom 스플라인 방정식을 사용하여 세그먼트를 생성하려면 4 점이 필요합니다. P0 및 P3은 P1-> P2 세그먼트에서 들어오고 나가는 방향에 대한 접선으로 사용됩니다. Catmull-Rom 스플라인을 사용하면 파란 부분은 t가 0에서 1로 움직일 때 보간됩니다. P0와 P3을 복제하여 녹색 부분이 렌더링되도록 할 수 있으므로 문제가되지 않습니다.

간단히하기 위해, P0과 P3의 형태로 접선이있는 경우 P1과 P2 사이의 곡선에있는 픽셀을 렌더링해야합니다. 반드시 Catmull-Rom 스플라인을 사용할 필요는 없지만 제어점을 통과시켜야하는이 작업에 적합한 도구 인 것 같습니다. 보간 점의 비 균일 분포는 루프에 나를 던지고있는 것입니다.

EDIT2 : 빨간색 화살표 픽셀 없을해야 할 몇 가지 사항을 지적

alt text

: 여기 내 결과 곡선이 더러 말할 때 무슨 뜻인지의 예입니다. 이는 계산 된 좌표의 X 및 Y 구성 요소가 동일한 비율로 변경되지 않기 때문에 발생합니다. 따라서 각 구성 요소가 둥글게되면 (정확한 픽셀 위치를 가짐) 계산 된 좌표가 (42.4999, 50.98)이기 때문에 X 또는 Y가 부풀려지지 않을 수 있습니다. 바닥이나 천장에 라운드 라운드를 바꾼다고해도 문제가 해결되지는 않습니다.

+0

P1에서 P2까지의 예상 결과를 보여주는 다른 그림을 추가 할 수 있다면 좋을 것이다. –

+0

@ belisarius Catmull-Rom 방정식에 따라 픽셀이 채워지는 수학 계산은하지 못했지만 두 번째 이미지는 내가 성취하려고하는 것에 대한 아이디어를 제공해야합니다. – Xenethyl

+0

나는 귀하의 의견으로 인해 그것을 요청했습니다 : _but 여전히 같은 Y 구성 요소로 두 픽셀을 얻었습니다. –

답변

2

여기에는 곡선 길이를 따라 동일한 간격의 점을 얻기 위해 a paper describing method for the re-parametrization of splines이 있습니다.나는 이것을 Catmull-Rom 곡선에 적용 할 수 있다면 문제를 해결할 수 있다고 생각한다. (너무 어려워서는 안된다.)

+0

종이에 연결해 주셔서 감사합니다. 나는 인터넷 검색에 "호 길이"를 포함시키지 않았다. 방금 좀 더 검색을 수행하고 훨씬 나은 결과를 얻었습니다 (http://www.actionscript.org/forums/showthread.php3?t=213252 참조). 근사 및 사전 계산에 대한이 경첩에 대한 허용 된 해결책이있는 것처럼 보입니다. 이것은 JavaScript에서 수행되기 때문에 성능 문제가 될 수 있습니다. 이 문제를 다시 조사한 후에 다른 문제로 다시 게시 할 수도 있지만 당분간 도움을 주셔서 감사합니다. 당신은 분명히 올바른 방향으로 나를 지적했습니다. – Xenethyl

+0

@Xenethyl 도움을 주어서 기쁩니다! 시나리오에 맞게 최적화 할 수 있기를 바랍니다. –