2015-03-19 4 views
2

Для моего кода мне нужно вычислить Convexhull серии точек и по некоторым причинам мне нужно использовать библиотеки qhull. В этой библиотеке есть метод qconvex, который выполняет именно то, что мне нужно. Я могу запустить эту команду в терминале и получить то, что хочу. например, давайте предположим, что у меня есть вход как points.txt:обеспечивают ввод qconvex в код C++

2 #dimension 
5 #number of points 
0 0 
1 0 
0.5 0.5 
1 1 
0 1 

я могу запустить в терминале одну эти команды, чтобы получить результат: qconvex Fx < points.txt или cat points.txt | qconvex -Fx и из пут:

4 
0 
1 
3 
4 

Теперь мой вопрос как я могу вызвать эту команду в моем C++-коде итеративно над моим вводом: в моем коде у меня есть 2 for внутри друг друга, которые вызывают определенную функцию, которая будет генерировать по 10 точек каждый раз (хранится в float **rs_tmp;), и мне нужно вычислить qconvex за эти 10 баллов каждый раз. как я могу запустить qconvex в своем коде и передать в качестве входного сигнала rs_tmp? предпочитают не записывать rs_tmp в некоторый временный файл и читать с него, так как мне нужно, чтобы мой код был очень быстрым.

float **rs_tmp; 
for (int i = 0; i < NUMBER; i++) 
{ 
    for (int j = 0; j < NUMBER; j++) 
    { 
     rs_tmp = generate_points(label, dect[i], dect[j], fun); 
     // HERE I NEED TO CALL QCONVEX SOME HOW 
     // THE POINTS ARE STORED IN rs_tmp as 2-Dimensional floating points array 
    } 
    int size = fun.size(); 
    for(int i = 0; i < size; ++i)  
    { 
     delete[] rs_tmp[i]; 
    } 
    delete[] rs_tmp;   
} 

ответ

1

У меня была такая же проблема довольно долгое время, и мне просто удалось ее решить. Qhull обеспечивает довольно аккуратный пример, который довольно информативен. Если вы клонировали из git, вы можете увидеть пример в каталоге qhull/src/user_eg3/user_eg3.cpp. Мне потребовалось немного, чтобы понять, что они делают, но как только вы получите это на самом деле довольно легко. Я удалил все дополнительные опции, но тот, который вы ищете.

/*-------------------------------------------- 
-user_eg3- main procedure of user_eg3 application 
*/ 
int main(int argc, char **argv) { 
    try{ 
     return user_eg3(argc, argv); 
    }catch(QhullError &e){ 
     cerr << e.what() << std::endl; 
     return e.errorCode(); 
    } 
}//main 

int user_eg3(int argc, char **argv) 
{ 
    RboxPoints rbox; 
    Qhull qhull; 
    line = ""; 
    std::istringstream is("2 4 1 0 1 1 0 0 0 1"); // To be passed to rbox: produces a unit square where 2 is the dimension 4 is the count and the points follow. This will also accept any valid rbox flags. 
    std::stringstream output; 

    rbox.appendPoints(is); // appendPoints accepts either a const char* or an istream object. See libqhullcpp/RboxPoints.h and libqhullcpp/PointCoordinates.h 

    cerr << "@@@@@@@@@@\n" << rbox << "@@@@@@@@@@\n"; 
    qhull.runQhull(rbox, ""); //you can set any flag you would set for qhull in the terminal inside the "" 
    qhull.setOutputStream(&output); //this will take any output stream 
    qhull.outputQhull("m"); //this will take any qhull output option 
    cerr << "My Output : " << output.str() << "%%\n"; 
    qhull.setOutputStream(&cout); 
    qhull.outputQhull("n"); 
    return 0; 
}//user_eg3 

Надеюсь, это поможет.