⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spline.lst

📁 51单片机在lcd上实现zlg gui,希望好的请多加点分数
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -