最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

详解HTML5Canvas绘制不规则图形时的非零环绕原则_html5教程技巧

来源:动视网 责编:小采 时间:2020-11-27 15:15:53
文档

详解HTML5Canvas绘制不规则图形时的非零环绕原则_html5教程技巧

详解HTML5Canvas绘制不规则图形时的非零环绕原则_html5教程技巧:路径方向与非零环绕原则平时我们画的图形都是规规矩矩的,那么如果我们用线条画了个抽象派作品,就像下面这图一样,童鞋们知道怎么用fill()染色呢? 这里就要用到数学上的一个方法——非零环绕原则,来判断哪块区域是里面,哪块区域是外面。接下来
推荐度:
导读详解HTML5Canvas绘制不规则图形时的非零环绕原则_html5教程技巧:路径方向与非零环绕原则平时我们画的图形都是规规矩矩的,那么如果我们用线条画了个抽象派作品,就像下面这图一样,童鞋们知道怎么用fill()染色呢? 这里就要用到数学上的一个方法——非零环绕原则,来判断哪块区域是里面,哪块区域是外面。接下来
 路径方向与非零环绕原则
平时我们画的图形都是规规矩矩的,那么如果我们用线条画了个抽象派作品,就像下面这图一样,童鞋们知道怎么用fill()染色呢?

这里就要用到数学上的一个方法——非零环绕原则,来判断哪块区域是里面,哪块区域是外面。接下来,我们具体来看下什么是非零环绕原则。

首先,我们得给图形确定一条路径,只要“一笔画”并且“不走重复路线”就可以了。如图,标出的是其中的一种路径方向。我们先假定路径的正方向为1(其实为-1啥的也都可以,正负方向互为相反数,不是0就行),那么反方向就是其相反数-1。
然后,我们在子路径切割的几块区域内的任意一点各取一条方向任意的射线,这里我只取了三个区域的射线为例,来判断这三块区域是“里面”还是“外面”。
接下来,我们就来判断了。S1中引出的射线L1,与S1的子路径的正方向相交,那么我们就给计数器+1,结果为+1,在外面。
S2中引出的射线L2,与两条子路径的正方向相交,计数器+2,结果为+2,在外面。
S3中引出的射线L3,与两条子路径相交,但是其中有一条的反方向,计数器+1-1,结果为0,在里面。没错,只要结果不为0,该射线所在的区域就在外面。


绘制圆环
记得arc方法吗?它的最后一个参数就是判断是路径方向的,如果是路径相反的两个同心圆在一起,图上色会有什么神奇的效果呢?

下面我们通过代码来实现它。

JavaScript Code复制内容到剪贴板

  1. 圆环
  2. "canvas-warp">
  3. 你的浏览器居然不支持Canvas?!赶快换一个吧!!
  4. window.onload = function(){
  5. var canvas = document.getElementById("canvas");
  6. canvas.width = 800;
  7. canvas.height = 600;
  8. var context = canvas.getContext("2d");
  9. context.fillStyle = "#FFF";
  10. context.fillRect(0,0,800,600);
  11. context.shadowColor = "#545454";
  12. context.shadowOffsetX = 5;
  13. context.shadowOffsetY = 5;
  14. context.shadowBlur = 2;
  15. context.arc(400, 300, 200, 0, Math.PI * 2 ,false);
  16. context.arc(400, 300, 230, 0, Math.PI * 2 ,true);
  17. context.fillStyle = "#00AAAA";
  18. context.fill();
  19. };

运行结果:

镂空剪纸效果
接下来,我们利用非零环绕原则和阴影来绘制一个镂空的剪纸效果。

JavaScript Code复制内容到剪贴板

  1. 镂空剪纸效果
  2. "canvas-warp">
  3. 你的浏览器居然不支持Canvas?!赶快换一个吧!!
  4. window.onload = function(){
  5. var canvas = document.getElementById("canvas");
  6. canvas.width = 800;
  7. canvas.height = 600;
  8. var context = canvas.getContext("2d");
  9. context.fillStyle = "#FFF";
  10. context.fillRect(0,0,800,600);
  11. context.beginPath();
  12. context.rect(200,100,400,400);
  13. drawPathRect(context, 250, 150, 300, 150);
  14. drawPathTriangle(context, 345, 350, 420, 450, 270, 450);
  15. context.arc(500, 400, 50, 0, Math.PI * 2, true);
  16. context.closePath();
  17. context.fillStyle = "#058";
  18. context.shadowColor = "gray";
  19. context.shadowOffsetX = 10;
  20. context.shadowOffsetY = 10;
  21. context.shadowBlur = 10;
  22. context.fill();
  23. };
  24. //逆时针绘制矩形
  25. function drawPathRect(cxt, x, y, w, h){
  26. /**
  27. * 这里不能使用beginPath和closePath,
  28. * 不然就不属于子路径而是另一个全新的路径,
  29. * 无法使用非零环绕原则
  30. */
  31. cxt.moveTo(x, y);
  32. cxt.lineTo(x, y + h);
  33. cxt.lineTo(x + w, y + h);
  34. cxt.lineTo(x + w, y);
  35. cxt.lineTo(x, y);
  36. }
  37. //逆时针绘制三角形
  38. function drawPathTriangle(cxt, x1, y1, x2, y2, x3, y3){
  39. cxt.moveTo(x1,y1);
  40. cxt.lineTo(x3,y3);
  41. cxt.lineTo(x2,y2);
  42. cxt.lineTo(x1,y1);
  43. }

运行结果:

这里手动绘制矩形的原因是我们想要得到逆时针路径的矩形,而且API提供的rect()方法绘制是顺时针矩形。另外,需要注意的是,这个剪纸是一个图形,一个路径。不能在绘制镂空三角形和绘制镂空矩形的方法里使用beginPath()和closePath(),不然它们就会是新的路径、新的图形,而不是剪纸的子路径、子图形,就无法使用非零环绕原则。

文档

详解HTML5Canvas绘制不规则图形时的非零环绕原则_html5教程技巧

详解HTML5Canvas绘制不规则图形时的非零环绕原则_html5教程技巧:路径方向与非零环绕原则平时我们画的图形都是规规矩矩的,那么如果我们用线条画了个抽象派作品,就像下面这图一样,童鞋们知道怎么用fill()染色呢? 这里就要用到数学上的一个方法——非零环绕原则,来判断哪块区域是里面,哪块区域是外面。接下来
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top