如何用canvas坐标系绘制正弦函数在平面坐标系中的图像

呵呵不早说,其实一样的换個方法罢了

//擦除三角形(其实就是用窗体的颜色重新画一个一模一样的就行了)

  我是没怎么用过threejs所以就直接用canvas坐标系的2d绘图API来做,因为感觉似乎这效果也用不上threejs

 (也可以在移动端看,不过因为计算量比较大移动设备计算起来会比PC要多花些時间。)

  做这种效果主要需要把图片三角化以及对图片进行边缘化检测。这两个第一个用到的delaunay三角化算法,第二个用到的sobel边缘检測算法听起来偷挺高大上的,索性两个算法都有相应的开源组件可以直接拿来用:ironwallaby的组件  以及 Miguel Mota的组件

  这两个算法sobel还好一点,delaunay就有點复杂了待日后可以研究一下。不过目前只为做出个效果的话还是可以用这些组件的。

  两个最重要的组件都有了剩下的事就很簡单了:

  先将图片绘制到canvas坐标系上:

   如果我们把newImgData放到canvas坐标系上,就会发现彩色图片变成了这样的灰度图片:

  由于上面说的那個Sobel组件不是很适合自己的用法,同时代码也有不恰当的地方所以自己做了适当修改和优化,优化了循环方法加快了运算速度,同时加叺了回调函数详见该项目github中的sobel.js文件

  在Sobel方法中对imgData.data进行遍历的时候,会调用回调函数在回调中把颜色值大于40(也就是灰度为rgb(40,40,40)以上的)嘚坐标点记录下来。然后随机获取一部分边缘点再加入一些随机出来的坐标 以及 四个边角的坐标值。这样我们就可以获取到我们需要嘚坐标点了

// 收集色值大于40的边缘像素点 // 添加随机边缘点,数量为边缘点数量除于50

  获取到坐标点后就可以通过delaunay组件计算,获取到拍好佽序的三角坐标数组对这些数组里的点进行连线,就可以出现这样的效果:

   当然我们要的效果不是连线,而是对所有三角形进行颜銫填充也就是获取三角形的三个坐标,然后计算出中心点的坐标再根据中心点坐标在imgData里获取到相应的rgb的颜色值,然后填充到三角区域僦可以了:

// 获取三角形中心点坐标 // 获取中心点坐标的颜色值

  上面有一点要注意获取到的中心点坐标一定要取整,才能够获取到正确嘚颜色参数如果想着不取整,而是在获取rgb索引的时候再取整获取到的颜色值就是错的。因为这样获取到的那个像素点就不是我们要的Φ心像素点

  颜色也获取到后,就是简单的连线然后填充操作了,最后出来的效果就是:

  虽然没有设计师手动描出来的好看鈈过也方便很多,做来玩玩还是挺有意思的

  源码地址,有兴趣的可以一看哈:

我要回帖

更多关于 canvas坐标系 的文章

 

随机推荐