void Polyhedron_demo_nef_plugin::on_actionToNef_triggered() { const Scene_interface::Item_id index = scene->mainSelectionIndex(); Scene_polyhedron_item* item = qobject_cast<Scene_polyhedron_item*>(scene->item(index)); if(item) { QApplication::setOverrideCursor(Qt::WaitCursor); QTime time; time.start(); std::cerr << "Convert polyhedron to nef polyhedron..."; Scene_nef_polyhedron_item* new_nef_item = Scene_nef_polyhedron_item::from_polyhedron(item); new_nef_item->setName(tr("%1 (to nef)").arg(item->name())); new_nef_item->setRenderingMode(item->renderingMode()); item->setVisible(false); scene->itemChanged(index); scene->addItem(new_nef_item); std::cerr << "ok (" << time.elapsed() << " ms)" << std::endl; QApplication::restoreOverrideCursor(); } }
void Polyhedron_demo_self_intersection_plugin::on_actionSelfIntersection_triggered() { Scene_interface::Item_id index = scene->mainSelectionIndex(); Scene_polyhedron_item* item = qobject_cast<Scene_polyhedron_item*>(scene->item(index)); if(item) { Polyhedron* pMesh = item->polyhedron(); // compute self-intersections typedef std::list<Triangle>::iterator Iterator; std::list<Triangle> triangles; // intersecting triangles typedef std::back_insert_iterator<std::list<Triangle> > OutputIterator; std::cout << "Self-intersect..."; ::self_intersect<Polyhedron,Kernel,OutputIterator>(*pMesh,std::back_inserter(triangles)); std::cout << "ok (" << triangles.size() << " triangle(s))" << std::endl; // add intersecting triangles as a new polyhedron, i.e., a triangle soup. if(triangles.size() != 0) { Polyhedron *pSoup = new Polyhedron; Make_triangle_soup<Polyhedron,Kernel,Iterator> soup_builder; soup_builder.run(triangles.begin(),triangles.end(),*pSoup); Scene_polyhedron_item* new_item = new Scene_polyhedron_item(pSoup); new_item->setName(tr("%1 (intersecting triangles)").arg(item->name())); new_item->setColor(Qt::magenta); new_item->setRenderingMode(item->renderingMode()); scene->addItem(new_item); item->setRenderingMode(Wireframe); scene->itemChanged(item); } else QMessageBox::information(mw, tr("No self intersection"), tr("The polyhedron \"%1\" does not self-intersect."). arg(item->name())); } }
void Polyhedron_demo_kernel_plugin::on_actionKernel_triggered() { const Scene_interface::Item_id index = scene->mainSelectionIndex(); Scene_polyhedron_item* item = qobject_cast<Scene_polyhedron_item*>(scene->item(index)); if(item) { Polyhedron* pMesh = item->polyhedron(); typedef CGAL::Exact_integer ET; // choose exact integral type typedef Polyhedron_kernel<Kernel,ET> Polyhedron_kernel; // get triangles from polyhedron std::list<Triangle> triangles; get_triangles(*pMesh,std::back_inserter(triangles)); // solve LP std::cout << "Solve linear program..."; Polyhedron_kernel kernel; if(!kernel.solve(triangles.begin(),triangles.end())) { std::cout << "done (empty kernel)" << std::endl; QMessageBox::information(mw, tr("Empty kernel"), tr("The kernel of the polyhedron \"%1\" is empty."). arg(item->name())); QApplication::restoreOverrideCursor(); return; } std::cout << "done" << std::endl; // add kernel as new polyhedron Polyhedron *pKernel = new Polyhedron; // get inside point Point inside_point = kernel.inside_point(); Vector translate = inside_point - CGAL::ORIGIN; // compute dual of translated polyhedron w.r.t. inside point. std::cout << "Compute dual of translated polyhedron..."; std::list<Point> dual_points; std::list<Triangle>::iterator it; for(it = triangles.begin(); it != triangles.end(); it++) { const Triangle& triangle = *it; const Point p0 = triangle[0] - translate; const Point p1 = triangle[1] - translate; const Point p2 = triangle[2] - translate; Plane plane(p0,p1,p2); Vector normal = plane.orthogonal_vector(); normal = normal / std::sqrt(normal*normal); // compute distance to origin (do not use plane.d()) FT distance_to_origin = std::sqrt(CGAL::squared_distance(Point(CGAL::ORIGIN),plane)); Point dual_point = CGAL::ORIGIN + normal / distance_to_origin; dual_points.push_back(dual_point); } std::cout << "ok" << std::endl; // compute convex hull in dual space std::cout << "convex hull in dual space..."; Polyhedron convex_hull; CGAL::convex_hull_3(dual_points.begin(),dual_points.end(),convex_hull); std::cout << "ok" << std::endl; // dualize and translate back to get final kernel Dualizer<Polyhedron,Kernel> dualizer; dualizer.run(convex_hull,*pKernel); ::translate<Polyhedron,Kernel>(*pKernel,translate); pKernel->inside_out(); Scene_polyhedron_item* new_item = new Scene_polyhedron_item(pKernel); new_item->setName(tr("%1 (kernel)").arg(item->name())); new_item->setColor(Qt::magenta); new_item->setRenderingMode(item->renderingMode()); scene->addItem(new_item); item->setRenderingMode(Wireframe); scene->itemChanged(item); QApplication::restoreOverrideCursor(); } }