Ich versuche Scroll Karte meiner Website mit Leinwand zu zeichnen. Ich habe Bündel Y Koordinaten und die Anzahl der Besucher, die den Punkt erreicht haben. Ich falte jede Koordinaten mit der Anzahl der Besucher, die den Punkt erreicht haben. Sagen wirGlatter Farbübergang zwischen mehreren Farbanschlägen
10 Benutzer besuchen meine Website.
5 Benutzer Scrollen bis = 0, 300px 3 Benutzer bis zu = 300, 700px 2 Benutzer bis zu = 700, 800px
Jetzt Scrollen Scrollen, habe ich 3 Farbe Anschläge (300, 700, 800) Pixel jeweils . Und die Färbung sollte auf der Anzahl der Benutzer basieren. Ich habe das gemacht, aber der Übergang zwischen den Stopps ist glatt, es sieht solide aus.
var Scroll = function(config, data) {
var container, computed;
this.data = data;
this.config = config;
container = document.querySelector(this.config.container);
this.canvas = document.createElement('canvas');
this.ctx = this.canvas.getContext('2d');
computed = getComputedStyle(container) || {};
this.canvas.className = 'zarget-scrollmap-canvas';
this.width = this.canvas.width = this.config.width || +(computed.width.replace(/px/, ''));
this.height = this.canvas.height = this.config.height || +(computed.height.replace(/px/, ''));
this.canvas.style.cssText = 'position:absolute; top: 0px; left:0px';
container.appendChild(this.canvas);
var map = function(value, istart, istop, ostart, ostop) {
return ostart + (ostop - ostart) * ((value - istart)/(istop - istart));
};
this.mapIntensityToColor = function(intensity, min, max) {
var cint = map(intensity, min, max, 0, 255);
/**
* Based On Rainbow Gradient
*/
if (cint > 204) {
return [255, Math.round(map(intensity, min, max, 255, 0)), 0];
}
if (cint > 153) {
max = (203/255 * 100) * (max/100);
return [Math.round(map(intensity, 0, max, 255, 0)), 255, 0];
}
if (cint > 102) {
max = (153/255 * 100) * (max/100);
return [0, 255, Math.round(map(intensity, 0, max, 255, 0))];
}
if (cint > 0) {
max = (102/255 * 100) * (max/100);
return [0, Math.round(map(intensity, 0, max, 255, 0)), 255];
}
max = (51/255 * 100) * (max/100);
return [0, 0, Math.round(map(intensity, 0, max, 0, 255))];
};
this.draw = function(data) {
var min = 0;
var max = 1300;
var data = [
[0, 50, 1300],
[50, 100, 1100],
[100, 150, 1100],
[150, 200, 1000],
[200, 250, 500],
[250, 300, 400],
[300, 350, 300],
[350, 450, 200],
[450, 500, 400],
[500, 900, 0],
[900, 950, 300],
[950, 3350, 0]
];
var point, startY, endY, alpha, val, color;
this.ctx.globalAlpha = 0.75;
for (var i = 0, l = data.length; i < l; i++) {
point = data[i];
startY = point[0];
endY = point[1];
val = point[2];
color = this.mapIntensityToColor(val, min, max);
this.ctx.fillStyle = "rgb(" + color.join(",") + ")";
this.ctx.fillRect(0, startY, this.width, endY - startY);
}
};};
var a = new Scroll({"container": "#overlay"});
a.draw();
#overlay {
width: 100%;
height: 2000px;
position: absolute;
top: 0px;
left: 0px;
}
<div id="overlay"></div>
Ausgabe von oben Funktion
Erwartete Ausgabe
Ich versuchte mit linearen Gradienten, aber die Farbmischung ist sehr schlecht.
Linear Gradient
https://jsfiddle.net/bdxeca48/2/
... was ist das gewünschte Ergebnis/Ausgabe? –
Problem: 1. Übergang zwischen der Farbe ist nicht gut. 2. Wie man Farben stoppt @ korrekten y-Punkt. Ausgabe: Ich brauche den Ausgang wie das Bild angehängt. – kannanrbk
Was bedeutet "Intensität"? Der Code fehlt Interpolator. –