2013-06-14 2 views
0

Я генерирую музыкальную форму волны, используя D3, нажимая прямоугольники рядом друг с другом. Вот скрипку: http://jsfiddle.net/s4dML/Нежелательный мерцающий эффект с использованием D3 для создания смежных прямоугольников

var data = [ 0.0534973, /* ...lots and lots of data... */ 0.290771]; 
data = data.filter(function(datum, index){ 
    return index % 3 == 0; 
}); 

var width  = 340, 
    height  = 70, 
    svg  = d3 
     .select('body') 
     .append('svg') 
     .attr('width', width) 
     .attr('height', height); 

svg 
    .selectAll('rect') 
    .data(data.map(function(datum){ 
     return (datum * height)/2; 
    })) 
    // .data(dataset) 
    .enter() 
    .append('rect') 
    .attr('x', function(d, i){ 
     return i * (width/data.length); 
    }) 
    .attr('y', function(d){ 
     return (height /2) - d ; 
    }) 
    .attr('width', function(d, i){ 
     return width/data.length; 
    }) 
    .attr('height', function(d){ 
     return d*2; 
    }) 
    .attr('fill', 'teal'); 

Кто-нибудь знает, почему результат ins't сингл, плоский цвет, как ожидалось? Во всем есть мерцающий эффект. Это может быть желательно, но независимо от того, я хотел бы знать, как он туда попал и как избавиться от него, если я так склонен.

+0

Мне кажется, что есть чередующиеся полосы света и тьмы. Это то, что вы подразумеваете под мерцанием? Если это так, это может быть вызвано многочисленными границами прямоугольников – waldol1

+0

Да, чередующиеся полосы света и темноты - это нежелательный визуальный эффект, о котором я говорю. Любая идея, как избавиться от них и просто иметь один сплошной цвет? –

ответ

2

Это артефакт рендеринга SVG (или, действительно, любой рендеринг векторной графики). Предположим, что у вас есть два прямоугольника, которые соответствуют 40% пути в пиксель. Затем первый прямоугольник будет рисовать в этот пиксель с непрозрачностью 40%, а второй с непрозрачностью 60%, что означает, что пиксель только (40 + 0,6 * 60 =) 76% цветной, хотя логически он на 100% покрыт цветным формы.

Исправить это, чтобы определить график как один объект <path>, отслеживающий верхний и нижний края без «трещин», подобных этому между прямоугольниками.

Я не знаком с D3, но в обычном Javascript:

var path = "M 0," + (height/2); 

for(var i = 0; i < data.length; i++) { 
    var x = (i + 1) * (width/data.length); 
    var y = height/2 - (data[i] * height)/2; 
    path += " V " + y + " H " + x; 
} 

for(var i = data.length - 1; i >= 0; i--) { 
    var x = i * (width/data.length); 
    var y = height/2 + (data[i] * height)/2; 
    path += " V " + y + " H " + x; 
} 

path += " Z"; 
+0

Интересно. Любые идеи о том, как обойти это? –

+0

Отлично! Я сделаю это выстрелом. –

+1

Этот вид артефактов называется [Moiré Pattern] (http://en.wikipedia.org/wiki/Moir%C3%A9_pattern) – Bojangles

2

ответ Рассела является хорошим, если вы будете в конечном итоге с чудовищным пути. Это не должно быть слишком большой проблемой.

Я столкнулся с той же проблемой на днях, пытаясь создать гистограмму около 500 точек данных, используя очень тонкие полосы. Преимущество этого заключается в том, что гораздо проще сделать наведение мыши, которое выделяет отдельную панель. В таких случаях я обнаружил, что вам нужно использовать целочисленные значения для значений width и x.

Для примера, установив ширину и интервал до 1 полностью устраняет проблему, а только делая это около 10 процентов короче:

http://jsfiddle.net/s4dML/1/

.attr('x', function(d, i){ 
    return i;// * (width/data.length); 
}) 
.attr('y', function(d){ 
    return (height /2) - d ; 
}) 
.attr('width', function(d, i){ 
    return 1; 
}) 

Конечно, это не расширяемый решение- - зависит только от ваших планов по виджету. Я добавил мышь в приведенном выше примере для демонстрационных целей.

+0

Крис - это здорово! –

+0

Единственная проблема заключается в том, что мы хотим, чтобы форма волны была постоянной, независимо от количества точек данных, поэтому это конкретное решение не работает для нас. Но это точно. –

+0

Да, в этом случае вы должны принять другое решение. Хорошее использование D3. –

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