2 // Graphics primitives
\r
4 // Various graphic functions that are slightly more complex than those that
\r
5 // come with various widget libraries.
\r
7 // by James L. Hammons
\r
8 // (C) 2005 Underground Software
\r
10 // JLH = James L. Hammons <jlhamm@acm.org>
\r
13 // --- ---------- -------------------------------------------------------------
\r
14 // JLH 03/14/1998 Created this file
\r
15 // JLH 01/20/2005 Converted to use wxWidgets
\r
16 // JLH 08/30/2008 Repurposed file to handle more than just bezier curves
\r
19 #include "graphicprimitives.h"
\r
21 double abs(double n) // Helper function
\r
23 return (n < 0 ? -n : n);
\r
27 // This function takes three points and draws a curve using a second order
\r
30 void Bezier(wxDC &dc, point p1, point p2, point p3)
\r
32 double step = abs(p1.x - p3.x), tmp = abs(p1.y - p3.y);
\r
33 step = (tmp > step ? tmp : step); // Get the larger of the two...
\r
34 step = (step > 0 ? 1/step : 1); // & convert to valid step value
\r
36 wxCoord prevX = (wxCoord)p1.x, prevY = (wxCoord)p1.y;
\r
38 for(double u=0; u<=1; u+=step)
\r
40 double _2u = 2*u, _uu = u*u, _2uu = 2*_uu;
\r
41 double x = (p1.x * (1 - _2u + _uu)) + (p2.x * (_2u - _2uu)) + (p3.x * _uu);
\r
42 double y = (p1.y * (1 - _2u + _uu)) + (p2.y * (_2u - _2uu)) + (p3.y * _uu);
\r
44 dc.DrawLine(prevX, prevY, (wxCoord)x, (wxCoord)y);
\r
45 prevX = (wxCoord)x, prevY = (wxCoord)y;
\r
48 dc.DrawLine(prevX, prevY, (wxCoord)p3.x, (wxCoord)p3.y);
\r
52 // Draw a round dot (5x5, centered on [x, y])
\r
54 void DrawRoundDot(wxDC &dc, int32 x, int32 y)
\r
58 pt[0].x = x - 1, pt[0].y = y - 2;
\r
59 pt[1].x = x + 1, pt[1].y = y - 2;
\r
60 pt[2].x = x + 2, pt[2].y = y - 1;
\r
61 pt[3].x = x + 2, pt[3].y = y + 1;
\r
62 pt[4].x = x + 1, pt[4].y = y + 2;
\r
63 pt[5].x = x - 1, pt[5].y = y + 2;
\r
64 pt[6].x = x - 2, pt[6].y = y + 1;
\r
65 pt[7].x = x - 2, pt[7].y = y - 1;
\r
67 dc.DrawPolygon(8, pt);
\r
71 // Draw a sqaure dot (5x5, centered on [x, y])
\r
73 void DrawSquareDot(wxDC &dc, int32 x, int32 y)
\r
77 pt[0].x = x - 2, pt[0].y = y - 2;
\r
78 pt[1].x = x + 2, pt[1].y = y - 2;
\r
79 pt[2].x = x + 2, pt[2].y = y + 2;
\r
80 pt[3].x = x - 2, pt[3].y = y + 2;
\r
82 dc.DrawPolygon(4, pt);
\r
86 // Draw a sqaure dot (nxn, centered on [x, y])
\r
88 void DrawSquareDotN(wxDC &dc, int32 x, int32 y, uint32 n)
\r
91 uint32 offset = (n - 1) / 2;
\r
93 pt[0].x = x - offset, pt[0].y = y - offset;
\r
94 pt[1].x = x + offset, pt[1].y = y - offset;
\r
95 pt[2].x = x + offset, pt[2].y = y + offset;
\r
96 pt[3].x = x - offset, pt[3].y = y + offset;
\r
98 dc.DrawPolygon(4, pt);
\r
102 // Draw a round dot (nxn, centered on [x, y])
\r
104 void DrawRoundDotN(wxDC &dc, int32 x, int32 y, uint32 n)
\r
106 dc.DrawCircle(x, y, (n / 2) + 1);
\r