// from https://codepen.io/tculda/pen/pogwpOw /** * Given some points with color attached, calculate the color for a new point * @param p The new point position {x: number, y: number} * @param points The array of given colored points [{x: nember, y: number, c: hexColor}] * @return hex color string -- The weighted color mix */ static Color multiPointGradientPixel(DoublePt p, LPair gradientPoints) { double[] colorRatios = new [l(gradientPoints)]; fillArray(colorRatios, 1); for i over gradientPoints: for j over gradientPoints: if (i != j) { var p1 = gradientPoints.get(i).a; var p2 = gradientPoints.get(j).a; double[] d = getProjectionDistance(p1, p2, p); colorRatios[i] *= clampZeroToOne(d[1]); printVars ifdef multiPointGradientPixel_debug(+p, +i, +j, +p1, +p2, d := asList(d), colorRatio := colorRatios[i]); } ret blendMultipleColors(countIteratorAsList(l(gradientPoints), i -> pair(gradientPoints.get(i).b, colorRatios[i]))); }