画布:将圆圈分成水平条

Posted

技术标签:

【中文标题】画布:将圆圈分成水平条【英文标题】:Canvas: Split circle into horizontal strips 【发布时间】:2014-10-08 10:18:07 【问题描述】:

我正在尝试找出将画布中的圆形分割成水平条的最佳方法。我以一张图片为例:

我的第一个想法是绘制一组矩形并用圆形对其进行剪辑/裁剪。但我需要为每个单独的条带设置动画/缩放。所以真的,我需要尝试在不剪裁的情况下做到这一点。

然后我考虑创建一条曲线/路径,但边缘需要遵循一个完美的圆。是否有一些基本的数学可以用来解决这个问题?

我进行了各种搜索,但大多数资源都指向饼图,这不是我想要的。我会继续搜索,但如果您有建议或资源我可以查看,我将不胜感激!

谢谢

【问题讨论】:

您是否考虑过使用从一种颜色到另一种颜色的零宽度变化的渐变? 感谢您的评论。我需要每个单独的部分都是可移动/独立的。除非我们可以用渐变来做到这一点?一个示例是饼图段上的翻转。 【参考方案1】:

根据 abiessu 提出的想法,这里有一个使用弧线和渐变实现该效果的示例。我使演示的步骤相同。这也表明它随着时间的推移动画:

JSFiddle Demo

var canvas = document.createElement( 'canvas' ),
    ctx = canvas.getContext( '2d' ),
    width = canvas.width = 400,
    height = canvas.height = 400,
    baseRadius = 100,
    rangeRadius = 50,
    colors = [
      '#2c7ba4',
      '#2a8598',
      '#47949e',
      '#2d8b79',
      '#549d82',
      '#5c9270',
      '#899277',
      '#cec2ac'
    ],
    tick = 0;

function loop() 
  requestAnimationFrame( loop );
  ctx.clearRect( 0, 0, width, height );
  var radius = baseRadius + Math.sin( tick / 50 ) * rangeRadius,
      spacing = ( height - radius * 2 ) / 2,
      gradient = ctx.createLinearGradient( 0, spacing, 0, height - spacing ),
      colorsLength = colors.length,
      i;

  for( i = 0; i < colorsLength; i++ ) 
    var color = colors[ i ];
    gradient.addColorStop( i / colorsLength, color );
    gradient.addColorStop( ( i + 1 ) / colorsLength, color );
  

  ctx.beginPath();
  ctx.arc( width / 2, height / 2, radius, 0, Math.PI * 2 );
  ctx.fillStyle = gradient;
  ctx.fill();

  tick++;


document.body.appendChild( canvas );
loop();

顺便说一句,漂亮的调色板!

【讨论】:

@Loktar 谢谢!在这里踏上你的地盘;) 17k+ 代表?你疯了。 感谢您的辛勤工作。看起来也很酷:)。但是,我需要实际的圆是静态的,而圆的部分是可移动的或分段的?我想一个例子是当你滚动一个饼图段时? @Patch5216 啊,我明白了。让我考虑一下。另外,您是否有指向此类运动示例的链接,例如饼图?我想我知道你的意思,只是想确定一下。 嗨@jackrugile,感谢您的回复!此处页面顶部有一个饼图:developers.google.com/chart 和其他一些示例:chartjs.org。如果您悬停/翻转,您会明白我的意思。它们都运行良好,但我只是不确定如何水平或垂直分割它:S 啊,我明白了,所以您希望它像那些饼图一样工作,每个部分都可以独立处理,但您将只是水平条带,而不是像普通饼图那样从中心构建。这很难,会考虑;)

以上是关于画布:将圆圈分成水平条的主要内容,如果未能解决你的问题,请参考以下文章

将垂直滚动条添加到嵌入式 matplotlib 画布,同时保持其水平大小占据整个 QScrollArea

如何用 HTML5 画布将一个圆圈分成三个相等的部分?

如何使fabricJS画布在移动设备上可水平拖动?

SVG 动画圆圈垂直和水平居中

画布上的水平滚动。 HTML5

如何仅绘制垂直和水平线(画布)