注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

简约男人

简约,不能简单

 
 
 

日志

 
 
关于我

一个过分渴望被理解的人其实就是一个软弱的人, 勇往直前的力量来自斩钉截铁的决心,不是来自别人的理解.

网易考拉推荐

2次和3次插值曲线TC版  

2009-10-03 13:19:55|  分类: 算法学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

/*二次插值曲线
**     三个点可以确定一个二次参数曲线方程,用这个曲线方程绘制开首三个点构成的两条曲线线段的第一段
** 然后让三点组向后推进一个点,求解第二个曲线方程,用这个曲线方程的第二段绘和上一个曲线方程的第一
** 段的加权平均值绘制此曲线的第一段。
**     在过i-1,i,i+1三点建立二次参数曲线,令:当通过i-1点时参数t=0;当通过第i点时,参数t=0.5,当
** 通过i+1点时,参数t=1。解得前一段的曲线方程为:
**     XL(t) = (1-3t+2t^2)(Xi-1) + (4t-4t^2)Xi + (2t^2-t)(Xi+1) (i-1,i,i+1表示下标)
**     XL(t) = (1-3t+2t^2)(Yi-1) + (4t-4t^2)Xi + (2t^2-t)(Xi+1) (i-1,i,i+1表示下标)
**
**     可设权与曲线重心点的距离有关。则权函数为WL(t) = 1 - 2t,WR(t) = 2t。WL前一个函数值的权,WR后
** 一个函数值的权。
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <graphics.h>

#define  MAX  60  /* 30*2 30个点*/

void p2line(double*,unsigned);

void initgraphic(void) /* BGI初始化 */
{
    int gd = DETECT, gm = 0,errorcode; /* gd = VGA,gm = VGAHI也可 */
    errorcode = registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
    if (errorcode < 0)
    {
        printf("Graphics error: %s\n", grapherrormsg(errorcode));
        printf("Press any key to halt:");
        getch();
        exit(1); /* terminate with an error code */
    }
    initgraph(&gd, &gm, "");
    errorcode = graphresult();
    if (errorcode != grOk)  /* an error occurred */
    {
        printf("Graphics error: %s\n", grapherrormsg(errorcode));
        printf("Press any key to halt:");
        getch();
        exit(1); /* terminate with an error code */
    }
}

 

int main(int argc, char** argv)
{
    FILE        *fp;
    char       *p;
    int         i,j;
    double     tmp;
    double     point[MAX];

    if (argc == 2)
    {
        i = strlen(argv[1]);

        p = argv[1] + (i - 3);
        if ((stricmp("dat",p) != 0)&&(stricmp("txt",p) != 0))
            printf("invalid filetype\n");
        else
            if ((fp=fopen(argv[1],"rb+"))==NULL)
            {
                printf("Can't open \"points\" file.\n");
                exit(0);
            }
    }

    else
    {
        printf("          warnnings!\n");
        printf("  want using points read from other files,");
        printf("  please input command like:\n");
        printf("  exe-file-name points-file-name\n");
        printf("  now using default file!\n\n");
        system("pause");

        if ((fp=fopen("points.dat","rb+"))==NULL)
        {
            printf("Can't open \"points\" file.\n");
            exit(0);
        }
    }
    printf("  points read from the file!\n\n");
    for (j=0;(j < MAX)&&(!feof(fp));j++)
    {
        fscanf(fp,"%lf",&tmp);

        if ((j&1) == 0)
            printf("  point[%2d] = ( %5.1f , ",j/2,tmp);
        else
            printf("%5.1f )\n",tmp);
        point[j] = tmp;
    }
    system("pause");

    initgraphic();

    setcolor(50);
    setlinestyle(0,1,1);

    p3line(point,j);

    getch();
    closegraph();
    return 0;
}

void p2line(double *point,unsigned size)
{
    int         i;
    double     x1,y1,x2=-1,y2=-1;
    double     t,det_t;
   
    if(size < 9)
    {
        printf("points must not less than 4");
        return ;
    }
   
    for (i=2;(i+4)<size;i+=2)
    {
        /*绘制此曲线*/

        det_t=0.04;
        x1=point[i];
        y1=point[i+1];
        if (x2 >0)
        {
            moveto(x1,y1);
            lineto(x2,y2);

        }
        for (t=det_t;t<=0.5;t+=det_t)
        {
            x2 = point[i] - (point[i-2] - point[i+2])*t +\
                 (2*point[i-2] - 5*point[i] + 4*point[i+2] - point[i+4])*2*pow(t,2) -\
                 (point[i-2] - 3*point[i] + 3*point[i+2] - point[i+4])*4*pow(t,3);
           
            y2 = point[i+1] - (point[i-1] - point[i+3])*t +\
                 (2*point[i-1] - 5*point[i+1] + 4*point[i+3] - point[i+5])*2*pow(t,2) -\
                 (point[i-1] - 3*point[i+1] + 3*point[i+3] - point[i+5])*4*pow(t,3);

            moveto(x1,y1);
            lineto(x2,y2);

            x1=x2;
            y1=y2;
        }
    }

}

 

