📄 spline.lst
字号:
C51 COMPILER V7.50 SPLINE 09/06/2007 10:13:45 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE SPLINE
OBJECT MODULE PLACED IN .\OBJ\spline.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE spline.c LARGE BROWSE DEBUG OBJECTEXTEND PRINT(.\LST\spline.lst) OBJECT(.\O
-BJ\spline.obj)
line level source
1 /****************************************************************************************
2 * 文件名:SPLINE.C
3 * 功能:二次参数样条曲线生成程序。
4 * 作者:黄绍斌
5 * 日期:2003.09.09
6 ****************************************************************************************/
7 #include "config.h"
8 #include "math.h"
9
10
11 /****************************************************************************
12 * 名称:max()
13 * 功能:求两个整数中最大的整数值。
14 * 入口参数:a 整数1
15 * b 整数2
16 * 出口参数:返回最大的整数值
17 ****************************************************************************/
18 int max(int a, int b)
19 {
20 1 if(a>b)
21 1 return(a);
22 1 else
23 1 return(b);
24 1 }
25
26 /****************************************************************************
27 * 名称:abs()
28 * 功能:求一个整数的绝对值。
29 * 入口参数:a 取绝对值的数据
30 * 出口参数:返回a的绝对值
31 ****************************************************************************/
32 int abs(int a)
33 { if(a>0) return(a);
34 1 else return(-a);
35 1 }
36
37
38
39 /* 曲线类变量及相关函数 */
40 typedef struct
41 {
42 float Ax, Ay; // 定义A、B、C点坐标变量
43 float Bx, By;
44 float Cx, Cy;
45
46 int Ndiv; // 定义曲线平滑参数变量
47 }CURVE;
48
49 #define DIV_FACTOR 8.0 /* 平滑控制参数 */
50 /****************************************************************************
51 * 名称:CURVE_SetCurve()
52 * 功能:设置三点曲线参数。
53 * 入口参数: cl 要操作的曲线对象,CURVE结构
54 * ax a点x坐标值
C51 COMPILER V7.50 SPLINE 09/06/2007 10:13:45 PAGE 2
55 * ay a点y坐标值
56 * bx b点x坐标值
57 * by b点y坐标值
58 * cx c点x坐标值
59 * cy c点y坐标值
60 * 出口参数:无
61 * 说明:
62 ****************************************************************************/
63 void CURVE_SetCurve(CURVE *cl,
64 float ax, float ay,
65 float bx, float by,
66 float cx, float cy)
67 { cl->Ax = ax;
68 1 cl->Ay = ay;
69 1 cl->Bx = bx;
70 1 cl->By = by;
71 1 cl->Cx = cx;
72 1 cl->Cy = cy;
73 1
74 1 cl->Ndiv = (int)(max( abs((int)ax), abs((int)ay) ) / DIV_FACTOR);
75 1 }
76
77
78 /****************************************************************************
79 * 名称:CURVE_GetCount()
80 * 功能:取出平滑参数Ndiv+1的值。
81 * 入口参数:cl 要操作的曲线对象,CURVE结构
82 * 出口参数:返回Ndiv+1的值
83 * 说明:若Ndiv为0,则先设置其为1。
84 ****************************************************************************/
85 int CURVE_GetCount(CURVE *cl)
86 { if(0 == cl->Ndiv) cl->Ndiv=1;
87 1
88 1 return(cl->Ndiv+1);
89 1 }
90
91
92 /****************************************************************************
93 * 名称:CURVE_GetCurve()
94 * 功能:增加曲线点到points。
95 * 入口参数:cl 要操作的曲线对象,CURVE结构
96 * x 新增点的x坐标值
97 * y 新增点的y坐标值
98 * points 曲线点缓冲区
99 * PointCount 缓冲区的当前指针
100 * 出口参数:无
101 * 说明:
102 ****************************************************************************/
103 void CURVE_GetCurve(CURVE *cl, float x, float y, PointXY points[], int *PointCount)
104 { int X, Y;
105 1 float t, f, g, h;
106 1 int i;
107 1
108 1 if(cl->Ndiv==0) cl->Ndiv = 1;
109 1
110 1 /* 新增一个点到结构 */
111 1 X = (int)x;
112 1 Y = (int)y;
113 1 points[*PointCount].x = X;
114 1 points[*PointCount].y = Y;
115 1 (*PointCount)++;
116 1
C51 COMPILER V7.50 SPLINE 09/06/2007 10:13:45 PAGE 3
117 1 /* 变换出ndiv个点 */
118 1 for(i=1; i<=cl->Ndiv; i++)
119 1 { t = 1.0f / (float)cl->Ndiv * (float)i;
120 2 f = t * t * (3.0f - 2.0f * t);
121 2 g = t * (t - 1.0f) * (t-1.0f);
122 2 h = t * t * (t-1.0f);
123 2
124 2 X = (int)(x + cl->Ax*f + cl->Bx*g + cl->Cx*h);
125 2 Y = (int)(y + cl->Ay*f + cl->By*g + cl->Cy*h);
126 2
127 2 points[*PointCount].x = X;
128 2 points[*PointCount].y = Y;
129 2 (*PointCount)++;
130 2 }
131 1 }
132
133
134
135 /***************************************************************************/
136
137
138 /****************************************************************************
139 * 名称:SPLINE_Spline()
140 * 功能:样条曲线初始化函数,将特征点输入到样条曲线对象中。
141 * 入口参数:sl 要操作的样条曲线对象,SPLINE结构
142 * pt 特征点数据
143 * np 特征点个数
144 * 出口参数:无
145 * 说明:
146 ****************************************************************************/
147 void SPLINE_SetSpline(SPLINE *sl, PointXY pt[], int np)
148 { int i;
149 1
150 1 sl->Np = np;
151 1
152 1 /* 将点数据复制到sl对象 */
153 1 for(i=0; i<sl->Np; i++)
154 1 { sl->Px[i] = (float)pt[i].x;
155 2 sl->Py[i] = (float)pt[i].y;
156 2 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -