Пример #1
0
bool Triangulate::Process(const Vector2fVector &contour,Vector2fVector &result)
{
  /* allocate and initialize list of Vertices in polygon */

  int n = contour.size();
  if ( n < 3 ) return false;

  int *V = new int[n];

  /* we want a counter-clockwise polygon in V */

  if ( 0.0f < Area(contour) )
    for (int v=0; v<n; v++) V[v] = v;
  else
    for(int v=0; v<n; v++) V[v] = (n-1)-v;

  int nv = n;

  /*  remove nv-2 Vertices, creating 1 triangle every time */
  int count = 2*nv;   /* error detection */

  for(int m=0, v=nv-1; nv>2; )
  {
    /* if we loop, it is probably a non-simple polygon */
    if (0 >= (count--))
    {
      //** Triangulate: ERROR - probable bad polygon!
      return false;
    }

    /* three consecutive vertices in current polygon, <u,v,w> */
    int u = v  ; if (nv <= u) u = 0;     /* previous */
    v = u+1; if (nv <= v) v = 0;     /* new v    */
    int w = v+1; if (nv <= w) w = 0;     /* next     */

    if ( Snip(contour,u,v,w,nv,V) )
    {
      int a,b,c,s,t;

      /* true names of the vertices */
      a = V[u]; b = V[v]; c = V[w];

      /* output Triangle */
      result.push_back( contour[a] );
      result.push_back( contour[b] );
      result.push_back( contour[c] );

      m++;

      /* remove v from remaining polygon */
      for(s=v,t=v+1;t<nv;s++,t++) V[s] = V[t]; nv--;

      /* resest error detection counter */
      count = 2*nv;
    }
  }
  delete V;

  return true;
}
Пример #2
0
float Triangulate::Area(const Vector2fVector &contour) {
  int n = contour.size();

  float A = 0.0f;

  for (int p = n - 1, q = 0; q < n; p = q++) {
    A += contour[p].x * contour[q].y - contour[q].x * contour[p].y;
  }
  return A * 0.5f;
}
Пример #3
0
int main(int argc, char** argv)
{
    // data
    vector<completeInformation> compl_info, selected_info;
    vector<vecPairsList> extractedLines;

    // read robot's info
    parseRobotInfo("/home/ubisum/fuerte_workspace/thesis_pack/src/files/robotInfo.txt", compl_info);

    // select relevant poses
    selected_info = selectFrames(compl_info);

    // compute lines for each pose
    for(int i = 0; i<(int)selected_info.size(); i++)
    {
        Vector2fVector vector;

        for(int j = 0; j<(int)selected_info[i].points.size(); j++)
        {
            // extract a coordinate of a scan's point
            coordinate coord = selected_info[i].points[j];

            // fill a vector
            Vector2f temp_vec;
            temp_vec << coord.first, coord.second;

            // store vector
            vector.push_back(temp_vec);
        }

        // compute and store lines for current scan
        extractedLines.push_back(computeLines(vector));
    }

    Vector4f a(15,12,24,20);
    obtainNewExtremes(a,Vector4f(15,16,19,22));
    //cout << "Projection " << endl << projectPoint(Vector4f(15,12,24,20), Vector2f(10,14)) << endl;

     cout << "Projection " << endl << projectByEquation(Vector3f(2,-1,0), Vector2f(2,3)) << endl;

//    vector<vecPairsList> reducedVector(extractedLines.begin()+1, extractedLines.begin()+2);
    int init = 0;
    int end = 1;
    vector<vecPairsList> reducedVector;
    for(int k = init; k<= end; k++)
        reducedVector.push_back(extractedLines[k]);
    //MatrixXf m = mergeLines(createVector());
    MatrixXf m = mergeLines(reducedVector);
    //MatrixXf m = mergeLines(extractedLines);
    cout << "Size m: " << m.rows() << " " << m.cols() << endl;
    printLinesByExtremes(m.block(6,0,4,m.cols()), MatrixXf::Identity(3,3), "merged_lines.txt");

    cout << endl << "Proiezione punto" << endl;
    cout << projectByEquation(Vector3f(2, -1, 0), Vector2f(2,3)) << endl << endl;


    Vector4f line1(2,3,2,1);
    Vector4f line2(2,1,5,1);
    MatrixXf two_lines(4,2);
    two_lines.block(0,0,4,1) = line1;
    two_lines.block(0,1,4,1) = line2;

    float angle = 45*M_PI/180;
    MatrixXf prova_t(3,3);
    prova_t << cos(angle), -sin(angle), 5, sin(angle), cos(angle), 2, 0, 0, 1;
//    prova_t << 1,0,5,0,1,0,0,0,1;
//    MatrixXf prova_t = MatrixXf::Identity(3,3);

    MatrixXf transf_vectors(4,2);
    transf_vectors.block(0,0,2,2) = transformVectors(two_lines.block(0,0,2,2), prova_t);
    transf_vectors.block(2,0,2,2) = transformVectors(two_lines.block(2,0,2,2), prova_t);
    cout << "transf_vectors" << endl << transf_vectors << endl;

    remove("prova_transf.txt");
    FILE* prova_transf = fopen("prova_transf.txt", "a");
    stringstream ss_prova;
    for(int w = 0; w<transf_vectors.cols(); w++)
    {
        Vector4f column = transf_vectors.block(0,w,4,1);

        ss_prova << column(0) << "\t" << column(1) << "\n" <<
                    column(2) << "\t" << column(3) << "\n\n";

        fputs(ss_prova.str().c_str(), prova_transf);
    }

    Vector2f polar1 = polarRepresentation(line1.block(0,0,2,1), line1.block(2,0,2,1));
    //Vector2f polar2 = polarRepresentation(transf_vectors.block(0,0,2,1), transf_vectors.block(2,0,2,1));
    Vector2f polar2 = new_transformRT(transf_vectors.block(0,0,4,1));

    cout << "differenza theta " << 180*fabs(polar1(1)-polar2(1))/M_PI << endl;


}