PeriDyno 1.0.0
Loading...
Searching...
No Matches
Canvas.cpp
Go to the documentation of this file.
1#include "Canvas.h"
2
3void dyno::Canvas::addPoint(float x, float y)
4{
5 Coord2D a = Coord2D(x, y);
6 mCoord.push_back(a);
7
9}
10
12{
13 mCoord.push_back(point);
14 myHandlePoint.push_back(handle_1);
15 myHandlePoint.push_back(handle_2);
16
18}
19
20void dyno::Canvas::addFloatItemToCoord(float x, float y, std::vector<Coord2D>& coordArray)
21{
22 Coord2D s;
23 s.set(x, y);
24 coordArray.push_back(s);
25}
26
28{
29 setInterpMode(true);
30}
31
33{
34 setInterpMode(false);
35}
36
38{
40 s.set(x, y);
41 Originalcoord.push_back(s);
42}
43
45{
47 s.set(x, y);
48 OriginalHandlePoint.push_back(s);
49}
50
52{
53 mBezierPoint.clear();
54
55 int n = mCoord.size();
56 int bn = myHandlePoint.size();
57
58 if (bn != 2 * n)
59 {
61 }
62
63 for (int i = 0; i < n - 1; i++)
64 {
65 Coord2D p0 = mCoord[i];
66 Coord2D p1 = myHandlePoint[2 * i + 1];
67 Coord2D p2 = myHandlePoint[2 * (i + 1)];
68 Coord2D p3 = mCoord[i + 1];
70 }
71 if (curveClose && n >= 3)
72 {
73 Coord2D p0 = mCoord[n - 1];
74 Coord2D p1 = myHandlePoint[bn - 1];
75 Coord2D p2 = myHandlePoint[0];
76 Coord2D p3 = mCoord[0];
78 }
79 if (curveClose)
80 {
81 if (mCoord.size())
82 {
83 mBezierPoint.push_back(mCoord[0]);
84 }
85 }
86 else
87 {
88 if (mCoord.size())
89 {
90 mBezierPoint.push_back(mCoord[mCoord.size() - 1]);
91 }
92 }
93}
94
95void dyno::Canvas::updateBezierPointToBezierSet(Coord2D p0, Coord2D p1, Coord2D p2, Coord2D p3, std::vector<Coord2D>& bezierSet)
96{
97
98 Coord2D P[4] = { p0,p1,p2,p3 };
99
100 int n = 4;
101 Coord2D Pf;
102 double t;
103 double unit = 1 / segment;
104
105 for (t = 0; t < 1; t += unit)
106 {
107 P[0] = p0;
108 P[1] = p1;
109 P[2] = p2;
110 P[3] = p3;
111
112 int x = n;
113 while (1)
114 {
115 if (x == 1)
116 break;
117 for (int i = 0; i < x - 1; i++)
118 {
119 Pf.x = (P[i + 1].x - P[i].x) * t + P[i].x;
120 Pf.y = (P[i + 1].y - P[i].y) * t + P[i].y;
121 P[i] = Pf;
122
123 }
124 x--;
125 }
126 bezierSet.push_back(Pf);
127 }
128}
129
131{
132 std::vector<Coord2D> temp;
133 temp.assign(mCoord.begin(), mCoord.end());
134 if (curveClose && temp.size() >= 3)
135 {
136 temp.push_back(mCoord[0]);
137 }
140
141}
142
143void dyno::Canvas::resamplePointFromLine(std::vector<Coord2D> pointSet)
144{
145 Coord2D P;//画点
146 float uL = Spacing / 100;
147 float curL = 0;
148 int n;
149 if (length_EndPoint_Map.size())
150 {
151 n = (--length_EndPoint_Map.end())->first / uL;
152 }
153 double addTempLength = 0;
154
155 mResamplePoint.clear();
156 if (mCoord.size() >= 2)
157 {
158 for (size_t i = 0; i < mLengthArray.size(); i++)
159 {
160 double tempL = mLengthArray[i];
161 auto it = length_EndPoint_Map.find(tempL);
162 EndPoint ep = it->second;
163
164 while (true)
165 {
166 if (addTempLength >= mLengthArray[i])
167 {
168 break;
169 }
170 else
171 {
172 double subL = mLengthArray[i] - addTempLength;
173 double curLineL;
174 if (i > 0)
175 {
176 curLineL = mLengthArray[i] - mLengthArray[i - 1];
177 }
178 else
179 {
180 curLineL = mLengthArray[0];
181 }
182 double per = 1 - subL / curLineL;
183
184 P.x = per * (pointSet[ep.second].x - pointSet[ep.first].x) + pointSet[ep.first].x;
185 P.y = per * (pointSet[ep.second].y - pointSet[ep.first].y) + pointSet[ep.first].y;
186
187 mResamplePoint.push_back(P);
188 addTempLength += uL;
189 }
190
191 }
192
193 }
194 if (curveClose)
195 {
196 mResamplePoint.push_back(mCoord[0]);
197 }
198 else
199 {
200 mResamplePoint.push_back(mCoord[mCoord.size() - 1]);
201 }
202 }
203}
204
205void dyno::Canvas::rebuildHandlePoint(std::vector<Coord2D> coordSet)
206{
207 myHandlePoint.clear();
208 int ptnum = coordSet.size();
209 for (size_t i = 0; i < ptnum; i++)
210 {
211 dyno::Vec2f P(coordSet[i].x, coordSet[i].y);
212 dyno::Vec2f p1;
213 dyno::Vec2f p2;
215
216 int id = i;
217 int f;
218 int s;
219 if (ptnum < 2)
220 {
221 N = Vec2f(1, 0);
222 }
223 else
224 {
225 f = id - 1;
226 s = id + 1;
227 if (id == 0)//首点
228 {
229 N[0] = coordSet[s].x - coordSet[id].x;
230 N[1] = coordSet[s].y - coordSet[id].y;
231 }
232 else if (id == ptnum - 1)//末点
233 {
234 N[0] = coordSet[id].x - coordSet[f].x;
235 N[1] = coordSet[id].y - coordSet[f].y;
236 }
237 else//中间点
238 {
239 N[0] = coordSet[s].x - coordSet[f].x;
240 N[1] = coordSet[s].y - coordSet[f].y;
241 }
242 }
243
244 N.normalize();
245 double length = 0.05;
246 p1 = P - N * length;
247 p2 = P + N * length;
248
249 myHandlePoint.push_back(Coord2D(p1));
250 myHandlePoint.push_back(Coord2D(p2));
251
252 }
253}
254
255void dyno::Canvas::buildSegMent_Length_Map(std::vector<Coord2D> BezierPtSet)
256{
257 length_EndPoint_Map.clear();
258 mLengthArray.clear();
259 std::vector<Coord2D> temp;
260
261 double length = 0;
262
263 int n = BezierPtSet.size();
264 if (BezierPtSet.size())
265 {
266 for (size_t k = 0; k < n - 1; k++)
267 {
268 int e = k;
269 int f = k + 1;
270 length += sqrt(std::pow((BezierPtSet[f].x - BezierPtSet[e].x), 2) + std::pow((BezierPtSet[f].y - BezierPtSet[e].y), 2));
271 mLengthArray.push_back(length);
272 length_EndPoint_Map[length] = EndPoint(e, f);
273
274 }
275 }
276
277}
278
280{
282 if (useBezier)
283 {
285 }
286 else
287 {
289 }
290}
291
293{
294 mCoord.clear();
295 Originalcoord.clear();
296 OriginalHandlePoint.clear();
297 mBezierPoint.clear();
298 myHandlePoint.clear();
299}
300
void updateResampleLinearLine()
Definition Canvas.cpp:130
std::vector< Coord2D > mResamplePoint
Definition Canvas.h:246
void useLinear()
Definition Canvas.cpp:32
void addFloatItemToCoord(float x, float y, std::vector< Coord2D > &coordArray)
Definition Canvas.cpp:20
void setInterpMode(bool useBezier)
Definition Canvas.cpp:279
Canvas::Interpolation mInterpMode
Definition Canvas.h:242
std::map< float, EndPoint > length_EndPoint_Map
Definition Canvas.h:271
void rebuildHandlePoint(std::vector< Coord2D > coordSet)
Definition Canvas.cpp:205
std::vector< Coord2D > mBezierPoint
Definition Canvas.h:244
void addItemHandlePoint(int x, int y)
Definition Canvas.cpp:44
bool useBezierInterpolation
Definition Canvas.h:261
void addPoint(float x, float y)
Definition Canvas.cpp:3
std::vector< OriginalCoord > OriginalHandlePoint
Definition Canvas.h:251
void addItemOriginalCoord(int x, int y)
Definition Canvas.cpp:37
std::vector< Coord2D > mCoord
Definition Canvas.h:243
bool curveClose
Definition Canvas.h:263
std::vector< double > mLengthArray
Definition Canvas.h:247
float segment
Definition Canvas.h:268
virtual void updateBezierCurve()
Definition Canvas.cpp:51
void buildSegMent_Length_Map(std::vector< Coord2D > BezierPtSet)
Definition Canvas.cpp:255
void resamplePointFromLine(std::vector< Coord2D > pointSet)
Definition Canvas.cpp:143
void updateBezierPointToBezierSet(Coord2D p0, Coord2D p1, Coord2D p2, Coord2D p3, std::vector< Coord2D > &bezierSet)
Definition Canvas.cpp:95
float Spacing
Definition Canvas.h:267
void addPointAndHandlePoint(Coord2D point, Coord2D handle_1, Coord2D handle_2)
Definition Canvas.cpp:11
virtual void UpdateFieldFinalCoord()
Definition Canvas.h:143
std::vector< Coord2D > myHandlePoint
Definition Canvas.h:248
void clearMyCoord()
Definition Canvas.cpp:292
void useBezier()
Definition Canvas.cpp:27
std::vector< OriginalCoord > Originalcoord
Definition Canvas.h:250
#define N(x, y, z)
Vector< float, 2 > Vec2f
Definition Vector2D.h:81
DYN_FUNC Complex< Real > sqrt(const Complex< Real > &)
Definition Complex.inl:321
void set(double a, double b)
Definition Canvas.h:40
void set(int a, int b)
Definition Canvas.h:89