r7061: initial property settings
[ctsim.git] / libctgraphics / sgp.cpp
index ec6b89d4a936dcff1fe103a2a362232525bb4b15..65095c8968e062ef4b3b7f99943a924e2ae3c6a7 100644 (file)
@@ -5,9 +5,9 @@
 **     Programmer: Kevin Rosenberg
 **
 **  This is part of the CTSim program
-**  Copyright (C) 1983-2000 Kevin Rosenberg
+**  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: sgp.cpp,v 1.27 2001/01/12 21:53:27 kevin Exp $
+**  $Id$
 **
 **  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
 #include "sgp.h"
 
 
-RGBColor SGP::s_aRGBColor[] =
-{
-  RGBColor (0, 0, 0),
-  RGBColor (0, 0, 128),
-  RGBColor (0, 128, 0),
-  RGBColor (0, 128, 128),
-  RGBColor (128, 0, 0),
-  RGBColor (128, 0, 128),
-  RGBColor (128, 128, 0),
-  RGBColor (80, 80, 80),
-  RGBColor (160, 160, 160),
-  RGBColor (0, 0, 255),
-  RGBColor (0, 255, 0),
-  RGBColor (0, 255, 255),
-  RGBColor (255, 0, 0),
-  RGBColor (255, 0, 255),
-  RGBColor (255, 255, 0),
-  RGBColor (255, 255, 255),
+SGP_RGBColor SGP::s_aRGBColor[] =
+{
+  SGP_RGBColor (0, 0, 0),
+  SGP_RGBColor (0, 0, 128),
+  SGP_RGBColor (0, 128, 0),
+  SGP_RGBColor (0, 128, 128),
+  SGP_RGBColor (128, 0, 0),
+  SGP_RGBColor (128, 0, 128),
+  SGP_RGBColor (128, 128, 0),
+  SGP_RGBColor (80, 80, 80),
+  SGP_RGBColor (160, 160, 160),
+  SGP_RGBColor (0, 0, 255),
+  SGP_RGBColor (0, 255, 0),
+  SGP_RGBColor (0, 255, 255),
+  SGP_RGBColor (255, 0, 0),
+  SGP_RGBColor (255, 0, 255),
+  SGP_RGBColor (255, 255, 0),
+  SGP_RGBColor (255, 255, 255),
 };
 
-int SGP::s_iRGBColorCount = sizeof(s_aRGBColor) / sizeof(class RGBColor);
+int SGP::s_iRGBColorCount = sizeof(s_aRGBColor) / sizeof(class SGP_RGBColor);
 
 #ifdef HAVE_WXWINDOWS
 SGPDriver::SGPDriver (wxDC* pDC, int xsize, int ysize)
@@ -104,6 +104,7 @@ SGP::SGP (const SGPDriver& driver)
   setTextPointSize (12);
   setColor (C_BLACK);
   setLineStyle (LS_SOLID);
+  setMarker (MARKER_POINT);
 }
 
 
@@ -170,11 +171,38 @@ SGP::stylusNDC (double x, double y, bool beam)
 void
 SGP::markerNDC (double x, double y)
 {
+  int xp = static_cast<int>(x * (m_iPhysicalXSize - 1) + 0.5);
+  int yp = static_cast<int>(y * (m_iPhysicalYSize - 1) + 0.5);
+  if (m_driver.isWX())
+    yp = m_iPhysicalYSize - yp;
+
+#if HAVE_WXWINDOWS
+  if (m_driver.isWX()) {
+      m_driver.idWX()->DrawPoint (xp, yp);
+      m_driver.idWX()->DrawPoint (xp-1, yp-1);
+      m_driver.idWX()->DrawPoint (xp+1, yp+1);
+      m_driver.idWX()->DrawPoint (xp+1, yp-1);
+      m_driver.idWX()->DrawPoint (xp-1, yp+1);
+  }
+#endif
+  m_iCurrentPhysicalX = xp;
+  m_iCurrentPhysicalY = yp;
 }
 
 void
 SGP::pointNDC (double x, double y)
 {
+  int xp = static_cast<int>(x * (m_iPhysicalXSize - 1) + 0.5);
+  int yp = static_cast<int>(y * (m_iPhysicalYSize - 1) + 0.5);
+  if (m_driver.isWX())
+    yp = m_iPhysicalYSize - yp;
+
+#if HAVE_WXWINDOWS
+    if (m_driver.isWX())
+      m_driver.idWX()->DrawPoint (xp, yp);
+#endif
+  m_iCurrentPhysicalX = xp;
+  m_iCurrentPhysicalY = yp;
 }
 
 
