AABB tree demo:

- added color ramps for signed and unsigned distance functions (thermal for unsigned, and red/blue for signed)
- fix moc warning issue (thanks Manuel Caroli)
- fix strange value in performance section of user manual (we now understand that the KD-tree is making something really nasty only for large point sets - and we'll investigate the KD tree more)
This commit is contained in:
Pierre Alliez 2009-07-01 12:55:33 +00:00
parent 7efd70e693
commit ef1864d6af
5 changed files with 58 additions and 36 deletions

View File

@ -52,9 +52,6 @@ if(CGAL_Qt4_FOUND AND QT4_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND)
qt4_generate_moc( "${CMAKE_CURRENT_SOURCE_DIR}/Viewer.h" Viewer_moc.cpp ) qt4_generate_moc( "${CMAKE_CURRENT_SOURCE_DIR}/Viewer.h" Viewer_moc.cpp )
add_file_dependencies( Viewer_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Viewer.h" ) add_file_dependencies( Viewer_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Viewer.h" )
qt4_generate_moc( "${CMAKE_CURRENT_SOURCE_DIR}/Scene.h" Scene_moc.cpp )
add_file_dependencies( Scene_moc.cpp "${CMAKE_CURRENT_SOURCE_DIR}/Scene.h" )
qt4_add_resources ( RESOURCE_FILES AABB_demo.qrc ) qt4_add_resources ( RESOURCE_FILES AABB_demo.qrc )
add_file_dependencies( AABB_demo.cpp "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp" add_file_dependencies( AABB_demo.cpp "${CMAKE_CURRENT_BINARY_DIR}/MainWindow_moc.cpp"

View File

@ -88,6 +88,27 @@ public:
rebuild(); rebuild();
} }
void build_red()
{
reset();
m_colors[3][0] = 1;m_colors[0][0] = 128;m_colors[1][0] = 0;m_colors[2][0] = 0;
m_colors[3][80] = 1;m_colors[0][80] = 255;m_colors[1][80] = 0;m_colors[2][80] = 0;
m_colors[3][160] = 1;m_colors[0][160] = 255;m_colors[1][160] = 128;m_colors[2][160] = 0;
m_colors[3][255] = 1;m_colors[0][255] = 255;m_colors[1][255] = 255;m_colors[2][255] = 255;
rebuild();
}
void build_blue()
{
reset();
m_colors[3][0] = 1;m_colors[0][0] = 0;m_colors[1][0] = 0;m_colors[2][0] = 128;
m_colors[3][80] = 1;m_colors[0][80] = 0;m_colors[1][80] = 0;m_colors[2][80] = 255;
m_colors[3][160] = 1;m_colors[0][160] = 0;m_colors[1][160] = 255;m_colors[2][160] = 255;
m_colors[3][255] = 1;m_colors[0][255] = 255;m_colors[1][255] = 255;m_colors[2][255] = 255;
rebuild();
}
void build_fire() void build_fire()
{ {
reset(); reset();

View File

@ -30,6 +30,9 @@ Scene::Scene()
// distance functions // distance functions
m_max_distance_function = (FT)0.0; m_max_distance_function = (FT)0.0;
m_signed_distance_function = false; m_signed_distance_function = false;
m_red_ramp.build_red();
m_blue_ramp.build_blue();
} }
Scene::~Scene() Scene::~Scene()
@ -175,13 +178,13 @@ void Scene::draw_unsigned_distance_function()
unsigned int i01 = 255-(unsigned int)(255.0 * d01 / m_max_distance_function); unsigned int i01 = 255-(unsigned int)(255.0 * d01 / m_max_distance_function);
unsigned int i11 = 255-(unsigned int)(255.0 * d11 / m_max_distance_function); unsigned int i11 = 255-(unsigned int)(255.0 * d11 / m_max_distance_function);
unsigned int i10 = 255-(unsigned int)(255.0 * d10 / m_max_distance_function); unsigned int i10 = 255-(unsigned int)(255.0 * d10 / m_max_distance_function);
::glColor3ub(m_ramp.r(i00),m_ramp.g(i00),m_ramp.b(i00)); ::glColor3ub(m_thermal_ramp.r(i00),m_thermal_ramp.g(i00),m_thermal_ramp.b(i00));
::glVertex3d(p00.x(),p00.y(),p00.z()); ::glVertex3d(p00.x(),p00.y(),p00.z());
::glColor3ub(m_ramp.r(i01),m_ramp.g(i01),m_ramp.b(i01)); ::glColor3ub(m_thermal_ramp.r(i01),m_thermal_ramp.g(i01),m_thermal_ramp.b(i01));
::glVertex3d(p01.x(),p01.y(),p01.z()); ::glVertex3d(p01.x(),p01.y(),p01.z());
::glColor3ub(m_ramp.r(i11),m_ramp.g(i11),m_ramp.b(i11)); ::glColor3ub(m_thermal_ramp.r(i11),m_thermal_ramp.g(i11),m_thermal_ramp.b(i11));
::glVertex3d(p11.x(),p11.y(),p11.z()); ::glVertex3d(p11.x(),p11.y(),p11.z());
::glColor3ub(m_ramp.r(i10),m_ramp.g(i10),m_ramp.b(i10)); ::glColor3ub(m_thermal_ramp.r(i10),m_thermal_ramp.g(i10),m_thermal_ramp.b(i10));
::glVertex3d(p10.x(),p10.y(),p10.z()); ::glVertex3d(p10.x(),p10.y(),p10.z());
} }
::glEnd(); ::glEnd();
@ -214,32 +217,34 @@ void Scene::draw_signed_distance_function()
FT& d10 = pd10.second; FT& d10 = pd10.second;
// determines grey level // determines grey level
double g00 = (double)std::fabs(d00) / m_max_distance_function; unsigned int i00 = 255-(unsigned)(255.0 * (double)std::fabs(d00) / m_max_distance_function);
double g01 = (double)std::fabs(d01) / m_max_distance_function; unsigned int i01 = 255-(unsigned)(255.0 * (double)std::fabs(d01) / m_max_distance_function);
double g11 = (double)std::fabs(d11) / m_max_distance_function; unsigned int i11 = 255-(unsigned)(255.0 * (double)std::fabs(d11) / m_max_distance_function);
double g10 = (double)std::fabs(d10) / m_max_distance_function; unsigned int i10 = 255-(unsigned)(255.0 * (double)std::fabs(d10) / m_max_distance_function);
// determines color (red vs blue for inside vs outside)
double r00 = d00 < 0.0 ? g00 : 0.0;
double b00 = d00 > 0.0 ? g00 : 0.0;
double r01 = d01 < 0.0 ? g01 : 0.0;
double b01 = d01 > 0.0 ? g01 : 0.0;
double r11 = d11 < 0.0 ? g11 : 0.0;
double b11 = d11 > 0.0 ? g11 : 0.0;
double r10 = d10 < 0.0 ? g10 : 0.0;
double b10 = d10 > 0.0 ? g10 : 0.0;
// assembles one quad // assembles one quad
::glColor3d(r00,0.0,b00); if(d00 > 0.0)
::glColor3ub(m_red_ramp.r(i00),m_red_ramp.g(i00),m_red_ramp.b(i00));
else
::glColor3ub(m_blue_ramp.r(i00),m_blue_ramp.g(i00),m_blue_ramp.b(i00));
::glVertex3d(p00.x(),p00.y(),p00.z()); ::glVertex3d(p00.x(),p00.y(),p00.z());
::glColor3d(r01,0.0,b01);
if(d01 > 0.0)
::glColor3ub(m_red_ramp.r(i01),m_red_ramp.g(i01),m_red_ramp.b(i01));
else
::glColor3ub(m_blue_ramp.r(i01),m_blue_ramp.g(i01),m_blue_ramp.b(i01));
::glVertex3d(p01.x(),p01.y(),p01.z()); ::glVertex3d(p01.x(),p01.y(),p01.z());
::glColor3d(r11,0.0,b11);
if(d11 > 0)
::glColor3ub(m_red_ramp.r(i11),m_red_ramp.g(i11),m_red_ramp.b(i11));
else
::glColor3ub(m_blue_ramp.r(i11),m_blue_ramp.g(i11),m_blue_ramp.b(i11));
::glVertex3d(p11.x(),p11.y(),p11.z()); ::glVertex3d(p11.x(),p11.y(),p11.z());
::glColor3d(r10,0.0,b10);
if(d10 > 0)
::glColor3ub(m_red_ramp.r(i10),m_red_ramp.g(i10),m_red_ramp.b(i10));
else
::glColor3ub(m_blue_ramp.r(i10),m_blue_ramp.g(i10),m_blue_ramp.b(i10));
::glVertex3d(p10.x(),p10.y(),p10.z()); ::glVertex3d(p10.x(),p10.y(),p10.z());
} }
::glEnd(); ::glEnd();
@ -429,9 +434,9 @@ void Scene::benchmark_distances()
tree.accelerate_distance_queries(); tree.accelerate_distance_queries();
std::cout << "done (" << time.elapsed() << " ms)" << std::endl; std::cout << "done (" << time.elapsed() << " ms)" << std::endl;
// (cache experiments) // TODO: check what the KD-tree is doing in there for large models.
std::cout << "First call to populate the cache:" << std::endl; std::cout << "One single call to initialize KD-tree" << std::endl;
bench_closest_point(tree); tree.closest_point(CGAL::ORIGIN);
std::cout << "------- Now, the real benchmark -------" << std::endl; std::cout << "------- Now, the real benchmark -------" << std::endl;
bench_closest_point(tree); bench_closest_point(tree);

