2017-12-16 19 views
0

dear imgui을 사용하여 두 베 지어 곡선 사이의 영역을 채우려면 어떻게해야합니까? 친애하는 imgui를 사용하여 두 베 지어 곡선 사이의 영역을 채우는 방법

나는이 같은 ImDrawList API를 사용하여 곡선을 그렸다 :

편집
 ImVec2 p0(10, 100); ImVec2 c1(110, 50); ImVec2 p1(210, 100); 
     ImVec2 q0(10, 200); ImVec2 c2(110, 100); ImVec2 q1(210, 200); 

     auto col = IM_COL32(0,255,255, 255); 

     ImDrawList* draw_list = ImGui::GetWindowDrawList(); 

     draw_list->AddBezierCurve(p0, c1, c1, p1, col, 1.0f); 
     draw_list->AddBezierCurve(q0, c2, c2, q1, col, 1.0f); 

     // I can close the curves, visually, with these lines 
     draw_list->AddLine(p0, q0, col, 1.0f); 
     draw_list->AddLine(p1, q1, col, 1.0f); 

:

나는 내가 원하는 경로를 그립니다 상태 API를 사용하고 내가이 길을 채우기 위해 함수를 호출 . 여기에 코드입니다 :

 draw_list->PathLineTo(p0); 
     draw_list->PathBezierCurveTo(c1, c1, p1); 
     draw_list->PathLineTo(q1); 
     draw_list->PathBezierCurveTo(c2, c2, q0); 

     draw_list->PathFillConvex(col); 

그러나 당신이 볼 수있는 뭔가 문제가있다 :

result

정확한 형상은 흰색으로 그려됩니다.

답변

3

OpenGL의 채우기 프리미티브는 볼록한 프리미티브에 대해서만 정의되어 있습니다. 세트는 볼록으로 정의됩니다. 세트 내의 임의의 두 포인트에 대해이 세트의 경계를 떠나지 않고이 포인트 사이에 선을 그릴 수있는 경우.

Dear-ImGUI는 중간 테셀레이션없이 번역 된 도면 명령을 그대로 OpenGL에 전달하기 만합니다. ... 당신이 보게되는 문제와 왜 채우기 기능이 그것의 이름에 …Convex 부분을 가지고 있는지 원인이됩니다.

해결 방법은 볼록하지 않은 모양을 더 작은 볼록한 모양으로 분해하거나 scanline 알고리즘과 같은 볼록한 모양에도 사용할 수있는 채우기 방법을 사용하는 것입니다 (GPU에서 구현이 가장 쉽게 수행됨). 계산 쉐이더 사용).

+0

감사합니다. 스캔 라인 알고리즘을 찾고 imgui를 사용하여 구현을 찾았습니다 : https://github.com/ocornut/imgui/issues/760. – user3762200

1

imgui가 제공하지 않는 오목면 채우기 알고리즘이 필요합니다. 일반적으로 모양을 볼록한 모양으로 분해하는 것이 쉽고 빠릅니다. "두 베 지어 사이"를 채우는 일반적인 경우는 베 지어가 교차 할 수 있기 때문에 까다 롭습니다. 따라서 여러 영역이있을 수 있습니다. 그들이 교차하지 않을 것이고 당신의 탄젠트가 너무 미쳐 있지 않다는 것을 안다면, 당신은 다양한 근사를 사용할 것입니다. 어쩌면 각 쿼드가 규칙적인 간격으로 베 지어의 두 세그먼트를 연결하는 N 개의 쿼드를 그려보십시오. Datenwolf 해답은보다 일반적인 해답을위한 좋은 출발점입니다.

또한 Datenwolf 답변에 대해 의견을 제시해야합니다. 친애하는 ImGui는 "번역 된 그림 그리기 명령을 그대로 OpenGL로 전달하지 않습니다."모든 삼각 측량은 imgui에 의해 수행되므로 OpenGL에서 인식하고있는 채우기 또는 모양에 대한 개념이 없습니다. 원시 텍스처 삼각형 만 전달됩니다.

이론상으로 imgui는 "PathFillConcave()"기능을 제공 할 수 있지만 구현되지 않았으므로 값 비싸고 복잡 할 수 있습니다. 위에 게시 된 링크에는 실제로 하나가 있습니다.