查看: 657|回复: 0

三次线性插值//at3是什么意思。。。

[复制链接]

该用户从未签到

发表于 2014-9-20 17:21:05 | 显示全部楼层 |阅读模式
本帖最后由 oirrm 于 2014-9-23 00:18 编辑


  1. #include "stdafx.h"

  2. ;
  3. #define BM 0xff         //255  
  4. #define N 0x1000        //4096  
  5. #define B 0x100        //256  

  6. int b00, b10, b01, b11;
  7. int bx0, bx1, by0, by1, bz0, bz1;
  8. float rx0, rx1, ry0, ry1, rz0, rz1;
  9. float sx,sy,sz;
  10. float t,u,v,a,b,c,d;
  11. float* q;
  12. float vec[3];
  13. static int p[ B + B + 2];  
  14. static float g3[B + B + 2][3];  
  15. static float g2[B + B + 2][2];  
  16. static float g1[B + B +2];  
  17. int i,j;

  18. #define lerp(t, a, b) ( a + t * (b - a) )  
  19. #define s_curve(t) ( t * t * (3. - 2. * t) )  
  20. #define setup(i,b0,b1,r0,r1)\
  21.     t = vec[i] + N;\
  22.     b0 = ((int)t) & BM;\
  23.     b1 = (b0+1) & BM;\
  24.     r0 = t - (int)t;\
  25.     r1 = r0 - 1.;
  26. #define at3(rx,ry,rz) ( rx * q[0] + ry * q[1] + rz * q[2] )



  27. int _tmain(int argc, _TCHAR* argv[])
  28. {
  29.         setup(0, bx0, bx1, rx0, rx1); //0,1,0,-1
  30.     setup(1, by0, by1, ry0, ry1); //0,1,0,-1
  31.     setup(2, bz0, bz1, rz0, rz1); //0,1,0,-1
  32.        
  33.         i = p[bx0];  
  34.     j = p[bx1];  
  35.   
  36.     b00 = p[i+by0];//得到四个随机值  
  37.     b10 = p[j+by0];  
  38.     b01 = p[i+by1];  
  39.     b11 = p[j+by1];  
  40.   
  41.         sx = s_curve(rx0);  
  42.     sy = s_curve(ry0);  
  43.     sz = s_curve(rz0);

  44.         q = g3[b00 + bz0];u = at3(rx0, ry0, rz0);//将(bx0,by0,bz0)处的梯度与中间点到该点的向量(rx0,ry0,rz0)相乘  
  45.     q = g3[b10 + bz0]; v = at3(rx1, ry0, rz0);//将(bx1,by0,bz0)处的梯度与中间点到该点的向量(rx1,ry0,rz0)相乘  
  46.     a = lerp(sx, u, v);  
  47.   
  48.     q = g3[b01 + bz0]; u = at3(rx0, ry1, rz0);//将(bx0,by1,bz0)处的梯度与中间点到该点的向量(rx0,ry1,rz0)相乘  
  49.     q = g3[b11 + bz0];v = at3(rx1, ry1, rz0);//将(bx1,by1,bz0)处的梯度与中间点到该点的向量(rx1,ry1,rz0)相乘  
  50.     b = lerp(sx, u, v);  
  51.   
  52.     c = lerp(sy, a, b);

  53.         q = g3[b00 + bz1];u = at3(rx0, ry0, rz1);//将(bx0,by0,bz1)处的梯度与中间点到该点的向量(rx0,ry0,rz1)相乘  
  54.     q = g3[b10 + bz1];v = at3(rx1, ry0, rz1);//将(bx1,by0,bz1)处的梯度与中间点到该点的向量(rx1,ry0,rz1)相乘  
  55.     a = lerp(sx, u, v);  
  56.   
  57.     q = g3[b01 + bz1];u = at3(rx0, ry1, rz1);//将(bx0,by1,bz1)处的梯度与中间点到该点的向量(rx0,ry1,rz1)相乘  
  58.     q = g3[b11 + bz0];v = at3(rx1, ry1, rz1);//将(bx1,by1,bz1)处的梯度与中间点到该点的向量(rx1,ry1,rz1)相乘  
  59.     b = lerp(sx, u, v);  
  60.   
  61.     d = lerp(sy, a, b);  
  62.   
  63.     lerp(sz, c, d);//进行三次线性插值
  64.         getchar();
  65.         return 0;
  66. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表