xxxxxxxxxx
140
const r = 100; //pupil radius [pixels]
//let theta; //field angle [rad]
const layeralt = [100, 180, 260, 340];
const freq = [0.02, 0.02, 0.02, 0.02];
const strength = [80, 80, 80, 100];
let lgsalt = 600;
let alpha1;
let alpha2;
function setup() {
theta = 20 * PI / 180;
alpha1 = createSlider(-30, 30, -10);
alpha2 = createSlider(2.5, 4, 2.7, 0);
createCanvas(600, 600);
}
function draw() {
let mean1 = [];
let mean2 = [];
background(255);
push();
textSize(16);
translate(width / 2, height * 7 / 8);
fill(0);
noStroke();
text("Telescope Pupil",-width/2+70,0);
noFill();
strokeWeight(2);
stroke(0);
line(-r, 0, r, 0);
stroke(100);
//line(-r, 0, -r - height * tan(theta), -height);
//line(r, 0, r + height * tan(theta), -height);
for (let ni = 0; ni < layeralt.length; ni++) {
let alt = -layeralt[ni];
strokeWeight(0.5);
line(-width / 2, -layeralt[ni], width / 2, -layeralt[ni]);
strokeWeight(1);
for (let mi = 0; mi < width; mi++) {
line(-width / 2 + mi,
alt + strength[ni] * (noise(mi * freq[ni], 10 * ni) - 0.5),
-width / 2 + mi + 1,
alt + strength[ni] * (noise((mi + 1) * freq[ni], 10 * ni) - 0.5));
}
}
// dir 1
let alpha = alpha1.value() * PI / 180;
stroke(0, 0, 200);
fill(0, 0, 200,10);
beginShape();
vertex(-r, 0);
vertex(-r + height * tan(alpha), -height);
vertex(r + height * tan(alpha), -height);
vertex(r, 0);
endShape(CLOSE);
line(-r, 0, -r + height * tan(alpha), -height);
line(r, 0, r + height * tan(alpha), -height);
strokeWeight(2);
for (let mi = 0; mi < width; mi++) {
mean1.push(0);
mean2.push(0);
if (-width / 2 + mi < -r || -width / 2 + mi + 1 > r)
continue;
let sum1 = 0;
let sum2 = 0;
for (let ni = 0; ni < layeralt.length; ni++) {
sum1 += strength[ni] * (noise((mi + layeralt[ni] * tan(alpha)) * freq[ni], 10 * ni) - 0.5);
sum2 += strength[ni] * (noise((mi + 1 + layeralt[ni] * tan(alpha)) * freq[ni], 10 * ni) - 0.5);
}
mean1[mi] = sum1;
mean2[mi] = sum2;
line(-width / 2 + mi, sum1, -width / 2 + mi + 1, sum2);
}
// LGS
lgsalt = 10.0 ** alpha2.value();
noStroke();
fill(0);
text("Sodium Layer",-width/2+10,-lgsalt+20)
stroke(255, 226, 0);
fill(255, 226, 0,10);
beginShape();
vertex(-r, 0);
vertex(lgsalt * tan(alpha), -lgsalt);
vertex(lgsalt * tan(alpha), -lgsalt);
vertex(r, 0);
endShape(CLOSE);
line(-r, 0, lgsalt * tan(alpha), -lgsalt);
line(r, 0, lgsalt * tan(alpha), -lgsalt);
fill(255, 226, 0);
line(-width / 2, -lgsalt, width / 2, -lgsalt);
ellipse(lgsalt * tan(alpha), -lgsalt, 10, 10);
strokeWeight(2);
for (let mi = 0; mi < width; mi++) {
mean1.push(0);
mean2.push(0);
if (-width / 2 + mi < -r || -width / 2 + mi + 1 > r)
continue;
let sum1 = 0;
let sum2 = 0;
for (let ni = 0; ni < layeralt.length; ni++) {
let grad = (1 - layeralt[ni] / lgsalt);
let m0 = (layeralt[ni] * tan(alpha) + width / 2 * layeralt[ni] / lgsalt)
sum1 += strength[ni] * (noise((mi * grad + m0) * freq[ni], 10 * ni) - 0.5);
sum2 += strength[ni] * (noise(((mi + 1) * grad + m0) * freq[ni], 10 * ni) - 0.5);
}
mean1[mi] = sum1;
mean2[mi] = sum2;
line(-width / 2 + mi, sum1, -width / 2 + mi + 1, sum2);
}
/*
// dir 2
alpha = alpha2.value() * PI / 180;
stroke(0, 0, 200);
line(-r, 0, -r + height * tan(alpha), -height);
line(r, 0, r + height * tan(alpha), -height);
for (let mi = 0; mi < width; mi++) {
if (-width / 2 + mi < -r || -width / 2 + mi + 1 > r)
continue;
stroke(0, 0, 200);
let sum1 = 0;
let sum2 = 0;
for (let ni = 0; ni < layeralt.length; ni++) {
sum1 += strength[ni] * (noise((mi + layeralt[ni] * tan(alpha)) * freq[ni], 10 * ni) - 0.5);
sum2 += strength[ni] * (noise((mi + 1 + layeralt[ni] * tan(alpha)) * freq[ni], 10 * ni) - 0.5);
}
line(-width / 2 + mi, sum1, -width / 2 + mi + 1, sum2);
mean1[mi] += sum1;
mean2[mi] += sum2;
mean1[mi] /= 2;
mean2[mi] /= 2;
stroke(0, 200, 0);
line(-width / 2 + mi, mean1[mi], -width / 2 + mi + 1, mean2[mi]);
}
*/
pop();
}