我想绘制一个具有多剪裁区域的区域。
以下是截图:
我写了一个绘图示例:http://jsfiddle.net/younyzhU/zR9hg/1/
总面积应为四个green
区域+中心白色矩形。
从基础教程中,我知道绘制剪裁平面就像绘制其他东西一样。
然而,创建一个剪裁区域,我们有多个区域,如何组合,任何建议? 感谢。
以下是一些代码:
ctx.save(); // save the context so we don't mess up others
ctx.beginPath();
ctx.fillStyle = "#ffffff";
ctx.rect(this.x, this.y, this.w, this.h);
ctx.fill();
ctx.restore(); // restore context to what it was on entry
ctx.fillStyle = "#00ff00";//Color for four surrounded area.
ctx.save(); // save the context so we don't mess up others
ctx.beginPath();
r = Math.sqrt((this.h/2)*(this.h/2) + 16 *this.w * this.w);
thea = Math.atan(this.h/this.w/8);
ctx.arc(this.x + this.w*4, this.y + this.h/2, r , Math.PI - thea, Math.PI+thea, false);
ctx.closePath();
ctx.fill();
//ctx.clip();
ctx.restore(); // restore context to what it was on entry
ctx.save(); // save the context so we don't mess up others
ctx.beginPath();
r = Math.sqrt((this.h/2)*(this.h/2) + 16 *this.w * this.w);
thea = Math.atan(this.h/this.w/8);
ctx.arc(this.x- this.w*3, this.y + this.h/2, r , -thea, thea, false);
ctx.closePath();
ctx.fill();
//ctx.clip();
ctx.restore(); // restore context to what it was on entry
ctx.save(); // save the context so we don't mess up others
ctx.beginPath();
r = Math.sqrt((this.w/2)*(this.w/2) + 16 * this.h * this.h);
thea = Math.atan(this.w/this.h/8);
ctx.arc(this.x + this.w/2, this.y + 4 * this.h, r , Math.PI*3/2-thea, Math.PI*3/2 + thea, false);
ctx.closePath();
ctx.fill();
ctx.restore(); // restore context to what it was on entry
ctx.save(); // save the context so we don't mess up others
ctx.beginPath();
r = Math.sqrt((this.w/2)*(this.w/2) + 16*this.h*this.h);
thea = Math.atan(this.w/this.h/8);
ctx.arc(this.x + this.w/2, this.y-3*this.h , r , Math.PI/2-thea, Math.PI/2 + thea, false);
ctx.closePath();
ctx.fill();
ctx.restore(); // restore context to what it was on entry
ctx.save();
答案 0 :(得分:2)
剪切路径实际上是一条路径。
这意味着如果您在一条路径中绘制所有4个闭合弧,则可以使用该多形路径进行剪裁。
您可以通过在弧之前执行1 beginPath
命令而不是每个弧之前的beginPath
来组合路径。
结果是一条看起来像这样的路径,您可以将其用作剪切路径:
例如,这是剪切路径可用于包含斜条纹图像的方式:
以下是示例代码和演示:http://jsfiddle.net/m1erickson/LYR3E/
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
body{ background-color: ivory; }
canvas{border:1px solid red;}
</style>
<script>
$(function(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var img=new Image();
img.onload=start;
img.src="https://dl.dropboxusercontent.com/u/139992952/multple/rainbowDiagonal.jpg";
function start(){
ctx.beginPath();
ctx.fillStyle = "#000";
ctx.rect(0,0,canvas.width,canvas.height);
ctx.fill();
draw();
}
function draw(){
var x=50;
var y=50;
var w=200;
var h=200;
ctx.save();
ctx.fillStyle = "#00ff00";//Color for four surrounded area.
ctx.beginPath();
r = Math.sqrt((h/2)*(h/2) + 16 *w * w);
thea = Math.atan(h/w/8);
ctx.arc(x + w*4, y + h/2, r , Math.PI - thea, Math.PI+thea, false);
ctx.closePath();
r = Math.sqrt((h/2)*(h/2) + 16 *w * w);
thea = Math.atan(h/w/8);
ctx.arc(x- w*3, y + h/2, r , -thea, thea, false);
ctx.closePath();
r = Math.sqrt((w/2)*(w/2) + 16 * h * h);
thea = Math.atan(w/h/8);
ctx.arc(x + w/2, y + 4 * h, r , Math.PI*3/2-thea, Math.PI*3/2 + thea, false);
ctx.closePath();
r = Math.sqrt((w/2)*(w/2) + 16*h*h);
thea = Math.atan(w/h/8);
ctx.arc(x + w/2, y-3*h , r , Math.PI/2-thea, Math.PI/2 + thea, false);
ctx.closePath();
ctx.clip();
ctx.drawImage(img,0,0);
ctx.restore();
}
}); // end $(function(){});
</script>
</head>
<body>
<canvas id="canvas" width=300 height=300></canvas>
</body>
</html>