📄 geomview_stream.h
字号:
output_segment(gv, segment); return gv;}#endif#if defined CGAL_SEGMENT_3_H && \ !defined CGAL_GV_OUT_SEGMENT_3_H#define CGAL_GV_OUT_SEGMENT_3_Htemplate < class R >Geomview_stream&operator<<(Geomview_stream &gv, const Segment_3<R> &segment){ output_segment(gv, segment); return gv;}#endif// The following code is the same for Triangle_2 and Triangle_3.template < class Triangle >voidoutput_triangle(Geomview_stream &gv, const Triangle &triangle){ bool ascii_bak = gv.set_ascii_mode(); gv << "(geometry " << gv.get_new_id("Tr") << " {appearance {+edge material {edgecolor " << gv.ecr() << gv.ecg() << gv.ecb() << " } shading constant}{ "; gv.set_binary_mode(); // it's a planar polygon gv << "OFF BINARY\n" // it has 3 vertices, 1 face and 3 edges << 3 << 1 << 3; bool raw_bak = gv.set_raw(true); for(int i=0; i<3; i++) gv << triangle[i]; gv.set_raw(raw_bak); // the face gv << 3 << 0 << 1 << 2 << 4 << gv.fcr() << gv.fcg() << gv.fcb() << 1.0 << "}})"; gv.set_ascii_mode(ascii_bak);}// Draws a set of triangles as OFF format (it's faster than one by one).template < class InputIterator >voidGeomview_stream::draw_triangles(InputIterator begin, InputIterator end){ typedef typename std::iterator_traits<InputIterator>::value_type Triangle; typedef typename Kernel_traits<Triangle>::Kernel Kernel; typedef typename Kernel::Point_3 Point; typedef typename Kernel::Less_xyz_3 Comp; // We first copy everything in a vector to only require an InputIterator. std::vector<Triangle> triangles(begin, end); typedef typename std::vector<Triangle>::const_iterator Tit; // Put the points in a map and a vector. // The index of a point in the vector is the value associated // to it in the map. typedef std::map<Point, int, Comp> Point_map; Point_map point_map(Kernel().less_xyz_3_object()); std::vector<Point> points; for (Tit i = triangles.begin(); i != triangles.end(); ++i) for (int j = 0; j < 3; ++j) if (point_map.insert(typename Point_map::value_type(i->vertex(j), points.size())).second) points.push_back(i->vertex(j)); bool ascii_bak = get_ascii_mode(); bool raw_bak = set_raw(true); // Header. set_binary_mode(); (*this) << "(geometry " << get_new_id("triangles") << " {appearance {}{ OFF BINARY\n" << points.size() << triangles.size() << 0; // Points coordinates. std::copy(points.begin(), points.end(), Ostream_iterator<Point, Geomview_stream>(*this)); // Triangles vertices indices. for (Tit tit = triangles.begin(); tit != triangles.end(); ++tit) { (*this) << 3; for (int j = 0; j < 3; ++j) (*this) << point_map[tit->vertex(j)]; (*this) << 0; // without color. } // Footer. (*this) << "}})"; set_raw(raw_bak); set_ascii_mode(ascii_bak);}#if defined CGAL_TRIANGLE_2_H && \ !defined CGAL_GV_OUT_TRIANGLE_2_H#define CGAL_GV_OUT_TRIANGLE_2_Htemplate < class R >Geomview_stream&operator<<(Geomview_stream &gv, const Triangle_2<R> &triangle){ output_triangle(gv, triangle); return gv;}#endif#if defined CGAL_TRIANGLE_3_H && \ !defined CGAL_GV_OUT_TRIANGLE_3_H#define CGAL_GV_OUT_TRIANGLE_3_Htemplate < class R >Geomview_stream&operator<<(Geomview_stream &gv, const Triangle_3<R> &triangle){ output_triangle(gv, triangle); return gv;}#endif#if defined CGAL_TETRAHEDRON_3_H && \ !defined CGAL_GV_OUT_TETRAHEDRON_3_H#define CGAL_GV_OUT_TETRAHEDRON_3_Htemplate < class R >Geomview_stream&operator<<(Geomview_stream &gv, const Tetrahedron_3<R> &t){ bool ascii_bak = gv.set_ascii_mode(); gv << "(geometry " << gv.get_new_id("Tetra") << " {appearance {}{ "; gv.set_binary_mode(); gv << "OFF BINARY\n" // it has 4 vertices, 4 face and 6 edges << 4 << 4 << 6 ; // the vertices bool raw_bak = gv.set_raw(true); for(int i=0; i<4; i++) gv << t[i]; gv.set_raw(raw_bak); // the faces double r = gv.fcr(), g = gv.fcg(), b = gv.fcb(); gv << 3 << 0 << 1 << 2 << 4 << r << g << b << 1.0 << 3 << 3 << 0 << 1 << 4 << r << g << b << 1.0 << 3 << 3 << 1 << 2 << 4 << r << g << b << 1.0 << 3 << 3 << 0 << 2 << 4 << r << g << b << 1.0 << "}})"; gv.set_ascii_mode(ascii_bak); return gv;}#endif#if defined CGAL_SPHERE_3_H && \ !defined CGAL_GV_OUT_SPHERE_3_H#define CGAL_GV_OUT_SPHERE_3_Htemplate < class R >Geomview_stream&operator<<(Geomview_stream &gv, const Sphere_3<R> &S){ bool ascii_bak = gv.set_ascii_mode(); gv << "(geometry " << gv.get_new_id("Sph") << " {appearance {+edge material {edgecolor " << gv.ecr() << gv.ecg() << gv.ecb() << "} shading constant}{ " << "SPHERE\n" << CGAL_CLIB_STD::sqrt(CGAL::to_double(S.squared_radius())) << "\n"; bool raw_bak = gv.set_raw(true); gv << Point_3<R>(S.center()) << "}})"; gv.set_raw(raw_bak); gv.set_ascii_mode(ascii_bak); return gv;}#endif#if defined CGAL_RAY_2_H && \ !defined CGAL_GV_OUT_RAY_2_H#define CGAL_GV_OUT_RAY_2_Htemplate < class R >Geomview_stream&operator<<(Geomview_stream &gv, const Ray_2<R> &r){ // Note: it won't work if double is not convertible to an RT... const Bbox_3 & bb = gv.get_bbox(); Object result = intersection(Iso_rectangle_2<R>( Point_2<R>(bb.xmin(), bb.ymin()), Point_2<R>(bb.xmax(), bb.ymax())), r); Point_2<R> ipoint; Segment_2<R> iseg; if (assign(ipoint, result)) gv << ipoint; else if (assign(iseg, result)) gv << iseg; return gv;}#endif#if defined CGAL_LINE_2_H && \ !defined CGAL_GV_OUT_LINE_2_H#define CGAL_GV_OUT_LINE_2_Htemplate < class R >Geomview_stream&operator<<(Geomview_stream &gv, const Line_2<R> &r){ // Note: it won't work if double is not convertible to an RT... const Bbox_3 & bb = gv.get_bbox(); Object result = intersection(Iso_rectangle_2<R>( Point_2<R>(bb.xmin(), bb.ymin()), Point_2<R>(bb.xmax(), bb.ymax())), r); Point_2<R> ipoint; Segment_2<R> iseg; if (assign(ipoint, result)) gv << ipoint; else if (assign(iseg, result)) gv << iseg; return gv;}#endif// Ray and Line drawing should be done by intersecting them with the BBox// of the Geomview_stream. But for now we take the easy approach.#if defined CGAL_RAY_3_H && \ !defined CGAL_GV_OUT_RAY_3_H#define CGAL_GV_OUT_RAY_3_Htemplate < class R >Geomview_stream&operator<<(Geomview_stream &gv, const Ray_3<R> &r){ typename R::Segment_3 s(r.source(), r.point(1)); gv << s; return gv;}#endif#if defined CGAL_LINE_3_H && \ !defined CGAL_GV_OUT_LINE_3_H#define CGAL_GV_OUT_LINE_3_Htemplate < class R >Geomview_stream&operator<<(Geomview_stream &gv, const Line_3<R> &r){ typename R::Segment_3 s(r.point(-1), r.point(1)); gv << s; return gv;}#endifGeomview_stream&operator<<(Geomview_stream &gv, const Bbox_2 &bbox);Geomview_stream&operator<<(Geomview_stream &gv, const Bbox_3 &bbox);#if defined CGAL_POINT_3_H && !defined CGAL_GV_IN_POINT_3_H#define CGAL_GV_IN_POINT_3_Htemplate < class R >Geomview_stream&operator>>(Geomview_stream &gv, Point_3<R> &point){ const char *gclpick = "(pick world pickplane * nil nil nil nil nil nil nil)"; bool ascii_bak = gv.set_ascii_mode(); gv << "(pickable pickplane yes) (ui-target pickplane yes)" << "(interest " << gclpick << ")"; char sexpr[1024]; gv >> sexpr; // this reads a gcl expression const char* pickpoint = Geomview_stream::nth(sexpr, 3); // this gives something as: (0.0607123 0.0607125 4.76837e-07 0.529628) double x, y, z, w; Geomview_stream::parse_point(pickpoint, x, y, z, w); point = Point_3<R>(x, y, z, w); // we echo the input if (gv.get_echo()) gv << point; // we are done and tell geomview to stop sending pick events gv << "(uninterest " << gclpick << ") (pickable pickplane no)"; gv.set_ascii_mode(ascii_bak); return gv;}#endifCGAL_END_NAMESPACE#endif // CGAL_GEOMVIEW_STREAM_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -