Cairo support works, both to draw in the window and to write as a png image in a...
[universe.git] / polygon.cc
index 75163cb..1c109c3 100644 (file)
@@ -1,17 +1,6 @@
 
-////////////////////////////////////////////////////////////////////////////////
-// This program is free software; you can redistribute it and/or              //
-// modify it under the terms of the GNU General Public License                //
-// version 2 as published by the Free Software Foundation.                    //
-//                                                                            //
-// This program is distributed in the hope that it will be useful, but        //
-// WITHOUT ANY WARRANTY; without even the implied warranty of                 //
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          //
-// General Public License for more details.                                   //
-//                                                                            //
-// Written and (C) by François Fleuret                                        //
-// Contact <francois.fleuret@epfl.ch> for comments & bug reports              //
-////////////////////////////////////////////////////////////////////////////////
+// Written and (C) by Francois Fleuret
+// Contact <francois.fleuret@idiap.ch> for comments & bug reports
 
 #include <cmath>
 #include "polygon.h"
@@ -58,12 +47,13 @@ Polygon *Polygon::clone() {
   return new Polygon(_mass, _red, _green, _blue, _relative_x, _relative_y, _nb_vertices);
 }
 
-void Polygon::print_fig(ostream &os) {
-  os << "2 2 0 1 0 7 50 -1 20 0.000 0 0 -1 0 0 " << _nb_vertices + 1 << endl;
-  os << "      ";
-  for(int n = 0; n < _nb_vertices; n++) os << " " << int(_x[n]*10) << " " << int(_y[n]*10);
-  os << " " << int(_x[0]*10) << " " << int(_y[0]*10);
-  os << endl;
+void Polygon::color_xfig(XFigTracer *tracer) {
+  tracer->add_color(int(255 * _red), int(255 * _green), int(255 * _blue));
+}
+
+void Polygon::print_xfig(XFigTracer *tracer) {
+  tracer->draw_polygon(int(255 * _red), int(255 * _green), int(255 * _blue),
+                       _nb_vertices, _x, _y);
 }
 
 void Polygon::draw(SimpleWindow *window) {
@@ -82,11 +72,39 @@ void Polygon::draw_contours(SimpleWindow *window) {
     x[n] = int(_x[n]);
     y[n] = int(_y[n]);
   }
-  window->color(0.0, 0.0, 0.0);
-  for(int n = 0; n < _nb_vertices; n++)
+  // window->color(0.0, 0.0, 0.0);
+  window->color(1.0, 1.0, 1.0);
+  for(int n = 0; n < _nb_vertices; n++) {
     window->draw_line(x[n], y[n], x[(n+1)%_nb_vertices], y[(n+1)%_nb_vertices]);
+  }
 }
 
+#ifdef CAIRO_SUPPORT
+void Polygon::draw(cairo_t* context_resource) {
+  cairo_set_line_width(context_resource, 1.0);
+  cairo_set_source_rgb (context_resource, _red, _green, _blue);
+  cairo_move_to(context_resource, _x[0], _y[0]);
+  for(int n = 0; n < _nb_vertices; n++) {
+    cairo_line_to(context_resource, _x[n], _y[n]);
+  }
+  cairo_close_path(context_resource);
+  cairo_stroke_preserve(context_resource);
+  cairo_fill(context_resource);
+}
+
+void Polygon::draw_contours(cairo_t* context_resource) {
+  cairo_set_line_width(context_resource, 1.0);
+  // cairo_set_source_rgb (context_resource, 0.0, 0.0, 0.0);
+  cairo_set_source_rgb (context_resource, 1.0, 1.0, 1.0);
+  cairo_move_to(context_resource, _x[0], _y[0]);
+  for(int n = 0; n < _nb_vertices; n++) {
+    cairo_line_to(context_resource, _x[n], _y[n]);
+  }
+  cairo_close_path(context_resource);
+  cairo_stroke(context_resource);
+}
+#endif
+
 void Polygon::set_vertex(int k, scalar_t x, scalar_t y) {
   _relative_x[k] = x;
   _relative_y[k] = y;
@@ -157,7 +175,7 @@ void Polygon::triangularize(int &nt, int nb, int *index) {
                           _relative_x[index[(k+1)%nb]] - _relative_x[index[m]],
                           _relative_y[index[(k+1)%nb]] - _relative_y[index[m]]);
 
-        if(a1 * a2 > 0 && best_split < 0 || (abs(a1 - a2) < best_split)) {
+        if((a1 * a2 > 0 && best_split < 0) || (abs(a1 - a2) < best_split)) {
           best_n = n; best_m = m;
           best_split = abs(a1 - a2);
         }
@@ -499,4 +517,3 @@ bool Polygon::collide(Polygon *p) {
 
   return false;
 }
-