@@ -395,8 +423,9 @@ SGP::setRasterOp (int ro)
 
 
 void
-SGP::setMarker (int idMarke, int iColor)
+SGP::setMarker (int idMarker)
 {
+  m_iMarker = idMarker;
 }
 
 //==============================================================
@@ -564,7 +593,7 @@ SGP::getCharHeight ()
   if (m_driver.isWX()) {
     dHeight = m_driver.idWX()->GetCharHeight();
     dHeight /= static_cast<double>(m_iPhysicalYSize);
-       dHeight /= (yv_max - yv_min); // scale to viewport;
+         dHeight /= (yv_max - yv_min); // scale to viewport;
   }
 #endif
   dHeight *= (yw_max - yw_min);  // scale to world coordinates
@@ -580,7 +609,7 @@ SGP::getCharWidth ()
   if (m_driver.isWX()) {
     dWidth = m_driver.idWX()->GetCharWidth();
     dWidth /= static_cast<double>(m_iPhysicalXSize);
-       dWidth /= (xv_max - xv_min); // scale to viewport
+         dWidth /= (xv_max - xv_min); // scale to viewport
   }
 #endif
   dWidth *= (xw_max - xw_min); //scale to world coordinates
@@ -636,7 +665,6 @@ SGP::markerAbs (double x, double y)
   double yndc = y;
   mc_to_ndc.transformPoint (&xndc, &yndc);
   markerNDC (xndc, yndc); 
-  stylusNDC (xndc, yndc, false);            // move to location 
   m_dCurrentWorldX = x;
   m_dCurrentWorldY = y;
 }
@@ -657,7 +685,6 @@ SGP::pointAbs (double x, double y)
   double xndc = x, yndc = y;
   mc_to_ndc.transformPoint (&xndc, &yndc);
   pointNDC (xndc, yndc);
-  stylusNDC (xndc, yndc, false);            // move to location 
   m_dCurrentWorldX = x;
   m_dCurrentWorldY = y;
 }
@@ -746,31 +773,32 @@ SGP::drawArc (const double r, double start, double stop)
     stop = temp;
   }
 
-  double x = r * cos ((double) start);
-  double y = r * sin ((double) start);
-  moveRel (x, y);          // move from center to start of arc 
+  double xCent = m_dCurrentWorldX;
+  double yCent = m_dCurrentWorldY;
+
+  double x = r * cos (start);
+  double y = r * sin (start);
+  moveAbs (xCent + x, yCent + y);          // move from center to start of arc 
 
-  const double thetaIncrement = (5 * (TWOPI / 360)); 
-  double cosTheta = cos(thetaIncrement);
-  double sinTheta = sin(thetaIncrement);
+  const double thetaIncrement = (5 * (TWOPI / 360));  // 5 degree increments
+  double cosTheta = cos (thetaIncrement);
+  double sinTheta = sin (thetaIncrement);
 
-  double angle, xp, yp;
-  for (angle = start; angle < stop - thetaIncrement; angle += thetaIncrement) {
-    xp = cosTheta * x - sinTheta * y; // translate point by thetaIncrement
-    yp = sinTheta * x + cosTheta * y;
-    lineAbs (xp, yp);
+  double angle;
+  for (angle = start; angle < stop; angle += thetaIncrement) {
+    double xp = cosTheta * x - sinTheta * y; // translate point by thetaIncrement
+    double yp = sinTheta * x + cosTheta * y;
+    lineAbs (xCent + xp, yCent + yp);
     x = xp; y = yp;
   }
 
   double c = cos (stop - angle);
   double s = sin (stop - angle);
-  xp = c * x - s * y;
-  yp = s * x + c * y;
-  lineAbs (xp, yp);
+  double xp = c * x - s * y;
+  double yp = s * x + c * y;
+  lineAbs (xCent + xp, yCent + yp);
 
-  x = r * cos (stop);
-  y = r * sin (stop);
-  moveRel (-x, -y);            // move back to center of circle 
+  moveAbs (xCent, yCent);              // move back to center of circle 
 }