2 // Bezier curve fitter
\r
3 // by James L. Hammons
\r
4 // (C) 2005 Underground Software
\r
6 // This function takes three points and draws a curve using a
\r
7 // second order Bezier function.
\r
9 // JLH = James L. Hammons <jlhamm@acm.org>
\r
12 // --- ---------- -------------------------------------------------------------
\r
13 // JLH 03/14/1998 Created this file
\r
14 // JLH 01/20/2005 Converted to use wxWidgets
\r
19 double abs(double n) // Helper function
\r
21 return (n < 0 ? -n : n);
\r
24 void Bezier(wxDC &dc, point p1, point p2, point p3)
\r
26 double step = abs(p1.x - p3.x), tmp = abs(p1.y - p3.y);
\r
27 step = (tmp > step ? tmp : step); // Get the larger of the two...
\r
28 step = (step > 0 ? 1/step : 1); // & convert to valid step value
\r
30 // MoveToEx(hdc, (int)p1.x, (int)p1.y, NULL);
\r
31 wxCoord prevX = (wxCoord)p1.x, prevY = (wxCoord)p1.y;
\r
33 for(double u=0; u<=1; u+=step)
\r
35 double _2u = 2*u, _uu = u*u, _2uu = 2*_uu,
\r
36 x = (p1.x * (1 - _2u + _uu)) + (p2.x * (_2u - _2uu)) + (p3.x * _uu),
\r
37 y = (p1.y * (1 - _2u + _uu)) + (p2.y * (_2u - _2uu)) + (p3.y * _uu);
\r
38 // LineTo(hdc, (int)x, (int)y);
\r
39 dc.DrawLine(prevX, prevY, (wxCoord)x, (wxCoord)y);
\r
40 prevX = (wxCoord)x, prevY = (wxCoord)y;
\r
43 // LineTo(hdc, (int)p3.x, (int)p3.y);
\r
44 dc.DrawLine(prevX, prevY, (wxCoord)p3.x, (wxCoord)p3.y);
\r