// VC_PLOTD.CPP #include "vc_plotd.h" #include "string.h" static float XO = 40.0F; // X offset to allow negative arguments static float YO = 25.0F; // Y offset to allow negative arguments static float F = 10.0F; // scale factor (80*F is width in virtual pixels) static CDC *pDC; // local copy static int PenSize; static CPen pen; static CBrush brush; const COLORREF red = RGB(255, 0, 0); const COLORREF green = RGB(0, 255, 0); const COLORREF blue = RGB(0, 0, 255); const COLORREF white = RGB(255, 255, 255); const COLORREF black = RGB(0, 0, 0); static void set_fill() { pen.DeleteObject(); pen.CreatePen(PS_SOLID, PenSize, black); pDC->SelectObject(&pen); brush.DeleteObject(); brush.CreateSolidBrush(red); pDC->SelectObject(&brush); pDC->SetTextColor(blue); } static void set_clear() { pen.DeleteObject(); pen.CreatePen(PS_SOLID, PenSize, white); pDC->SelectObject(&pen); brush.DeleteObject(); brush.CreateSolidBrush(white); pDC->SelectObject(&brush); } void INITIALIZE(CDC *pDC_arg) { pDC = pDC_arg; // save drawing context global to these routines, local in file PenSize = 4; pen.CreatePen(PS_SOLID, PenSize, RGB(0, 0, 0)); brush.CreateSolidBrush(green); } void DRAW_CIRCLE ( float X, float Y, float R, show KIND) { if(KIND==OUTLINE) { set_fill(); pDC->Arc((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F), (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F), (int)((X+R+XO)*F), (int)(((-Y)+YO)*F), (int)((X-R+XO)*F), (int)(((-Y)+YO)*F) ); // top pDC->Arc((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F), (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F), (int)((X-R+XO)*F), (int)(((-Y)+YO)*F), (int)((X+R+XO)*F), (int)(((-Y)+YO)*F) ); // bottom } else if(KIND==FILL) { set_fill(); pDC->Ellipse((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F), (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F)); } else if(KIND==CLEAR_OUTLINE) { set_clear(); pDC->Arc((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F), (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F), (int)((X+R+XO)*F), (int)(((-Y)+YO)*F), (int)((X-R+XO)*F), (int)(((-Y)+YO)*F)); // top pDC->Arc((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F), (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F), (int)((X-R+XO)*F), (int)(((-Y)+YO)*F), (int)((X+R+XO)*F), (int)(((-Y)+YO)*F)); // bottom } else if(KIND==CLEAR_FILL) { set_clear(); pDC->Ellipse((int)((X-R+XO)*F), (int)(((-Y)-R+YO)*F), (int)((X+R+XO)*F), (int)(((-Y)+R+YO)*F)); } } void DRAW_ELLIPSE ( float X, float Y, float XR, float YR, show KIND ) { if(KIND==OUTLINE) { set_fill(); pDC->Arc((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F), (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F), (int)((X+XR+XO)*F), (int)(((-Y)+YO)*F), (int)((X-XR+XO)*F), (int)(((-Y)+YO)*F)); // top pDC->Arc((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F), (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F), (int)((X-XR+XO)*F), (int)(((-Y)+YO)*F), (int)((X+XR+XO)*F), (int)(((-Y)+YO)*F)); // bottom } else if(KIND==FILL) { set_fill(); pDC->Ellipse((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F), (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F)); } else if(KIND==CLEAR_OUTLINE) { set_clear(); pDC->Arc((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F), (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F), (int)((X+XR+XO)*F), (int)(((-Y)+YO)*F), (int)((X-XR+XO)*F), (int)(((-Y)+YO)*F)); // top pDC->Arc((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F), (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F), (int)((X-XR+XO)*F), (int)(((-Y)+YO)*F), (int)((X+XR+XO)*F), (int)(((-Y)+YO)*F)); // bottom } else if(KIND==CLEAR_FILL) { set_clear(); pDC->Ellipse((int)((X-XR+XO)*F), (int)(((-Y)-YR+YO)*F), (int)((X+XR+XO)*F), (int)(((-Y)+YR+YO)*F)); } } void DRAW_RECTANGLE ( float X, float Y, float W, float H, show KIND ) { if(KIND==OUTLINE) { set_fill(); pDC->MoveTo((int)((X-W/2.0+XO)*F), (int)(((-Y)-H/2.0+YO)*F)); // lower left pDC->LineTo((int)((X-W/2.0+XO)*F), (int)(((-Y)+H/2.0+YO)*F)); // upper left pDC->LineTo((int)((X+W/2.0+XO)*F), (int)(((-Y)+H/2.0+YO)*F)); // upper right pDC->LineTo((int)((X+W/2.0+XO)*F), (int)(((-Y)-H/2.0+YO)*F)); // lower right pDC->LineTo((int)((X-W/2.0+XO)*F), (int)(((-Y)-H/2.0+YO)*F)); // lower left ( start ) } else if(KIND==FILL) { set_fill(); pDC->Rectangle((int)((X-W/2.0+XO)*F), (int)(((-Y)-H/2.0+YO)*F), // upper left (int)((X+W/2.0+XO)*F), (int)(((-Y)+H/2.0+YO)*F)); // lower right } else if(KIND==CLEAR_OUTLINE) { set_clear(); pDC->MoveTo((int)((X-W/2.0+XO)*F),(int)(((-Y)-H/2.0+YO)*F)); //lower left pDC->LineTo((int)((X-W/2.0+XO)*F),(int)(((-Y)+H/2.0+YO)*F)); //upper left pDC->LineTo((int)((X+W/2.0+XO)*F),(int)(((-Y)+H/2.0+YO)*F)); //upper right pDC->LineTo((int)((X+W/2.0+XO)*F),(int)(((-Y)-H/2.0+YO)*F)); //lower right pDC->LineTo((int)((X-W/2.0+XO)*F),(int)(((-Y)-H/2.0+YO)*F)); //lower left ( start ) } else if(KIND==CLEAR_FILL) { set_clear(); pDC->Rectangle((int)((X-W/2.0+XO)*F), (int)(((-Y)-H/2.0+YO)*F), //upper left (int)((X+W/2.0+XO)*F), (int)(((-Y)+H/2.0+YO)*F)); //lower right } } void DRAW_LINE ( float X1, float Y1, float X2, float Y2, show KIND ) { if(KIND==BOLD || KIND==OUTLINE || KIND==FILL) { pen.DeleteObject(); pen.CreatePen(PS_SOLID, PenSize, black); pDC->MoveTo( (int)((X1+XO)*F), (int)(((-Y1)+YO)*F)); // start pDC->LineTo( (int)((X2+XO)*F), (int)(((-Y2)+YO)*F)); // end } else { pen.DeleteObject(); pen.CreatePen(PS_SOLID, PenSize, white); pDC->MoveTo( (int)((X1+XO)*F), (int)(((-Y1)+YO)*F)); // start pDC->LineTo( (int)((X2+XO)*F), (int)(((-Y2)+YO)*F)); // end } } void WRITE_TEXT ( float X, float Y, char *TEXT, show KIND, COLORREF color ) { if(KIND==BOLD || KIND==OUTLINE || KIND==FILL) { pDC->SetTextColor(color); pDC->TextOut((int)((X+XO)*F), (int)(((-Y)+YO)*F), TEXT, strlen(TEXT)); } else { pDC->SetTextColor(white); pDC->TextOut((int)((X+XO)*F), (int)(((-Y)+YO)*F), TEXT, strlen(TEXT)); } } void PRINT(void) {} // not needed, but included for compatibility void CLOSE(void){} // not needed, but included for compatibility // end VC_PLOTD.CPP