- Authors
- Andreas Fabri and Sylvain Pion
Definition
This chapter presents the CGAL interface to Geomview , which is a viewer for three-dimensional objects, originally developed at the Geometry Center in Minneapolis .
Note: The functionality described in this chapter is not available on Windows.
An object of the class Geomview_stream
is a stream in which geometric objects can be inserted and where geometric objects can be extracted from. The constructor starts Geomview either on the local either on a remote machine.
Not all but most classes of the CGAL kernel have output operators for the Geomview_stream
. 2D objects are embedded in the xy
-plane. Input is only provided for points. Polyhedron and 2D and 3D triangulations have output operators for the Geomview_stream
.
Implementation
The constructor forks a process and establishes two pipes between the processes. The forked process is then overlaid with Geomview. The file descriptors stdin
and stdout
of Geomview are hooked on the two pipes.
All insert operators construct expressions in gcl
, the Geomview command language, which is a subset of Lisp. These expressions are sent to Geomview via the pipe. The extract operators notify interest
for a certain kind of events. When such an event happens Geomview sends a description of the event in gcl
and the extract operator has to parse this expression.
In order to implement further insert and extract operators you should take a look at the implementation and at the Geomview manual.
Example
The following program ouputs successively a 2D Delaunay triangulation (projected), a 3D Delaunay, and a terrain from the set of points.
File Geomview/gv_terrain.cpp
#include <CGAL/Cartesian.h>
#include <iostream>
#ifndef CGAL_USE_GEOMVIEW
int main()
{
std::cout << "Geomview doesn't work on Windows, so..." << std::endl;
return 0;
}
#else
#include <fstream>
#include <unistd.h>
#include <CGAL/Projection_traits_xy_3.h>
#include <CGAL/Delaunay_triangulation_2.h>
#include <CGAL/Delaunay_triangulation_3.h>
#include <CGAL/IO/Geomview_stream.h>
#include <CGAL/IO/Triangulation_geomview_ostream_2.h>
#include <CGAL/IO/Triangulation_geomview_ostream_3.h>
#include <CGAL/intersections.h>
typedef K::Point_2 Point2;
typedef Gt3::Point Point3;
int main()
{
gv.set_line_width(4);
Delaunay D;
Delaunay3d D3d;
Terrain T;
std::ifstream iFile("data/points3", std::ios::in);
Point3 p;
while ( iFile >> p )
{
D.insert( Point2(p.x(), p.y()) );
D3d.insert( p );
T.insert( p );
}
gv << CGAL::IO::blue();
std::cout << "Drawing 2D Delaunay triangulation in wired mode.\n";
gv.set_wired(true);
gv << D;
#if 1 // It's too slow ! Needs to use OFF for that.
gv << CGAL::IO::red();
std::cout << "Drawing its Voronoi diagram.\n";
gv.set_wired(true);
D.draw_dual(gv);
#endif
sleep(5);
gv.clear();
std::cout << "Drawing 2D Delaunay triangulation in non-wired mode.\n";
gv.set_wired(false);
gv << D;
sleep(5);
gv.clear();
std::cout << "Drawing 3D Delaunay triangulation in wired mode.\n";
gv.set_wired(true);
gv << D3d;
sleep(5);
gv.clear();
std::cout << "Drawing 3D Delaunay triangulation in non-wired mode.\n";
gv.set_wired(false);
gv << D3d;
sleep(5);
gv.clear();
std::cout << "Drawing Terrain in wired mode.\n";
gv.set_wired(true);
gv << T;
sleep(5);
gv.clear();
std::cout << "Drawing Terrain in non-wired mode.\n";
gv.set_wired(false);
gv << T;
std::cout << "Enter a key to finish" << std::endl;
char ch;
std::cin >> ch;
return 0;
}
#endif