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