📄 spline.lst
字号:
157 1 }
158
159
160
161 /****************************************************************************
162 * 名称:SPLINE_MatrixSolve()
163 * 功能:求解矩阵。
164 * 入口参数:sl 要操作的样条曲线对象,SPLINE结构
165 * B 需操作B点数据(数组)
166 * 出口参数:无
167 * 说明:由SPLINE_Generate()调用,计算值保存在B返回。
168 ****************************************************************************/
169 void SPLINE_MatrixSolve(SPLINE *sl, float B[])
170 { float Work[NPMAX];
171 1 float WorkB[NPMAX];
172 1 int i, j;
173 1
174 1 for(i=0; i<=(sl->Np-1); i++)
175 1 { Work[i] = B[i] / sl->Mat[1][i];
176 2 WorkB[i] = Work[i];
177 2 }
178 1
C51 COMPILER V7.50 SPLINE 09/06/2007 10:13:45 PAGE 4
179 1 for(j=0; j<10; j++)
180 1 { Work[0] = (B[0] - sl->Mat[2][0] * WorkB[1]) / sl->Mat[1][0];
181 2 for(i=1; i<(sl->Np-1); i++ )
182 2 { Work[i] = (B[i] - sl->Mat[0][i] * WorkB[i-1] - sl->Mat[2][i] * WorkB[i+1]) / sl->Mat[1][i];
183 3 }
184 2 Work[sl->Np-1] = (B[sl->Np-1] - sl->Mat[0][sl->Np-1] * WorkB[sl->Np-2]) / sl->Mat[1][sl->Np-1];
185 2
186 2 for(i=0; i<=(sl->Np-1); i++)
187 2 { WorkB[i] = Work[i];
188 3 }
189 2 }
190 1
191 1 for(i=0; i<=(sl->Np-1); i++)
192 1 { B[i] = Work[i];
193 2 }
194 1
195 1 }
196
197
198
199 /****************************************************************************
200 * 名称:SPLINE_Generate()
201 * 功能:产生样条曲线图形。产生的各个端点保存到sl的结构内。
202 * 入口参数:sl 要操作的样条曲线对象,SPLINE结构
203 * 出口参数:无
204 * 说明:sl要先使用SPLINE_SetSpline()设置各个特征点。
205 ****************************************************************************/
206 void SPLINE_Generate(SPLINE *sl)
207 { float k[NPMAX];
208 1 float AMag , AMagOld;
209 1 int i;
210 1
211 1 /* 设置A点值 */
212 1 for(i=0 ; i<=(sl->Np-2); i++ )
213 1 { sl->Ax[i] = sl->Px[i+1] - sl->Px[i];
214 2 sl->Ay[i] = sl->Py[i+1] - sl->Py[i];
215 2 }
216 1
217 1 /* 计算k变量 */
218 1 AMagOld = (float)sqrt(sl->Ax[0] * sl->Ax[0] + sl->Ay[0] * sl->Ay[0]);
219 1 for(i=0 ; i<=(sl->Np-3); i++)
220 1 { AMag = (float)sqrt(sl->Ax[i+1] * sl->Ax[i+1] + sl->Ay[i+1] * sl->Ay[i+1]);
221 2 k[i] = AMagOld / AMag;
222 2 AMagOld = AMag;
223 2 }
224 1 k[sl->Np-2] = 1.0f;
225 1
226 1 /* 矩阵计算 */
227 1 for(i=1; i<=(sl->Np-2); i++)
228 1 { sl->Mat[0][i] = 1.0f;
229 2 sl->Mat[1][i] = 2.0f * k[i-1] * (1.0f + k[i-1]);
230 2 sl->Mat[2][i] = k[i-1] * k[i-1] * k[i];
231 2 }
232 1 sl->Mat[1][0] = 2.0f;
233 1 sl->Mat[2][0] = k[0];
234 1 sl->Mat[0][sl->Np-1] = 1.0f;
235 1 sl->Mat[1][sl->Np-1] = 2.0f * k[sl->Np-2];
236 1
237 1 for(i=1; i<=(sl->Np-2);i++)
238 1 { sl->Bx[i] = 3.0f*(sl->Ax[i-1] + k[i-1] * k[i-1] * sl->Ax[i]);
239 2 sl->By[i] = 3.0f*(sl->Ay[i-1] + k[i-1] * k[i-1] * sl->Ay[i]);
240 2 }
C51 COMPILER V7.50 SPLINE 09/06/2007 10:13:45 PAGE 5
241 1 sl->Bx[0] = 3.0f * sl->Ax[0];
242 1 sl->By[0] = 3.0f * sl->Ay[0];
243 1 sl->Bx[sl->Np-1] = 3.0f * sl->Ax[sl->Np-2];
244 1 sl->By[sl->Np-1] = 3.0f * sl->Ay[sl->Np-2];
245 1
246 1 SPLINE_MatrixSolve(sl, sl->Bx);
247 1 SPLINE_MatrixSolve(sl, sl->By);
248 1
249 1 for(i=0 ; i<=sl->Np-2 ; i++ )
250 1 { sl->Cx[i] = k[i] * sl->Bx[i+1];
251 2 sl->Cy[i] = k[i] * sl->By[i+1];
252 2 }
253 1 }
254
255
256
257
258
259 /****************************************************************************
260 * 名称:SPLINE_GetCurveCount()
261 * 功能:取得样条曲线上端点个数值。
262 * 入口参数:sl 要操作的样条曲线对象,SPLINE结构
263 * 出口参数:返回值即是样条曲线各个端点个数
264 * 说明:sl要先使用SPLINE_SetSpline()设置各个特征点。
265 ****************************************************************************/
266 int SPLINE_GetCurveCount(SPLINE *sl)
267 { CURVE curve_bak;
268 1 int count = 0;
269 1 int i;
270 1
271 1 for(i=0; i<(sl->Np - 1); i++) // 历遍所有特征点
272 1 { /* 设置样条曲线(三点)curve_bak */
273 2 CURVE_SetCurve(&curve_bak,
274 2 sl->Ax[i], sl->Ay[i],
275 2 sl->Bx[i], sl->By[i],
276 2 sl->Cx[i], sl->Cy[i]);
277 2 /* 取得曲线curve_bak上端点的个数 */
278 2 count += CURVE_GetCount(&curve_bak);
279 2 }
280 1
281 1 return(count);
282 1 }
283
284
285
286 /****************************************************************************
287 * 名称:SPLINE_GetCurve()
288 * 功能:取出样条曲线上各个端点,以便于使用GUI_Line()函数画出曲线。
289 * 入口参数:sl 要操作的样条曲线对象,SPLINE结构
290 * points 用于接收曲线点的缓冲区,PointXY数组
291 * PointCount 用于接收曲线点个数的指针
292 * 出口参数:无
293 * 说明:接收曲线点由points返回,曲线点个数由PointCount返回;
294 * sl要先使用SPLINE_SetSpline()设置各个特征点。
295 ****************************************************************************/
296 void SPLINE_GetCurve(SPLINE *sl, PointXY points[], int *PointCount)
297 { CURVE curve_bak;
298 1 int i;
299 1
300 1 *PointCount = 0; // 初始化点计数器为0
301 1 for(i=0; i<(sl->Np-1); i++) // 历遍所有特征点
302 1 { /* 设置样条曲线(三点)curve_bak */
C51 COMPILER V7.50 SPLINE 09/06/2007 10:13:45 PAGE 6
303 2 CURVE_SetCurve(&curve_bak,
304 2 sl->Ax[i], sl->Ay[i],
305 2 sl->Bx[i], sl->By[i],
306 2 sl->Cx[i], sl->Cy[i]);
307 2
308 2 /* 取得样条曲线curve_bak的端点数据及个数 */
309 2 CURVE_GetCurve(&curve_bak,
310 2 sl->Px[i], sl->Py[i],
311 2 points,
312 2 PointCount);
313 2 }
314 1 }
315
316
317 /****************************************************************************
318 * 名称:GUI_Spline()
319 * 功能:作出多个特征点(3个以上)样条曲线。
320 * 入口参数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -