X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctgraphics%2Fsgp.cpp;h=65095c8968e062ef4b3b7f99943a924e2ae3c6a7;hp=263101fa3766e010ccd3553a5c8ed50e3b49559b;hb=8a7697ce57b56cdc43698cd1241ad98d49f9b5ac;hpb=23f5654dacb1952c15bda92c2606fae3a55e48ad diff --git a/libctgraphics/sgp.cpp b/libctgraphics/sgp.cpp index 263101f..65095c8 100644 --- a/libctgraphics/sgp.cpp +++ b/libctgraphics/sgp.cpp @@ -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.26 2001/01/04 21:28:41 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 @@ -29,27 +29,27 @@ #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); } @@ -139,7 +140,7 @@ SGP::~SGP() { #if HAVE_WXWINDOWS if (m_driver.isWX()) { - m_driver.idWX()->SetFont (wxNullFont); + // m_driver.idWX()->SetFont (wxNullFont); delete m_pFont; } #endif @@ -170,11 +171,38 @@ SGP::stylusNDC (double x, double y, bool beam) void SGP::markerNDC (double x, double y) { + int xp = static_cast(x * (m_iPhysicalXSize - 1) + 0.5); + int yp = static_cast(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(x * (m_iPhysicalXSize - 1) + 0.5); + int yp = static_cast(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(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(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 }