r104: initial cvs import
[ctsim.git] / libctgraphics / circle.cpp
diff --git a/libctgraphics/circle.cpp b/libctgraphics/circle.cpp
new file mode 100644 (file)
index 0000000..373edae
--- /dev/null
@@ -0,0 +1,90 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: circle.cpp,v 1.1 2000/06/19 18:05:03 kevin Exp $
+**  $Log: circle.cpp,v $
+**  Revision 1.1  2000/06/19 18:05:03  kevin
+**  initial cvs import
+**
+**  Revision 1.1  2000/06/13 16:20:31  kevin
+**  finished c++ conversions
+**
+**  Revision 1.2  2000/05/24 22:49:01  kevin
+**  Updated SGP: first function X-windows version
+**
+**  Revision 1.1.1.1  2000/04/28 13:02:44  kevin
+**  Initial CVS import for first public release
+**
+**
+**
+**  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.
+**
+**  You should have received a copy of the GNU General Public License
+**  along with this program; if not, write to the Free Software
+**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+******************************************************************************/
+
+/* FUNCTION
+ * sgp2_circle - draw circle of radius r at current center             
+ */
+
+#include "math.h"
+#include "kmath.h"
+#include "sgp.h"
+
+void 
+sgp2_draw_circle (const double r)
+{
+       sgp2_draw_arc (0.0, 7.0, r);
+}
+
+/*==============================================================*/
+/* draw arc around current center.  pass angles and radius     */
+/*==============================================================*/
+
+void 
+sgp2_draw_arc (double start, double stop, const double r)
+{
+       double c, s, theta, angle;
+       float x, y, xp, yp;
+
+       if ((stop-start) > 2 * PI)
+           stop = start + 2 * PI;
+       if ((start-stop) > 2 * PI)
+           stop = start + 2 * PI;
+       while (start >= stop)
+           stop += 2*PI;
+
+       x = r * cos ((double) start);
+       y = r * sin ((double) start);
+       sgp2_move_rel (x, y);          /* move from center to start of arc */
+
+       theta = 5 * PI / 180;
+       c = cos(theta);
+       s = sin(theta);
+
+       for (angle = start; angle < stop - theta; angle += theta) {
+           xp = c * x - s * y;
+           yp = s * x + c * y;
+           sgp2_line_rel (xp - x, yp - y);
+           x = xp; y = yp;
+       }
+
+       c = cos (stop - angle);
+       s = sin (stop - angle);
+       xp = c * x - s * y;
+       yp = s * x + c * y;
+       sgp2_line_rel (xp - x, yp - y);
+
+       x = r * cos ((double) stop);
+       y = r * sin ((double) stop);
+       sgp2_move_rel (-x, -y);         /* move back to center of circle */
+}