2016-06-15 6 views
0

이 함수의 수학적 이해가 어려워요. 필자는 나중에 (함수에 vec3 배열을 보낼 때) OpenGL에서 원을 형성하는 점을 만들기 위해 수식 (특히이 접선 및 방사형 요소는 무엇입니까?) 뒤에 작성된 논리를 듣고 싶습니다.OpenGL에서 원의 테셀레이션

void doTesselate(const Arc& arc, int slices, std::vector<glm::vec3>& vertices) 
{ 
    double dang = (arc.endAngle() - arc.startAngle()) * Deg2Rad; 

    double radius = arc.radius(); 
    double angIncr = dang/slices; 

    double tangetial_factor = tan(angIncr); 
    double radial_factor = 1 - cos(angIncr); 

    double startAngle = arc.startAngle() * Deg2Rad; 
    const glm::vec3& center = arc.center(); 

    double x = center.x - radius * cos(startAngle); 
    double y = center.y - radius * sin(startAngle); 

    ++slices; 
    for (int ii = 0; ii < slices; ii++) { 
    vertices.push_back(glm::vec3(x, y, center.z)); 

    double tx = center.y - y; 
    double ty = x - center.x; 

    x += tx * tangetial_factor; 
    y += ty * tangetial_factor; 

    double rx = center.x - x; 
    double ry = center.y - y; 

    x += rx * radial_factor; 
    y += ry * radial_factor; 
    } 
} 

답변

0

아이디어는 다음입니다 : 현재 위치에서 시작

Visualization

, 당신은 다시 중심을 향해 접선 방향으로 조금 이동합니다.

벡터 (tx, ty)은 반경과 길이가 같은 현재 점의 접선입니다. 새로운 각도로 이동하려면 tan(angle) * radius을 접선을 따라 이동해야합니다. radius은 이미 접선 벡터에 통합되어 있으며 tan(angle)tangetial_factor입니다 (접선의 정의에서 직접 얻음).

그 후 (rx, ry)은 중심을 향한 벡터입니다.

우리는이 벡터의 여러 m을 찾을 필요가
cos(angle) = radius/l 
l = radius/cos(angle) 

은 그러한 수정 된 포인트가 다시 주어진 반경 원에 놓여 있음 :이 벡터는 길이 l 있습니다. 우리가 길이를 검사하는 경우, 우리는 찾으려 :

target distance = current distance - m * length of (rx, ry) 
     radius = radius/cos(angle) - m * radius/cos(angle) 
       1 = (1 - m)/cos(angle) 
    cos(angle) = 1 - m 
1 - cos(angle) = m 

그리고이 여러 정확히 radial_factor (당신이 원에 얻을 수있는 중심을 향해 이동해야하는 양)입니다.