]> Shamusworld >> Repos - ttedit/blob - src/bezier.cpp
Forgot new files in last commit. D'oh!
[ttedit] / src / bezier.cpp
1 //\r
2 // Bezier curve fitter\r
3 // by James L. Hammons\r
4 // (C) 2005 Underground Software\r
5 //\r
6 // This function takes three points and draws a curve using a\r
7 // second order Bezier function.\r
8 //\r
9 // JLH = James L. Hammons <jlhamm@acm.org>\r
10 //\r
11 // Who  When        What\r
12 // ---  ----------  -------------------------------------------------------------\r
13 // JLH  03/14/1998  Created this file\r
14 // JLH  01/20/2005  Converted to use wxWidgets\r
15 //\r
16 \r
17 #include "bezier.h"\r
18 \r
19 double abs(double n)                                                    // Helper function\r
20 {\r
21         return (n < 0 ? -n : n);\r
22 }\r
23 \r
24 void Bezier(wxDC &dc, point p1, point p2, point p3)\r
25 {\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
29 \r
30 //      MoveToEx(hdc, (int)p1.x, (int)p1.y, NULL);\r
31         wxCoord prevX = (wxCoord)p1.x, prevY = (wxCoord)p1.y;\r
32 \r
33         for(double u=0; u<=1; u+=step)\r
34         {\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
41         }\r
42 \r
43 //      LineTo(hdc, (int)p3.x, (int)p3.y);\r
44         dc.DrawLine(prevX, prevY, (wxCoord)p3.x, (wxCoord)p3.y);\r
45 }\r