We see that the number types for the function CGAL::orientation can vary.
The following uses the normal 2D point type:
// examples/Tutorial_SCG99/orientation.C
// -------------------------------------
#include "tutorial.h"
#include <CGAL/Point_2.h>
#include <CGAL/predicates_on_points_2.h>
#include <iostream>
int main() {
Point p( 1.0, 0.0);
Point q( 1.3, 1.7);
Point r( 2.2, 6.8);
switch ( CGAL::orientation( p, q, r)) {
case CGAL::LEFTTURN: std::cout << "Left turn.\n"; break;
case CGAL::RIGHTTURN: std::cout << "Right turn.\n"; break;
case CGAL::COLLINEAR: std::cout << "Collinear.\n"; break;
}
return 0;
}
The following uses the 2D point type with exact numbers:
// examples/Tutorial_SCG99/exact_orientation.C
// -------------------------------------------
#include <CGAL/Homogeneous.h>
#include <CGAL/Point_2.h>
#include <CGAL/predicates_on_points_2.h>
#include <iostream>
typedef CGAL::Homogeneous<long> Rep;
typedef CGAL::Point_2<Rep> Point;
int main() {
Point p( 10, 0, 10);
Point q( 13, 17, 10);
Point r( 22, 68, 10);
switch ( CGAL::orientation( p, q, r)) {
case CGAL::LEFTTURN: std::cout << "Left turn.\n"; break;
case CGAL::RIGHTTURN: std::cout << "Right turn.\n"; break;
case CGAL::COLLINEAR: std::cout << "Collinear.\n"; break;
}
return 0;
}
We see it's OK to use the same function CGAL::orientation to operate on both types.