View File

@ -71,7 +71,9 @@ private:
bool m_signed_distance_function; bool m_signed_distance_function;
typedef std::pair<Point,FT> Point_distance; typedef std::pair<Point,FT> Point_distance;
Point_distance m_distance_function[100][100]; Point_distance m_distance_function[100][100];
Color_ramp m_ramp; Color_ramp m_thermal_ramp;
Color_ramp m_red_ramp;
Color_ramp m_blue_ramp;
// view options // view options
bool m_view_points; bool m_view_points;

View File

@ -63,11 +63,8 @@ The surface triangle mesh chosen for benchmarking distances is again the knot mo
14,400 & 157 & 31,472 & 33,529 & 34,817 \\ 14,400 & 157 & 31,472 & 33,529 & 34,817 \\
57,600 & 330 & 15,602 & 16,355 & 17,106 \\ 57,600 & 330 & 15,602 & 16,355 & 17,106 \\
230,400 & 1,203 & 6,528 & 8,287 & 8,683 \\ 230,400 & 1,203 & 6,528 & 8,287 & 8,683 \\
921,600 & 5,047 & 563 & 4,221 & 4,424 \\ 921,600 & 5,047 & 4,399 & 4,221 & 4,424 \\
\hline \hline
\end{tabular} \end{tabular}
% TOFIX: understand why we mesure 563 above (measure is repeatable).