如何将不同大小的圆圈对齐到中间?

时间:2017-06-16 06:45:10

标签: javascript html5 algorithm math canvas

我想将不同大小的圆圈对齐到中间线,例如:

1圈:



var c=document.getElementById("myCanvas");
var ctx=document.getElementById("myCanvas").getContext("2d");
var r1=Math.random()*50;

ctx.beginPath();
ctx.fillStyle="#"+((1<<24)*Math.random()|0).toString(16);
ctx.arc(c.width/2,c.height/2,r1,0,2*Math.PI);
ctx.fill();
&#13;
<div>
    <canvas id="myCanvas" width="500" height="100" style="position:absolute;border:1px solid black;"></canvas>
    <div style="position:absolute;width:250px;height:100px;border:1px solid black;"/>
</div>
&#13;
&#13;
&#13;

2个圈子:

&#13;
&#13;
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");

var r1=Math.random()*50;
var r2=Math.random()*50;

ctx.beginPath();
ctx.fillStyle="#"+((1<<24)*Math.random()|0).toString(16);
ctx.arc(-r2+c.width/2,c.height/2,r1,0,2*Math.PI);
ctx.fill();

ctx.beginPath();
ctx.fillStyle="#"+((1<<24)*Math.random()|0).toString(16);
ctx.arc(r1+c.width/2,c.height/2,r2,0,2*Math.PI);
ctx.fill();
&#13;
<div>
    <canvas id="myCanvas" width="500" height="100" style="position:absolute;border:1px solid black;"></canvas>
    <div style="position:absolute;width:250px;height:100px;border:1px solid black;"/>
</div>
&#13;
&#13;
&#13;

3,4,... n圈怎么样?

var r[]=[Math.random()*50,Math.random()*50,...];
for(var i=0;i<r.length;i++){
    ctx.beginPath();
    ctx.fillStyle="#"+((1<<24)*Math.random()|0).toString(16);
    ctx.arc(???+c.width/2,c.height/2,r[i],0,2*Math.PI);
    ctx.fill();
}

那是什么通用公式?

1 个答案:

答案 0 :(得分:1)

首先需要通过求和所有半径来计算totalRadius。最左边的点是cavnas.width/2 - totalRadius。然后,您只需使用前一个左侧

绘制每个下一个圆圈

&#13;
&#13;
const canvas = document.querySelector('#myCanvas')
const ctx = canvas.getContext("2d")
  
const draw = (r, center) => {
  ctx.beginPath()
  ctx.fillStyle="#"+((1<<24)*Math.random()|0).toString(16);
  ctx.arc(center, canvas.height/2, r, 0, 2*Math.PI);
  ctx.fill();
}

const randomR = () => 10 + Math.random()*40

const rs = new Array(7).fill().map(randomR)

// calculate the very left point
let left = canvas.width/2 - rs.reduce((sum, r) => sum + r)

rs.forEach(r => {
  // center will be current left + r
  draw(r, left + r)
  
  // next left moved by diameter
  left += 2*r
})
&#13;
<div>
        <canvas id="myCanvas" width="500" height="100" style="position:absolute;border:1px solid black;"></canvas>
        <div style="position:absolute;width:250px;height:100px;border:1px solid black;"/>
    </div>
&#13;
&#13;
&#13;