PeriDyno 1.2.1
Loading...
Searching...
No Matches
Ramp.cpp
Go to the documentation of this file.
1#include "Ramp.h"
2
3namespace dyno {
4
6 {
7
8 }
9
10 Ramp::Ramp(const Ramp& ramp)
11 {
12
13 this->mUserCoord = ramp.mUserCoord;
14 this->FE_MyCoord = ramp.FE_MyCoord;
15 this->FE_HandleCoord = ramp.FE_HandleCoord;
16 this->mFinalCoord = ramp.mFinalCoord;
17
18 this->mBezierPoint = ramp.mBezierPoint;
20 this->mResamplePoint = ramp.mResamplePoint;
21 this->mUserHandle = ramp.mUserHandle;
22
23 this->mLengthArray = ramp.mLengthArray;
25
26 this->mInterpMode = ramp.mInterpMode;
27
28 this->mClose = ramp.mClose;
29 this->mResample = ramp.mResample;
30
31 this->mSpacing = ramp.mSpacing;
32
33 }
34
35 float Ramp::getCurveValueByX(float inputX)
36 {
37 float xLess = 1;
38 float xGreater = 0;
39 float yLess = 1;
40 float yGreater = 0;
41
42 if (mFinalCoord.size())
43 {
44 int l = mFinalCoord.size();
45 for (size_t i = 0; i < l;i ++)
46 {
47 xLess = (mFinalCoord[i].x > inputX) ? xLess : mFinalCoord[i].x;
48 yLess = (mFinalCoord[i].x > inputX) ? yLess : mFinalCoord[i].y;
49
50 xGreater = (mFinalCoord[l - i - 1].x < inputX) ? xGreater : mFinalCoord[l - i - 1].x;
51 yGreater = (mFinalCoord[l - i - 1].x < inputX) ? yGreater : mFinalCoord[l - i - 1].y;
52 }
53 if (xGreater !=xLess)
54 {
55 float pr = (inputX - xLess) / (xGreater - xLess);
56 float f = pr * (yGreater - yLess) + yLess;
57
58 return f;
59 }
60 else
61 {
62 return yGreater;
63 }
64 }
65 return -1;
66 }
67
68
69 // C++ Bezier
88
90 {
91
92 myBezierPoint_H.clear();
93
94 int n = mUserCoord.size();
95 int bn = mUserHandle.size();
96
97 if (bn != 2 * n)
98 {
100 }
101
102 for (int i = 0; i < n - 1; i++)
103 {
104 Coord2D p0 = mUserCoord[i];
105 Coord2D p1 = mUserHandle[2 * i + 1];
106 Coord2D p2 = mUserHandle[2 * (i + 1)];
107 Coord2D p3 = mUserCoord[i + 1];
109 }
110 if (mClose && n >= 3)
111 {
112 Coord2D p0 = mUserCoord[n - 1];
113 Coord2D p1 = mUserHandle[bn - 1];
114 Coord2D p2 = mUserHandle[0];
115 Coord2D p3 = mUserCoord[0];
117 }
118 if (mClose)
119 {
120 if (mUserCoord.size())
121 {
122 myBezierPoint_H.push_back(mUserCoord[0]);
123 }
124 }
125 else
126 {
127 if (mUserCoord.size())
128 {
129 myBezierPoint_H.push_back(mUserCoord[mUserCoord.size() - 1]);
130 }
131 }
132
134
135 }
136
137
138
139
140
141 //bezier point
142
143 double Ramp::calculateLengthForPointSet(std::vector<Coord2D> BezierPtSet)
144 {
145 double length = 0;
146 int n = BezierPtSet.size();
147 for (size_t k = 0; k < n - 1; k++)
148 {
149 int e = k ;
150 int f = k + 1;
151 length += sqrt(std::pow((BezierPtSet[f].x - BezierPtSet[e].x), 2) + std::pow((BezierPtSet[f].y - BezierPtSet[e].y), 2));
152 }
153 return length;
154 }
155
156
158 {
159
160 std::vector<Coord2D> tempHandle;
161 tempHandle.assign(mUserHandle.begin(), mUserHandle.end());
162 FE_HandleCoord.clear();
163 FE_MyCoord.clear();
164
165 Coord2D Cfirst(-1, -1, -1);
166 Coord2D Cend(-1, -1, -1);
167 Coord2D F1(-1, -1, -1);
168 Coord2D F2(-1, -1, -1);
169 Coord2D E1(-1, -1, -1);
170 Coord2D E2(-1, -1, -1);
171
172 for (int i = 0; i < mUserCoord.size(); i++)
173 {
174 if (mUserCoord[i].x == 0)
175 {
176 Cfirst = mUserCoord[i];
177 F1 = tempHandle[2 * i];
178 F2 = tempHandle[2 * i + 1];
179 }
180 else if (mUserCoord[i].x == 1)
181 {
182 Cend = mUserCoord[i];
183 E1 = tempHandle[2 * i];
184 E2 = tempHandle[2 * i + 1];
185 }
186 else
187 {
188 FE_MyCoord.push_back(mUserCoord[i]);
189 FE_HandleCoord.push_back(tempHandle[2 * i]);
190 FE_HandleCoord.push_back(tempHandle[2 * i + 1]);
191 }
192 }
193
194
195 if (Cend.x != -1)
196 {
197 FE_MyCoord.insert(FE_MyCoord.begin(), Cend);
198 FE_HandleCoord.insert(FE_HandleCoord.begin(), E2);
199 FE_HandleCoord.insert(FE_HandleCoord.begin(), E1);
200 }
201 else
202 {
203 FE_MyCoord.insert(FE_MyCoord.begin(), Coord2D(1, 0.5));
204 FE_HandleCoord.insert(FE_HandleCoord.begin(), Coord2D(1, 0.5));
205 FE_HandleCoord.insert(FE_HandleCoord.begin(), Coord2D(0.9, 0.5));
206 }
207
208
209 if (Cfirst.x != -1)
210 {
211 FE_MyCoord.insert(FE_MyCoord.begin(), Cfirst);
212 FE_HandleCoord.insert(FE_HandleCoord.begin(), F2);
213 FE_HandleCoord.insert(FE_HandleCoord.begin(), F1);
214 }
215 else
216 {
217 FE_MyCoord.insert(FE_MyCoord.begin(), Coord2D(0, 0.5));
218 FE_HandleCoord.insert(FE_HandleCoord.begin(), Coord2D(0.1, 0.5));
219 FE_HandleCoord.insert(FE_HandleCoord.begin(), Coord2D(0, 0.5));
220 }
221
222
223 }
224
226 {
227
229
230
231 mFinalCoord.clear();
232
234 {
235 if (mResample)
236 {
237 if (mUserCoord.size() >= 2)
238 {
240 }
241 mFinalCoord.assign(mResamplePoint.begin(), mResamplePoint.end());
242 }
243 else
244 {
245 mFinalCoord.assign(mBezierPoint.begin(), mBezierPoint.end());
246 }
247 }
249 {
250
251 if (mResample)
252 {
253 if (mUserCoord.size() >= 2)
254 {
255
257 }
258 mFinalCoord.assign(mResamplePoint.begin(), mResamplePoint.end());
259 }
260 else
261 {
262 mFinalCoord.assign(mUserCoord.begin(), mUserCoord.end());
263 }
264 }
265
266 }
267}
std::vector< Coord2D > mFinalCoord
Definition Canvas.h:228
void updateResampleLinearLine()
Definition Canvas.cpp:117
std::vector< Coord2D > mResamplePoint
Definition Canvas.h:229
std::map< float, EndPoint > mLength_EndPoint_Map
Definition Canvas.h:230
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
float mSpacing
Definition Canvas.h:220
std::vector< Coord2D > mUserHandle
Definition Canvas.h:224
std::vector< double > mLengthArray
Definition Canvas.h:231
bool mResample
Definition Canvas.h:221
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
float getCurveValueByX(float inputX)
Get the value value"Y" of the curve by value"X" .
Definition Ramp.cpp:35
std::vector< Coord2D > FE_MyCoord
Definition Ramp.h:51
void updateBezierCurve() override
Update the data of the Bezier curve points.
Definition Ramp.cpp:70
void updateResampleBezierCurve()
Resample Bezier curve.
Definition Ramp.cpp:89
std::vector< Coord2D > FE_HandleCoord
Definition Ramp.h:52
double calculateLengthForPointSet(std::vector< Coord2D > BezierPtSet)
Definition Ramp.cpp:143
void borderCloseResort()
Reordering points on canvas boundaries.
Definition Ramp.cpp:157
std::vector< Coord2D > myBezierPoint_H
Definition Ramp.h:49
void UpdateFieldFinalCoord() override
Updating the data of a Field.
Definition Ramp.cpp:225
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
DYN_FUNC Complex< Real > sqrt(const Complex< Real > &)
Definition Complex.inl:321