2014-08-14 3 views
1

Я пытаюсь разработать наилучший подход к разделению формы круга в холсте в горизонтальные полосы. У меня есть изображение в качестве примера:Холст: Разделить круг на горизонтальные полосы

Circle In Strips Example

Моя первая идея состояла в том, чтобы нарисовать набор прямоугольников и клип/обрезать его с формой круга. Но мне нужно оживить/масштабировать каждую отдельную полосу. Так что действительно, мне нужно попробовать и сделать это без обрезки.

Поэтому я подумал о создании кривой/пути, но края должны следовать за идеальным кругом. Есть ли какая-то базовая математика, которую я мог бы использовать для этого?

Я выполнил различные биты поиска, однако большинство ресурсов указывают на круговые диаграммы, что не то, что мне нужно. Я продолжу поиск, но если у вас есть рекомендации или ресурсы, которые я мог бы изучить, я бы очень признателен!

Благодаря

+3

Рассматривали вы с использованием градиента с нулевой шириной изменяется от одного цвета к другому? – abiessu

+0

Спасибо за ваш комментарий. Мне нужно, чтобы каждый отдельный сегмент был подвижным/независимым. Разве мы не можем сделать это с помощью градиентов? Примером может быть опрокидывание сегментов круговой диаграммы. –

ответ

3

Идя с идеей, предложенной 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(); 

Nice цветовой палитры, кстати!

GIF Animation

+1

+1 удивительный gif. – Loktar

+1

@Loktar Спасибо! Шаги по твоему дерну здесь;) 17k + rep? Ты сумасшедший. – jackrugile

+0

Спасибо за вашу тяжелую работу. тоже выглядит круто :). Тем не менее, мне нужен фактический круг для статичности, а части круга - подвижные или сегменты? Думаю, пример будет, когда вы перевернете сегмент круговой диаграммы? –

Смежные вопросы