diff --git a/Documentation/doc/Documentation/Getting_started.txt b/Documentation/doc/Documentation/Getting_started.txt
index d3e6418518a..f3ecf12d740 100644
--- a/Documentation/doc/Documentation/Getting_started.txt
+++ b/Documentation/doc/Documentation/Getting_started.txt
@@ -3,7 +3,12 @@
- \subpage installation describes how to install %CGAL, and lists the third party libraries on which %CGAL depends, or for which %CGAL provides interfaces.
-- \subpage introduction presents you some short example programs to get a first idea of the look and feel of a program that uses %CGAL.
+- \subpage introduction presents you some short example programs to
+ get a first idea for the look and feel of a program that uses \cgal.
+ We introduce the notion of the \em kernel which defines geometric primitives,
+ the notion of traits classes which define what primitives are used
+ by a geometric algorithm, the notions of \em concept and \em model.
+
- \subpage preliminaries lists the licenses under which the %CGAL datastructures and algorithms are distributed, how to control inlining, thread safety, code deprecation, checking of pre- and postconditions, and how to alter the failure behavior.
diff --git a/Documentation/doc/Documentation/Introduction.txt b/Documentation/doc/Documentation/Introduction.txt
index 508830de40b..b761093caed 100644
--- a/Documentation/doc/Documentation/Introduction.txt
+++ b/Documentation/doc/Documentation/Introduction.txt
@@ -32,8 +32,12 @@ In this first example we see how to construct some points
and a segment, and we perform some basic operations on them.
All \cgal header files are in the subdirectory `include/CGAL`. All \cgal
-classes and functions are in the namespace `CGAL`. The geometric
-primitives, like the point type, are defined in a \em kernel.
+classes and functions are in the namespace `CGAL`.
+Classes start with a capital letter, global
+function with a lowercase letter, and constants are all uppercase.
+The dimension of an object is expressed with a suffix.
+
+The geometric primitives, like the point type, are defined in a \em kernel.
The kernel we have chosen for this first example uses `double`
precision floating point numbers for the %Cartesian coordinates of the point.
@@ -43,6 +47,8 @@ computation. A predicate has a discrete set of possible answers,
whereas a construction produces either a number, or another
geometric entity.
+
+
\cgalExample{Kernel_23/points_and_segment.cpp}
@@ -52,9 +58,17 @@ as the next example shows.
\cgalExample{Kernel_23/surprising.cpp}
+When reading the code, we would assume that it prints three times "collinear".
+However we obtain:
-When reading the code, we would assume that it prints three times "collinear",
-but as the fractions are not representable as double precision number
+\verbatim
+not collinear
+not collinear
+collinear
+\endverbatim
+
+
+As the fractions are not representable as double precision number
the collinearity test will internally compute a determinant of a 3x3 matrix
which is close but not equal to zero, and hence the non collinearity for the
first two tests.
@@ -63,9 +77,9 @@ Something similar can happen with points that perform a left turn,
but due to rounding errors during the determinant computation, it
seems that the points are collinear, or perform a right turn.
-If you need that the number gets interpreted at its full precision
+If you need that the numbers get interpreted at their full precision
you can use a \cgal kernel that performs exact predicates and
-constructions.
+extract constructions.
\cgalExample{Kernel_23/exact.cpp}
@@ -92,8 +106,10 @@ Most \cgal packages explain what kind of kernel they need or support.
\section intro_convex_hull The Convex Hull of a Sequence of Points
All examples in this section compute the 2D convex hull of a set of points.
-The convex hull function expects by a begin/end iterator pair denoting a sequence of points,
-and it writes the points on the convex hull into an output iterator.
+We show that algorithms get their input as a begin/end iterator pair
+denoting a range of points, and that they write the result, in the
+example the points on the convex hull, into an output iterator.
+
\subsection intro_array The Convex Hull of Points in a Built-in Array
@@ -144,36 +160,6 @@ iterator generated by the helper function
`std::back_inserter(result)`. This output iterator does nothing when
incremented, and calls `result.push_back(..)` on the assignment.
-\subsection intro_streams The Convex Hull of Points in a Stream
-
-The next example program reads a sequence of points from standard
-input `std::cin` and writes the points on the convex hull to standard
-output `std::cout`.
-
-Instead of storing the points in a container such as an `std::vector`,
-and passing the begin/end iterator of the vector to the convex hull
-function, we use helper classes that turn file pointers into
-iterators.
-
-\cgalExample{Convex_hull_2/iostream_convex_hull_2.cpp}
-
-In the example code you see input and output stream iterators
-templated with the point type. A `std::istream_iterator`
-hence allows to traverse a sequence of objects of type `Point_2`, which
-come from standard input as we pass `std::cin` to the
-constructor of the iterator. The variable `input_end` denotes
-end-of-file.
-
-A `std::ostream_iterator` is an output iterator, that is an
-iterator to which, when dereferenced, we can assign a value. When
-such an assignment to the output iterator happens somewhere inside the
-convex hull function, the iterator just writes the assigned point to
-standard output, because the iterator was constructed with
-`std::cout`.
-
-The call to the convex hull function takes three arguments, the input
-iterator range, and the output iterator to which the result gets
-written.
If you know the \stl, the Standard Template Library, the above makes
perfect sense, as this is the way the \stl decouples algorithms from
@@ -183,13 +169,26 @@ familiarize yourself with its basic ideas.
\section intro_traits About Kernels and Traits Classes
+In this section we show how we express the requirements that must
+be fulfilled in order that a function like `convex_hull_2()`
+can be used with an arbitrary point type.
+
If you look at the manual page of the function `convex_hull_2()`
and the other 2D convex hull algorithms, you see that they come in two
versions. In the examples we have seen so far the function that takes two
-iterators for the sequence of input points and an output iterator for
+iterators for the range of input points and an output iterator for
writing the result to. The second version has an additional template
parameter `Traits`, and an additional parameter of this type.
+\code{.cpp}
+template
+OutputIterator
+convex_hull_2(InputIterator first,
+ InputIterator beyond,
+ OutputIterator result,
+ const Traits & ch_traits)
+\endcode
+
What are the geometric primitives a typical convex hull algorithm
uses? Of course, this depends on the algorithm, so let us consider
what is probably the simplest efficient algorithm, the so-called
@@ -298,7 +297,8 @@ An example for a concept with required free functions is the `HalfedgeGraph` in
there must be a global function `halfedges(const G&)`, etc.
An example for a concept with a required traits class is `InputIterator`.
-There must exist a specialization of the class `std::iterator_traits`.
+For a model of an `InputIterator` a specialization of the class `std::iterator_traits`
+must exist (or the generic template must be applicable).
\section intro_further Further Reading
diff --git a/Kernel_23/examples/Kernel_23/exact.cpp b/Kernel_23/examples/Kernel_23/exact.cpp
index 6e99833a447..0de6f546b3c 100644
--- a/Kernel_23/examples/Kernel_23/exact.cpp
+++ b/Kernel_23/examples/Kernel_23/exact.cpp
@@ -15,6 +15,5 @@ int main()
std::cout << (CGAL::collinear(p,m,r) ? "collinear\n" : "not collinear\n");
}
- std::cout << std::flush;
return 0;
}
diff --git a/Kernel_23/examples/Kernel_23/surprising.cpp b/Kernel_23/examples/Kernel_23/surprising.cpp
index f61bf7458d2..7c7e6b25ec1 100644
--- a/Kernel_23/examples/Kernel_23/surprising.cpp
+++ b/Kernel_23/examples/Kernel_23/surprising.cpp
@@ -18,6 +18,5 @@ int main()
Point_2 p(0,0), q(1, 1), r(2, 2);
std::cout << (CGAL::collinear(p,q,r) ? "collinear\n" : "not collinear\n");
}
- std::cout << std::flush;
return 0;
}