这是一个静态插值算法的效果,图形学中插值算法应用十分广。如动画。photoshop, autocAD等软件画曲线,还有shader中的渐变上色也是一个硬件支持的插值算法。

Interpolation是非常低层的算法,在图形学中能够说无处不在。

本程序通过设置两个vector。然后就能够在这两个vector之间插入点,得到不同的效果

如两个vector不同长度能够得到:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

假设长度同样。就能够得到一个扇形:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

所有自家定义的函数实现的,主要代码:

一)计算两个向量的夹角。返回夹角大小:

float calVecTheta(Vector2f vfir, Vector2f vsec)
{
float r = sqrtf(vfir.x * vfir.x + vfir.y * vfir.y);
Vector2f vfirNor;
vfirNor.x = vfir.x / r;
vfirNor.y = vfir.y / r; r = sqrtf(vsec.x * vsec.x + vsec.y * vsec.y);
Vector2f vsecNor;
vsecNor.x = vsec.x / r;
vsecNor.y = vsec.y / r; float theta = acosf(vfirNor.x * vsecNor.x + vfirNor.y * vsecNor.y);
return theta;
}

二) 实现插值公式

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">:

void interpolateTwoVectors(Vector2f &vout, Vector2f &vfir, Vector2f &vsec,
float theta, float t)
{
float a = sinf((1.0f-t) * theta) / sinf(theta);
float b = sinf(t * theta) / sinf(theta); vout.x = a * vfir.x + b * vsec.x;
vout.y = a * vfir.y + b * vsec.y;
}

三)产生顶点缓冲:

void createGeoAndBuffer()
{
Vector2f vers[SEGMENTS*2+2];
Vector2f vfir(1.f, 0.f);
Vector2f vsec(-1.f/sqrtf(2.0f), 1.f/sqrtf(2.0f));
vers[1] = vfir, vers[3] = vsec; float theta = calVecTheta(vfir, vsec);
for (int i = 4, d = 1; i < SEGMENTS*2+2; i += 2, d++)
{
interpolateTwoVectors(vers[i+1], vfir, vsec, theta,
float(d) / (float)SEGMENTS);
} glGenBuffers(1, &VBO);//注意是1, &VBO
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vers), vers, GL_STATIC_DRAW);
}

以上就是基本的算法代码了。

插值算法还能够实现非常多有趣的效果,由于它乃是动画的最底层算法,如非常多人玩的flash动画,flash会自己主动产生连贯的帧,实现动画效果。非常奇妙吧? 事实上产生的动画效果就是使用了这个插值算法的。

呵呵。在底层逻辑原理面前,能解开一切神奇面纱,Magic has been demistified。

有空会实现很多其它效果。

最新文章

  1. php5.3到php7.0.x新特性介绍
  2. Js之AJAX
  3. io多路复用,select,笔记
  4. easyui-treegrid节点选择
  5. 调试CRM JS开发
  6. writing concurrent programs
  7. ActiveMQ实现负载均衡+高可用部署方案(转)
  8. maven 练习
  9. POJ2965The Pilots Brothers&#39; refrigerator
  10. 悟透Javascript undefined,null,&quot;&quot;,0这四个值转换为逻辑值时就是false &amp;this关键字
  11. 【C#学习笔记】一、基础知识
  12. VC中Tab control的用法
  13. 基于vue2.0+vuex+localStorage开发的本地记事本
  14. csrf学习笔记
  15. Android 上传图片到服务器 okhttp一
  16. easyui自定义皮肤及缺陷修改
  17. es 服务器搭建
  18. js中session操作
  19. WPF 实现阴影效果
  20. 【TensorFlow】获取object detection API训练模型的输出坐标

热门文章

  1. Windows Phone开发(46):与Socket有个约会
  2. 关于安装linux时要怎么分区的考虑的參考方式?
  3. [Windows]_[0基础]_[使用命令行工具dumpbin分析文件]
  4. 重新想象 Windows 8 Store Apps (10) - 控件之 ScrollViewer 特性: Chaining, Rail, Inertia, Snap, Zoom
  5. SQL server 表数据改变触发发送邮件
  6. 【原创】纯OO:从设计到编码写一个FlappyBird (二)
  7. JSP+Ajax站点开发小知识
  8. 新浪微博id的62进制转换
  9. redmine忘记username和password
  10. ReactJS学习 相关网站