/*四个点可以确定一个三次参数曲线方程,用这个曲线方程绘制此四个点构成的三条曲线段的中间一段*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <graphics.h>

#define  MAX  60  /* 30*2 30个点*/

void p3line(double*,unsigned);

void initgraphic(void) /* BGI初始化 */
{
    int gd = DETECT, gm = 0,errorcode; /* gd = VGA,gm = VGAHI也可 */
    errorcode = registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
    if (errorcode < 0)
    {
        printf("Graphics error: %s\n", grapherrormsg(errorcode));
        printf("Press any key to halt:");
        getch();
        exit(1); /* terminate with an error code */
    }
    initgraph(&gd, &gm, "");
    errorcode = graphresult();
    if (errorcode != grOk)  /* an error occurred */
    {
        printf("Graphics error: %s\n", grapherrormsg(errorcode));
        printf("Press any key to halt:");
        getch();
        exit(1); /* terminate with an error code */
    }
}

 

int main(int argc, char** argv)
{
    FILE        *fp;
    char       *p;
    int         i,j;
    double     tmp;
    double     point[MAX];

    if (argc == 2)
    {
        i = strlen(argv[1]);

        p = argv[1] + (i - 3);
        if ((stricmp("dat",p) != 0)&&(stricmp("txt",p) != 0))
            printf("invalid filetype\n");
        else
            if ((fp=fopen(argv[1],"rb+"))==NULL)
            {
                printf("Can't open \"points\" file.\n");
                exit(0);
            }
    }

    else
    {
        printf("          warnnings!\n");
        printf("  want using points read from other files,");
        printf("  please input command like:\n");
        printf("  exe-file-name points-file-name\n");
        printf("  now using default file!\n\n");
        system("pause");

        if ((fp=fopen("points.dat","rb+"))==NULL)
        {
            printf("Can't open \"points\" file.\n");
            exit(0);
        }
    }
    printf("  points read from the file!\n\n");
    for (j=0;(j < MAX)&&(!feof(fp));j++)
    {
        fscanf(fp,"%lf",&tmp);

        if ((j&1) == 0)
            printf("  point[%2d] = ( %5.1f , ",j/2,tmp);
        else
            printf("%5.1f )\n",tmp);
        point[j] = tmp;
    }
    system("pause");

    initgraphic();

    setcolor(50);
    setlinestyle(0,1,1);

    p3line(point,j);

    getch();
    closegraph();
    return 0;
}

void p3line(double *point,unsigned size)
{
    int         i;
    double     x1,y1,x2=-1,y2=-1;
    double     t,det_t;
    double     m,n,r;
    double     a0,a1,a2,a3,b0,b1,b2,b3;
   
    if(size < 9)
    {
        printf("points must not less than 4");
        return ;
    }
       
    for (i=2;(i+5)<size;i+=2)
    {

        /*计算两结点间距r,其切线倾角m,n*/
        m=atan2((point[i+3]-point[i-1]),(point[i+2]-point[i-2]));
        n=atan2((point[i+5]-point[i+1]),(point[i+4]-point[i]));
        r=hypot(point[i+2]-point[i],point[i+3]-point[i+1]);

        /*计算三次曲线8参数*/
        a0=point[i];
        a1=r*cos(m);
        a2=3*(point[i+2]-point[i])-r*(cos(n)+2*cos(m));
        a3=-2*(point[i+2]-point[i])+r*(cos(n)+cos(m));
        b0=point[i+1];
        b1=r*sin(m);
        b2=3*(point[i+3]-point[i+1])-r*(sin(n)+2*sin(m));
        b3=-2*(point[i+3]-point[i+1])+r*(sin(n)+sin(m));


        /*绘制此曲线*/

        det_t=0.03;
        x1=a0;
        y1=b0;
        if (x2 >0)
        {
            moveto(x1,y1);
            lineto(x2,y2);

        }
        for (t=det_t;t<=1;t+=det_t)
        {
            x2=a0+a1*t+a2*t*t+a3*t*t*t;
            y2=b0+b1*t+b2*t*t+b3*t*t*t;

            moveto(x1,y1);
            lineto(x2,y2);

            x1=x2;
            y1=y2;
        }
    }

}
2次和3次插值曲线TC版 - tr0217 - 简约男人

  评论这张
 
阅读(814)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017