2016-06-15 12 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)は中心に向かうベクトルです。このベクターは、長さlがあります

cos(angle) = radius/l 
l = radius/cos(angle) 

私たちは、修正ポイントが再び与えられた半径の円上に位置するように、このベクトルの複数mを、見つける必要があります。私達はちょうどの長さを調べるなら、私たちは、探したい:

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(あなたがサークルに取得するために中心に向かって移動する必要がある量)です。