PeriDyno 1.2.1
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 mUserCoord.push_back(a);
7
9}
10
12{
13 mUserCoord.push_back(point);
14 mUserHandle.push_back(handle_1);
15 mUserHandle.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
37
39{
40 mBezierPoint.clear();
41
42 int n = mUserCoord.size();
43 int bn = mUserHandle.size();
44
45 if (bn != 2 * n)
46 {
48 }
49
50 for (int i = 0; i < n - 1; i++)
51 {
52 Coord2D p0 = mUserCoord[i];
53 Coord2D p1 = mUserHandle[2 * i + 1];
54 Coord2D p2 = mUserHandle[2 * (i + 1)];
55 Coord2D p3 = mUserCoord[i + 1];
57 }
58 if (mClose && n >= 3)
59 {
60 Coord2D p0 = mUserCoord[n - 1];
61 Coord2D p1 = mUserHandle[bn - 1];
62 Coord2D p2 = mUserHandle[0];
63 Coord2D p3 = mUserCoord[0];
65 }
66 if (mClose)
67 {
68 if (mUserCoord.size())
69 {
70 mBezierPoint.push_back(mUserCoord[0]);
71 }
72 }
73 else
74 {
75 if (mUserCoord.size())
76 {
77 mBezierPoint.push_back(mUserCoord[mUserCoord.size() - 1]);
78 }
79 }
80}
81
82void dyno::Canvas::updateBezierPointToBezierSet(Coord2D p0, Coord2D p1, Coord2D p2, Coord2D p3, std::vector<Coord2D>& bezierSet)
83{
84
85 Coord2D P[4] = { p0,p1,p2,p3 };
86
87 int n = 4;
88 Coord2D Pf;
89 float t;
90 float unit = 1.0f / 15.0f; //bezier resolution
91
92 for (t = 0; t < 1; t += unit)
93 {
94 P[0] = p0;
95 P[1] = p1;
96 P[2] = p2;
97 P[3] = p3;
98
99 int x = n;
100 while (1)
101 {
102 if (x == 1)
103 break;
104 for (int i = 0; i < x - 1; i++)
105 {
106 Pf.x = (P[i + 1].x - P[i].x) * t + P[i].x;
107 Pf.y = (P[i + 1].y - P[i].y) * t + P[i].y;
108 P[i] = Pf;
109
110 }
111 x--;
112 }
113 bezierSet.push_back(Pf);
114 }
115}
116
118{
119 std::vector<Coord2D> temp;
120 temp.assign(mUserCoord.begin(), mUserCoord.end());
121 if (mClose && temp.size() >= 3)
122 {
123 temp.push_back(mUserCoord[0]);
124 }
127
128}
129
130void dyno::Canvas::resamplePointFromLine(std::vector<Coord2D> pointSet)
131{
132 Coord2D P;//画点
133 float uL = mSpacing / 100;
134 float curL = 0;
135 int n;
136 if (mLength_EndPoint_Map.size())
137 {
138 n = (--mLength_EndPoint_Map.end())->first / uL;
139 }
140 double addTempLength = 0;
141
142 mResamplePoint.clear();
143 if (mUserCoord.size() >= 2)
144 {
145 for (size_t i = 0; i < mLengthArray.size(); i++)
146 {
147 double tempL = mLengthArray[i];
148 auto it = mLength_EndPoint_Map.find(tempL);
149 EndPoint ep = it->second;
150
151 while (true)
152 {
153 if (addTempLength >= mLengthArray[i])
154 {
155 break;
156 }
157 else
158 {
159 double subL = mLengthArray[i] - addTempLength;
160 double curLineL;
161 if (i > 0)
162 {
163 curLineL = mLengthArray[i] - mLengthArray[i - 1];
164 }
165 else
166 {
167 curLineL = mLengthArray[0];
168 }
169 double per = 1 - subL / curLineL;
170
171 P.x = per * (pointSet[ep.second].x - pointSet[ep.first].x) + pointSet[ep.first].x;
172 P.y = per * (pointSet[ep.second].y - pointSet[ep.first].y) + pointSet[ep.first].y;
173
174 mResamplePoint.push_back(P);
175 addTempLength += uL;
176 }
177
178 }
179
180 }
181 if (mClose)
182 {
183 mResamplePoint.push_back(mUserCoord[0]);
184 }
185 else
186 {
187 mResamplePoint.push_back(mUserCoord[mUserCoord.size() - 1]);
188 }
189 }
190}
191
192void dyno::Canvas::rebuildHandlePoint(std::vector<Coord2D> coordSet)
193{
194 mUserHandle.clear();
195 int ptnum = coordSet.size();
196 for (size_t i = 0; i < ptnum; i++)
197 {
198 dyno::Vec2f P(coordSet[i].x, coordSet[i].y);
199 dyno::Vec2f p1;
200 dyno::Vec2f p2;
202
203 int id = i;
204 int f;
205 int s;
206 if (ptnum < 2)
207 {
208 N = Vec2f(1, 0);
209 }
210 else
211 {
212 f = id - 1;
213 s = id + 1;
214 if (id == 0)//首点
215 {
216 N[0] = coordSet[s].x - coordSet[id].x;
217 N[1] = coordSet[s].y - coordSet[id].y;
218 }
219 else if (id == ptnum - 1)//末点
220 {
221 N[0] = coordSet[id].x - coordSet[f].x;
222 N[1] = coordSet[id].y - coordSet[f].y;
223 }
224 else//中间点
225 {
226 N[0] = coordSet[s].x - coordSet[f].x;
227 N[1] = coordSet[s].y - coordSet[f].y;
228 }
229 }
230
231 N.normalize();
232 double length = 0.05;
233 p1 = P - N * length;
234 p2 = P + N * length;
235
236 mUserHandle.push_back(Coord2D(p1));
237 mUserHandle.push_back(Coord2D(p2));
238
239 }
240}
241
242void dyno::Canvas::buildSegMent_Length_Map(std::vector<Coord2D> BezierPtSet)
243{
244 mLength_EndPoint_Map.clear();
245 mLengthArray.clear();
246 std::vector<Coord2D> temp;
247
248 double length = 0;
249
250 int n = BezierPtSet.size();
251 if (BezierPtSet.size())
252 {
253 for (size_t k = 0; k < n - 1; k++)
254 {
255 int e = k;
256 int f = k + 1;
257 length += sqrt(std::pow((BezierPtSet[f].x - BezierPtSet[e].x), 2) + std::pow((BezierPtSet[f].y - BezierPtSet[e].y), 2));
258 mLengthArray.push_back(length);
259 mLength_EndPoint_Map[length] = EndPoint(e, f);
260
261 }
262 }
263
264}
265
270
272{
273 mUserCoord.clear();
274
275 mBezierPoint.clear();
276 mUserHandle.clear();
277}
278
279
void updateResampleLinearLine()
Definition Canvas.cpp:117
std::vector< Coord2D > mResamplePoint
Definition Canvas.h:229
void useLinear()
Definition Canvas.cpp:32
std::map< float, EndPoint > mLength_EndPoint_Map
Definition Canvas.h:230
void addFloatItemToCoord(float x, float y, std::vector< Coord2D > &coordArray)
Definition Canvas.cpp:20
void setInterpMode(bool useBezier)
Definition Canvas.cpp:266
Canvas::Interpolation mInterpMode
Definition Canvas.h:219
void rebuildHandlePoint(std::vector< Coord2D > coordSet)
Definition Canvas.cpp:192
std::vector< Coord2D > mBezierPoint
Definition Canvas.h:227
void addPoint(float x, float y)
Definition Canvas.cpp:3
float mSpacing
Definition Canvas.h:220
std::vector< Coord2D > mUserHandle
Definition Canvas.h:224
std::vector< double > mLengthArray
Definition Canvas.h:231
std::vector< Coord2D > mUserCoord
Definition Canvas.h:223
virtual void updateBezierCurve()
Definition Canvas.cpp:38
bool mClose
Definition Canvas.h:222
void buildSegMent_Length_Map(std::vector< Coord2D > BezierPtSet)
Definition Canvas.cpp:242
void resamplePointFromLine(std::vector< Coord2D > pointSet)
Definition Canvas.cpp:130
void updateBezierPointToBezierSet(Coord2D p0, Coord2D p1, Coord2D p2, Coord2D p3, std::vector< Coord2D > &bezierSet)
Definition Canvas.cpp:82
void addPointAndHandlePoint(Coord2D point, Coord2D handle_1, Coord2D handle_2)
Definition Canvas.cpp:11
virtual void UpdateFieldFinalCoord()
Definition Canvas.h:123
void clearMyCoord()
Definition Canvas.cpp:271
void useBezier()
Definition Canvas.cpp:27
#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:33