0x1d0171d9…aa9asent to0x99a9b7c1…b069·#16,157,799·0x727a91d1…e23595
andom_dec()) / 1.5);
}
}
}
} else if (cfg.style == 2) { // curvy threads
let angle, n, nst = 100, dx, dy, step = pt/5;
for (let i = 0; i < 10000; i++) {
let xstart = mrgn + rnd.random_dec() * ww,
ystart = mrgn + rnd.random_dec() * wh,
len = rnd.random_int(50, 100);
for (let j = 0; j < len; j++) {
n = noise(nst * (xstart / w), nst * (ystart / h));
angle = n * 2 * Math.PI;
dx = step * Math.cos(angle); dy = step * Math.sin(angle);
xstart += dx; ystart += dy;
if (rnd.random_dec() < 0.1) {
ellipse(xstart, ystart, pt * (1 + rnd.random_dec()) / 1.5);
}
}
}
} else if (cfg.style == 3) { // curvy graphs
if ("gap" in cfg == false) cfg.gap = ww / rnd.random_choice([50, 100]);
if ("round" in cfg == false) cfg.round = rnd.random_choice([-1, 2, 4, 8]);
let x_start, y_start, angle, n, nst, dx, dy, step = pt/10;
for (let i = mrgn; i <= mrgn + ww; i += cfg.gap) {
x_start = i; nst = 5;
for (y_start = mrgn; y_start <= mrgn + wh; y_start += pt / 2) {
n = noise(nst * (x_start / w), nst * (y_start / h));
angle = n * Math.PI;
if (cfg.round != -1)
angle = int(angle / (1/cfg.round * PI)) * 1/cfg.round * PI;
dx = step * Math.cos(angle); x_start += dx;
if (rnd.random_dec() < 0.35) {
ellipse(x_start, y_start, pt * (1 + 0.5 * rnd.random_dec()));
}
}
}
for (let i = mrgn; i <= mrgn + wh; i += cfg.gap) {
y_start = i; nst = 1;
for (let x_start = mrgn; x_start < mrgn + ww; x_start += pt / 2) {
n = noise(nst * (x_start / w), nst * (y_start / h));
angle = n * 2 * Math.PI;
if (cfg.round != -1)
angle = int(angle / (1/cfg.round * PI)) * 1/cfg.round * PI;
dy = step * Math.sin(angle); y_start += dy;
if (rnd.random_dec() < 0.35) {
ellipse(x_start, y_start, pt * (1 + 0.5 * rnd.random_dec()));
}
}
}
}
return cfg;
}
// from https://stackoverflow.com/questions/8022885/rgb-to-hsv-color-in-javascript
// input: r,g,b in [0,1], out: h in [0,360) and s,v in [0,1]
function rgb2hsv(r, g, b) {
// r = r/255; g = g/255; b = b/255;
let v = Math.max(r, g, b),
c = v - Math.min(r, g, b);
let h = c && ((v == r) ? (g - b) / c : ((v == g) ? 2 + (b - r) / c : 4 + (r - g) / c));
return [60 * (h < 0 ? h + 6 : h), v && c / v, v];
}
// from https://stackoverflow.com/questions/17242144/javascript-convert-hsb-hsv-color-to-rgb-accurately/54024653#54024653
// input: h in [0,360] and s,v in [0,1] - output: r,g,b in [0,1]
function hsv2rgb(h, s, v) {
let f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);
// return [f(5)*255,f(3)*255,f(1)*255];
return [f(5), f(3), f(1)];
}
// from https://stackoverflow.com/questions/45309447/calculating-median-javascript
// function median(values) {
// if (values.length === 0) throw new Error("No inputs");
// values.sort(function(a, b) {
// return a - b;
// });
// var half = Math.floor(values.length / 2);
// if (values.length % 2)
// return values[half];
// return (values[half - 1] + values[half]) / 2.0;
// }
// From https://stackoverflow.com/questions/1669190/find-the-min-max-element-of-an-array-in-javascript
Array.prototype.max = function() {
return Math.max.apply(null, this);
};
Array.prototype.min = function() {
return Math.min.apply(null, this);
};
// From https://stackoverflow.com/questions/2963281/javascript-algorithm-to-find-elements-in-array-that-are-not-in-another-array
function setdiff(a1, a2) {
// console.log(a1)
// console.log(a2)
// console.log(a2.filter(x => !a1.includes(x)) )
return a2.filter(x => !a1.includes(x))
}
function generate_masks_colors_noise(color_style) {
/*************************************************************************
* Generate pattern of masks and colors
*************************************************************************/
let pattern_so_far = new Array(), color_pattern_so_far = new Array();
// generate pattern of masks and colors
for (var i = 0; i < mask_model.length; i++) {
if (color_style == CLR_FROM_MODEL) {
if (i == 0) {
pattern[i] = rnd.random_choice(mask_model[i]);
} else {
pattern[i] = rnd.random_choice(setdiff(pattern_so_far, mask_model[i][pattern[i - 1]]));
}
if (i == 0) {
color_pattern[i] = rnd.random_choice(color_model[pattern[i] - 1]);
} else {
color_pattern[i] = rnd.random_choice(setdiff(color_pattern_so_far, color_model[pattern[i] - 1]));
}
pattern[i] = pattern[i] - 1;
color_pattern[i] = color_pattern[i] - 1;
pattern_so_far.push(pattern[i] + 1);
color_pattern_so_far.push(color_pattern[i] + 1);
} else if (color_style == CLR_UNIFORM) {
if (i == 0) {
pattern[i] = round(rnd.random_dec() * (masks.length - 1));
} else {
pattern[i] = rnd.random_choice(setdiff(pattern, [...Array(masks.length).keys()]));
}
if (i == 0) {
color_pattern[i] = round(rnd.random_dec() * (num_colors_per_palette - 1));
} else {
color_pattern[i] = rnd.random_choice(setdiff(color_pattern, [...Array(num_colors_per_palette).keys()]))
}
}
// The shape prototypes are the prototypes themselves (25), and their flipped versions (25 more). So if the shape id is >25, need to subtract 25 and use its flipped version.
if (pattern[i] > (num_prototypes - 1)) {
mask_gen[i] = reshape(masks[pattern[i] - num_prototypes], Nx, Ny)
mask_gen_use = new Array
for (var cuse = 0; cuse < mask_gen[i].length; cuse++) {
mask_gen_use[cuse] = mask_gen[i][mask_gen[i].length - cuse - 1];
}
mask_gen[i] = mask_gen_use;
} else {
mask_gen[i] = reshape(masks[pattern[i]], Nx, Ny)
}
}
// noise_vector = [-0.1476, 0.0409, -0.0298]; // test vector to match MATLAB implementation
for (var k = 0; k < mask_model.length; k++) {
noise_vector[k] = new Array();
for (var n = 0; n < min_noise.length; n++) {
noise_vector[k][n] = rnd.random_num(min_noise[n] / precision, max_noise[n] / precision);
}
}
/*************************************************************************/
}
function infer_category() {
// predict category using classifier saved in model.js: landscape, flower, urban, bird
let pred_scene = new Array();
for (var i = 0; i < num_categories; i++) {
pred_scene[i] = rnd.random_dec() * 0.00001;
for (var k = 0; k < pattern.length; k++) {
pred_scene[i] = pred_scene[i] + pfgc[pattern[k]][k][i];
}
}
return pred_scene.indexOf(max(pred_scene));
}