simulated_data light;
simulated_data sound_level;
simulated_data temperature;
void setup(){
size(800,600);
smooth();
light = new simulated_data(800,0,430,5,200,.001); //(number of data points in data array, minimum data value, max data value, minimum variance, max variance over time, pace of sin wave)
sound_level = new simulated_data(800,0,17,17,5,.01);
temperature = new simulated_data(800,20,25,.2,1, .01);
sound_level.add_noise(100, 50, 200, sound_level.high);
temperature.add_noise(60, 10, 100, 2);
light.add_noise(20,50,200,100);
}
void draw(){
background(0);
light.generate_datapoint();
sound_level.generate_datapoint();
temperature.generate_datapoint();
stroke(255,0,0);
light.draw();
stroke(0,255,0);
sound_level.draw();
stroke(0,0,255);
temperature.draw();
}
class simulated_data{
float[] data;
float low, high, s_delta, l_delta;
float s_period, l_period;
float iteration, s_iteration, l_iteration;
boolean noise;
int noise_length; // how long noise happens
int noise_frequency_max; // how often noise happens
int noise_frequency_min;
float noise_factor; // how much the value changes
int noise_count; //count of how long noise has been applied
float noise_value; //value of how much noise effects value
simulated_data(int num_datapoints, float low_end, float high_end,
float short_change, float long_change,
/*float short_period,*/ float long_period){
data = new float[num_datapoints];
low = low_end;
high = high_end;
s_delta = short_change;
l_delta = long_change;
l_period = long_period;
iteration = 0;
s_iteration = 0;
l_iteration = 0;
noise = false;
generate_datapoint();
}
void generate_datapoint(){
int value_index = data.length - 1;
float value;
value = abs(sin(iteration)) * l_delta + random(-s_delta, s_delta) + low;
if(noise == true){
value = apply_noise(value);
}
value = map(value, low,high, low,high);
shift_data();
iteration+=l_period;
data[value_index] = value;
}
void shift_data(){
for(int i = 1; i <= data.length - 1; i++){
data[i - 1] = data[i];
}
}
void draw(){
for(int i = 1; i < data.length - 1; i++){
line(i * (width/data.length), height - ((data[i]/high) * height),
(i + 1) * (width/data.length), height - ((data[i + 1]/high) * height));
}
}
void add_noise(int n_length, int n_frequency_min, int n_frequency_max, float n_factor){
noise_length = n_length;
noise_frequency_max = n_frequency_max;
noise_frequency_min = n_frequency_min;
noise_factor = n_factor;
noise = true;
}
float apply_noise(float value){
noise_count --;
if(noise_count < 0){
noise_count = (int)random(noise_frequency_min,noise_frequency_max);
noise_value = random(-noise_factor,0);
}
value += noise_value;
return value;
}
}