2010-06-15 123 views
0

我正在使用算法來生成四邊形。這些成爲概述。該算法是:填補空白的輪廓

void OGLENGINEFUNCTIONS::GenerateLinePoly(const std::vector<std::vector<GLdouble>> &input, 
    std::vector<GLfloat> &output, int width) 
{ 

    output.clear(); 
    if(input.size() < 2) 
    { 
     return; 
    } 
    int temp; 
    float dirlen; 
    float perplen; 
    POINTFLOAT start; 
    POINTFLOAT end; 
    POINTFLOAT dir; 
    POINTFLOAT ndir; 
    POINTFLOAT perp; 
    POINTFLOAT nperp; 

    POINTFLOAT perpoffset; 
    POINTFLOAT diroffset; 

    POINTFLOAT p0, p1, p2, p3; 

    for(unsigned int i = 0; i < input.size() - 1; ++i) 
    { 

     start.x = static_cast<float>(input[i][0]); 
     start.y = static_cast<float>(input[i][1]); 

     end.x = static_cast<float>(input[i + 1][0]); 
     end.y = static_cast<float>(input[i + 1][1]); 

     dir.x = end.x - start.x; 
     dir.y = end.y - start.y; 

     dirlen = sqrt((dir.x * dir.x) + (dir.y * dir.y)); 

     ndir.x = static_cast<float>(dir.x * 1.0/dirlen); 
     ndir.y = static_cast<float>(dir.y * 1.0/dirlen); 

     perp.x = dir.y; 
     perp.y = -dir.x; 

     perplen = sqrt((perp.x * perp.x) + (perp.y * perp.y)); 

     nperp.x = static_cast<float>(perp.x * 1.0/perplen); 
     nperp.y = static_cast<float>(perp.y * 1.0/perplen); 

     perpoffset.x = static_cast<float>(nperp.x * width * 0.5); 
     perpoffset.y = static_cast<float>(nperp.y * width * 0.5); 

     diroffset.x = static_cast<float>(ndir.x * 0 * 0.5); 
     diroffset.y = static_cast<float>(ndir.y * 0 * 0.5); 

      // p0 = start + perpoffset - diroffset 
      //p1 = start - perpoffset - diroffset 
      //p2 = end + perpoffset + diroffset 
      // p3 = end - perpoffset + diroffset 

     p0.x = start.x + perpoffset.x - diroffset.x; 
     p0.y = start.y + perpoffset.y - diroffset.y; 

     p1.x = start.x - perpoffset.x - diroffset.x; 
     p1.y = start.y - perpoffset.y - diroffset.y; 

      p2.x = end.x + perpoffset.x + diroffset.x; 
      p2.y = end.y + perpoffset.y + diroffset.y; 

      p3.x = end.x - perpoffset.x + diroffset.x; 
      p3.y = end.y - perpoffset.y + diroffset.y; 




     output.push_back(p2.x); 
     output.push_back(p2.y); 
     output.push_back(p0.x); 
     output.push_back(p0.y); 
     output.push_back(p1.x); 
     output.push_back(p1.y); 
     output.push_back(p3.x); 
     output.push_back(p3.y); 

    } 
} 

的問題是,有那麼差距是在這裏看到: http://img816.imageshack.us/img816/2882/eeekkk.png

必須有解決這個問題的一種方式。我看到一個模式,但我不知道。必須有辦法填補缺失的中間人。 感謝

回答

0

編輯:見我other answer

添加一個三角形,用於將「外部」(檢查2D'cross product'的符號)頂點與中心關節頂點連接起來。

如果你想要更有魅力,你可以做一個2D slerp來獲得一個更圓的外連接,儘管這樣做的確會花費更多的三角形。另外,如果您打算使用寬度很細的線條,您可以先嚐試simplifying以減少透支/多帳戶數量。