用户操作
[即时聊天] [发私信] [加为好友]
yyID:Y___Y
86001次访问,排名1182,好友3人,关注者16人。
Y___Y的文章
原创 63 篇
翻译 2 篇
转载 73 篇
评论 68 篇
最近评论
XY_dapro:朋友,这个转走了!
逐客令:哈哈
zhqpl:哥们儿,这源码公式的出处是什么,对应不上啊,困扰了好久,希望能给些提示,比如:
for (j=1;j<=n-2;j++)
{
h1=x[j+1]-x[j];//ok
alpha=h0/(h0+h1);//ok
beta=(1.0-alpha)*(y[j]-y[j-1])/h0;//ok
beta=3.0*(beta+alpha……
jcchen:OpenGL view 使用ZBuffer, 如果为了实现选择功能可以从屏幕获取Z,不需要计算。

void ScreenToProj(int sx, int sy, double &px,double &py, double &pz)
{
GLdouble modelview[16];

……
yh:这。。。。。0.0 和 1.0的值都算出来了,之间的值算个插值不就行了?正投影和透视投影也不会把直线变成曲线
文章分类
收藏
    相册
    我的相册
    Opengl网站
    cg
    Nehe
    论坛
    其它
    图标资源
    优秀编程网址
    ccrun
    codeguru
    codeproject
    vckbase
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 (趣味程序)可见光光谱的绘制收藏

    新一篇: 唐伯虎点秋香经典台词完整版(周星驰) | 旧一篇: 一个极好的OpenGL汉字显示类

    作者:Y___Y

    联系:yinwei_88@sina.com

            本文根据相关的数据绘制了可见光(波长从380nm到780nm)的光谱,读者可根据该光谱迅速的知道某个波长 所对应的光的颜色,本文用三次样条插值来拟合波长与颜色的变化曲线,从而更加准确的表达波长与颜色的变化规律。数据资料来源:http://www.cgan.net/book/books/print/packcolor/link/5-4-2.html

    主要代码(MFC单文档):

     

    #include "stdio.h"
    double wavelen[81],red[81],green[81],blue[81];//存储波长,红绿蓝的离散数据
    //读数据文件
    int ReadSpectrumFile()
    {
        
    int i=0,temp;
        
    float r,g,b;
        FILE 
    *fp;
        fp
    =fopen("spectrum.txt","r");
        
    if(!fp)
            
    return 0;
        
    while(!feof(fp))
        
    {
            fscanf(fp,
    "%d%f%f%f",&temp,&r,&g,&b);
            wavelen[i]
    =(double)temp;
            red[i]
    =r;
            green[i]
    =g;
            blue[i]
    =b;
            fscanf(fp,
    "%f%f%f",&r,&g,&b);//空的,不对刺激值
            if(i>=80)
                
    break;
            i
    ++;
        }

        fclose(fp);
        
    return 1;
    }

    //三次样条插值函数
    double GetValueSpline(int n, double x[], double y[], double t)

        
    int i,j;
        
    double h0,h1,alpha,beta,*s,z,*dy;
        dy
    =new double[n];
        
    for(i=0;i<n;i++)dy[i]=0.0;
        
    // 初值
        s=new double[n];
        s[
    0]=dy[0]; 
        dy[
    0]=0.0;
        h0
    =x[1]-x[0];
        
        
    for (j=1;j<=n-2;j++)
        

            h1
    =x[j+1]-x[j];
            alpha
    =h0/(h0+h1);
            beta
    =(1.0-alpha)*(y[j]-y[j-1])/h0;
            beta
    =3.0*(beta+alpha*(y[j+1]-y[j])/h1);
            dy[j]
    =-alpha/(2.0+(1.0-alpha)*dy[j-1]);
            s[j]
    =(beta-(1.0-alpha)*s[j-1]);
            s[j]
    =s[j]/(2.0+(1.0-alpha)*dy[j-1]);
            h0
    =h1;
        }


        
    for (j=n-2;j>=0;j--)dy[j]=dy[j]*dy[j+1]+s[j];
        
        
    for (j=0;j<=n-2;j++)s[j]=x[j+1]-x[j];
        
        
    if (t>=x[n-1])i=n-2;
        
    else
        

            i
    =0;
            
    while (t>x[i+1]) 
            i
    =i+1;
        }

            
        h1
    =(x[i+1]-t)/s[i];
        h0
    =h1*h1;
        z
    =(3.0*h0-2.0*h0*h1)*y[i];
        z
    =z+s[i]*(h0-h0*h1)*dy[i];

        h1
    =(t-x[i])/s[i];
        h0
    =h1*h1;
        z
    =z+(3.0*h0-2.0*h0*h1)*y[i+1];
        z
    =z-s[i]*(h0-h0*h1)*dy[i+1];
        
        delete[] s;
        delete[] dy;

        
    return(z);
    }

    //绘制光谱
    void CSpectrumView::OnDraw(CDC* pDC)
    {
        CSpectrumDoc
    * pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        
    // TODO: add draw code for native data here
        double r,g,b;
        CRect rect;
        rect.top
    =10;
        rect.bottom
    =200;
        rect.left
    =10;
        
    for(int i=0;i<=400;i++)
        
    {
            rect.right
    =rect.left+1;
            r
    =GetValueSpline(81,wavelen,red,380.0+i);
            g
    =GetValueSpline(81,wavelen,green,380.0+i);
            b
    =GetValueSpline(81,wavelen,blue,380.0+i);
            pDC
    ->FillSolidRect(&rect,RGB(int(255.0*r),int(255.0*g),int(255.0*b)));
            rect.left
    ++;
        }

        
    //画标尺
        pDC->SetBkMode(TRANSPARENT);
        pDC
    ->MoveTo(10,200);
        pDC
    ->LineTo(10,225);
        pDC
    ->TextOut(10,200,"380纳米");
        pDC
    ->MoveTo(210,200);
        pDC
    ->LineTo(210,225);
        pDC
    ->TextOut(210,200,"580纳米");
        pDC
    ->MoveTo(410,200);
        pDC
    ->LineTo(410,225);
        pDC
    ->TextOut(410,200,"780纳米");
    }

     

    数据文件格式

    380
     0.1741
     0.0050
     0.8209
     0.00145
     0.0000
     0.0065
     
    385
     0.1740
     0.0050
     0.8210
     0.0022
     0.0001
     0.0105

    第一条为波长数据,接下来三行为红绿蓝的分量,最后三个为各色的刺激值(这里没用上)。

    效果图

    注:实际上,根据量子力学,实际的光谱是不连续的。

    文件内容

    380
     0.1741
     0.0050
     0.8209
     0.00145
     0.0000
     0.0065
     
    385
     0.1740
     0.0050
     0.8210
     0.0022
     0.0001
     0.0105
     
    390
     0.1738
     0.0049
     0.8213
     0.0042
     0.0001
     0.0201
     
    395
     0.1736
     0.0049
     0.8215
     0.0076
     0.0002
     0.0362
     
    400
     0.1733
     0.0048
     0.8219
     0.0143
     0.0004
     0.0679
     
    405
     0.1730
     0.0048
     0.8222
     0.0232
     0.0006
     0.1102
     
    410
     0.1726
     0.0048
     0.8226
     0.0435
     0.0012
     0.2074
     
    415
     0.1721
     0.0048
     0.8231
     0.0776
     0.0022
     0.3713
     
    420
     0.1714
     0.0051
     0.8235
     0.1344
     0.0040
     0.6456
     
    425
     0.1703
     0.0058
     0.8239
     0.2148
     0.0073
     1.0391
     
    430
     0.1689
     0.0069
     0.8242
     0.2839
     0.0116
     1.3856
     
    435
     0.1669
     0.0086
     0.8245
     0.3285
     0.0168
     1.6230
     
    440
     0.1644
     0.0109
     0.8247
     0.3483
     0.0230
     1.7471
     
    445
     0.1611
     0.0138
     0.8251
     0.3481
     0.0298
     1.7826
     
    450
     0.1566
     0.0177
     0.8257
     0.3362
     0.0380
     1.7721
     
    455
     0.1510
     0.0227
     0.8263
     0.3187
     0.0480
     1.7441
     
    460
     0.1440
     0.0297
     0.8263
     0.2908
     0.0600
     1.6692
     
    465
     0.1355
     0.0399
     0.8246
     0.2511
     0.0739
     1.5281
     
    470
     0.1241
     0.0578
     0.8181
     0.1954
     0.0910
     1.2876
     
    475
     0.1096
     0.0868
     0.8036
     0.1421
     0.1126
     1.0419
     
    480
     0.0913
     0.1327
     0.7760
     0.0956
     0.1390
     0.8130
     
    485
     0.0687
     0.2007
     0.7306
     0.0580
     0.1693
     0.6162
     
    490
     0.0454
     0.2950
     0.6596
     0.0320
     0.2080
     0.4652
     
    495
     0.0235
     0.4127
     0.5638
     0.0147
     0.2586
     0.3533
     
    500
     0.0082
     0.5384
     0.4534
     0.0049
     0.3230
     0.2720
     
    505
     0.0039
     0.6548
     0.3413
     0.0024
     0.4073
     0.2123
     
    510
     0.0139
     0.7502
     0.2359
     0.0093
     0.5030
     0.1582
     
    515
     0.0389
     0.8120
     0.1491
     0.0291
     0.6082
     0.1117
     
    520
     0.0743
     0.8338
     0.0919
     0.0633
     0.7100
     0.0782
     
    525
     0.1142
     0.8262
     0.0596
     0.1096
     0.7932
     0.0573
     
    530
     0.1547
     0.8059
     0.0394
     0.1655
     0.8620
     0.0422
     
    535
     0.1929
     0.7816
     0.0255
     0.2257
     0.9149
     0.0298
     
    540
     0.2296
     0.7543
     0.0161
     0.2904
     0.9540
     0.0203
     
    545
     0.2658
     0.7243
     0.0099
     0.3597
     0.9803
     0.0134
     
    550
     0.3016
     0.6923
     0.0061
     0.4334
     0.9950
     0.0087
     
    555
     0.3373
     0.6589
     0.0038
     0.5121
     1.0000
     0.0057
     
    560
     0.3731
     0.6245
     0.0024
     0.5945
     0.9950
     0.0039
     
    565
     0.4087
     0.5896
     0.0017
     0.6784
     0.9786
     0.0027
     
    570
     0.4441
     0.5547
     0.0012
     0.7621
     0.9520
     0.0021
     
    575
     0.4788
     0.5202
     0.0010
     0.8425
     0.9154
     0.0010
     
    580
     0.5125
     0.4866
     0.0009
     0.9163
     0.8700
     0.0017
     
    585
     0.5448
     0.4544
     0.0008
     0.9786
     0.8163
     0.0014
     
    590
     0.5752
     0.4242
     0.0006
     1.0263
     0.7570
     0.0011
     
    595
     0.6029
     0.3965
     0.0006
     1.0567
     0.6949
     0.0010
     
    600
     0.6270
     0.3725
     0.0005
     1.0522
     0.6130
     0.0008
     
    605
     0.6482
     0.3514
     0.0004
     1.0456
     0.5668
     0.0006
     
    610
     0.6658
     0.3340
     0.0002
     1.0026
     0.5030
     0.0003
     
    615
     0.6801
     0.3197
     0.0002
     0.9384
     0.4412
     0.0002
     
    620
     0.6915
     0.3083
     0.0002
     0.8544
     0.3810
     0.0002
     
    625
     0.7006
     0.2993
     0.0001
     0.7514
     0.3210
     0.0001
     
    630
     0.7079
     0.2920
     0.0001
     0.6424
     0.2650
     0.0000
     
    635
     0.7140
     0.2859
     0.0001
     0.5419
     0.2170
     0.0000
     
    640
     0.7219
     0.2809
     0.0001
     0.4479
     0.1750
     0.0000
     
    645
     0.7230
     0.2770
     0.0000
     0.3608
     0.1382
     0.0000
     
    650
     0.7260
     0.2740
     0.0000
     0.2835
     0.1070
     0.0000
     
    655
     0.7283
     0.2717
     0.0000
     0.2187
     0.0816
     0.0000
     
    660
     0.7300
     0.2700
     0.0000
     0.1649
     0.0610
     0.0000
     
    665
     0.7311
     0.2689
     0.0000
     0.1212
     0.0446
     0.0000
     
    670
     0.7320
     0.2680
     0.0000
     0.0874
     0.0320
     0.0000
     
    675
     0.7327
     0.2673
     0.0000
     0.0636
     0.0232
     0.0000
     
    680
     0.7334
     0.2666
     0.0000
     0.0468
     0.0170
     0.0000
     
    685
     0.7340
     0.2660
     0.0000
     0.0329
     0.0119
     0.0000
     
    690
     0.7344
     0.2656
     0.0000
     0.0227
     0.0082
     0.0000
     
    695
     0.7346
     0.2654
     0.0000
     0.0158
     0.0057
     0.0000
     
    700
     0.7347
     0.2653
     0.0000
     0.0114
     0.0041
     0.0000
     
    705
     0.7347
     0.2653
     0.0000
     0.0081
     0.0029
     0.0000
     
    710
     0.7347
     0.2653
     0.0000
     0.0058
     0.0021
     0.0000
     
    715
     0.7347
     0.2653
     0.0000
     0.0041
     0.0015
     0.0000
     
    720
     0.7347
     0.2653
     0.0000
     0.0029
     0.0010
     0.0000
     
    725
     0.7347
     0.2653
     0.0000
     0.0020
     0.0007
     0.0000
     
    730
     0.7347
     0.2653
     0.0000
     0.0014
     0.0005
     0.0000
     
    735
     0.7347
     0.2653
     0.0000
     0.0010
     0.0004
     0.0000
     
    740
     0.7347
     0.2653
     0.0000
     0.0007
     0.0002
     0.0000
     
    745
     0.7347
     0.2653
     0.0000
     0.0005
     0.0002
     0.0000
     
    750
     0.7347
     0.2653
     0.0000
     0.0003
     0.0001
     0.0000
     
    755
     0.7347
     0.2653
     0.0000
     0.0002
     0.0001
     0.0000
     
    760
     0.7347
     0.2653
     0.0000
     0.0002
     0.0001
     0.0000
     
    765
     0.7347
     0.2653
     0.0000
     0.0001
     0.0000
     0.0000
     
    770
     0.7347
     0.2653
     0.0000
     0.0001
     0.0000
     0.0000
     
    775
     0.7347
     0.2653
     0.0000
     0.0001
     0.0000
     0.0000
     
    780
     0.7347
     0.2653
     0.0000
     0.0000
     0.0000
     0.0000
     

    发表于 @ 2006年12月11日 13:23:00|评论(loading...)|编辑

    新一篇: 唐伯虎点秋香经典台词完整版(周星驰) | 旧一篇: 一个极好的OpenGL汉字显示类

    评论

    #laviewpbt 发表于2007-05-06 20:53:49  IP: 61.187.64.*
    楼主能帖个你的最终效果图吗
    #kuelite 发表于2007-06-06 00:19:33  IP: 60.17.63.*
    作者很有心,谢谢了
    #kuelite 发表于2007-06-06 00:25:26  IP: 60.17.63.*
    用三次样条插值来拟合波长与颜色的变化曲线,有什么根据么?
    http://www.cgan.net/book/books/print/packcolor/link/5-4-2.html并没有说明!
    只说明了亮度因数Y与明度值V之间是非线性关系。它们之间的函数关系,可用五次多项式表示!
    #Y___Y 发表于2007-06-06 14:51:10  IP: 218.104.96.*
    回楼上:
    既然是拟合,就是一种近似,只要数据点足够密,就可达到足够的精度,当然你可以用其它方法来拟合。
    为什么用三次样条插值来拟合,因为工程界用的最普遍,其优点如下:
    具有二阶导数,也就是很"光滑"
    计算量较小(高次计算量大)
    比较稳定(高次不稳定)
    这就是为什么不用五次
    #zhukui_emma 发表于2007-09-17 13:38:13  IP: 10.11.153.*
    小女求NURBS曲面拟合的代码,最好有例子。
    邮箱:zhukui_emma@126.com
    #zhqpl 发表于2008-09-26 11:44:49  IP: 222.33.90.*
    哥们儿,这源码公式的出处是什么,对应不上啊,困扰了好久,希望能给些提示,比如:
    for (j=1;j<=n-2;j++)
    {
    h1=x[j+1]-x[j];//ok
    alpha=h0/(h0+h1);//ok
    beta=(1.0-alpha)*(y[j]-y[j-1])/h0;//ok
    beta=3.0*(beta+alpha*(y[j+1]-y[j])/h1);///ok
    dy[j]=-alpha/(2.0+(1.0-alpha)*dy[j-1]);///??对应公式
    s[j]=(beta-(1.0-alpha)*s[j-1]);////??
    s[j]=s[j]/(2.0+(1.0-alpha)*dy[j-1]);//??
    h0=h1;
    }
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © Y___Y