xxxxxxxxxx
181
let gridMinor = 20;
let gridMajor = 100;
let r = 4;
let points = [];
let halfW, halfH;
function setup()
{
createCanvas(400, 400);
halfW = floor(width / 2);
halfH = floor(height / 2);
}
function draw()
{
background(40);
DrawGrid();
DrawAllPoints();
DrawArithmeticMean();
DrawGeometricMean();
}
function mousePressed()
{
if (mouseButton !== LEFT) return;
if (keyIsDown(SHIFT)) // delete a point
{
}
else
{
AddPoint(mouseX - halfW, halfH - mouseY);
}
}
function AddPoint(x, y)
{
print(`Adding point (${x}, ${y})`);
points.push({ x: x, y: y });
}
function DrawGrid()
{
DrawMinorLines();
DrawMajorLines();
DrawAxes();
}
function DrawMinorLines()
{
stroke(255, 24);
strokeWeight(2);
// Non-negative X
for (let x = floor(width / 2); x <= width; x += gridMinor)
Line(x, 0, x, height);
// Negative X
for (let x = floor(width / 2) - gridMinor; x >= 0; x -= gridMinor)
Line(x, 0, x, height);
// Non-negative Y
for (let y = floor(height / 2); y <= height; y += gridMinor)
Line(0, y, width, y);
// Negative Y
for (let y = floor(height / 2) - gridMinor; y >= 0; y -= gridMinor)
Line(0, y, width, y);
}
function DrawMajorLines()
{
stroke(255, 64);
strokeWeight(2);
// Non-negative X
for (let x = floor(width / 2); x <= width; x += gridMajor)
Line(x, 0, x, height);
// Negative X
for (let x = floor(width / 2) - gridMajor; x >= 0; x -= gridMajor)
Line(x, 0, x, height);
// Non-negative Y
for (let y = floor(height / 2); y <= height; y += gridMajor)
Line(0, y, width, y);
// Negative Y
for (let y = floor(height / 2) - gridMajor; y >= 0; y -= gridMajor)
Line(0, y, width, y);
}
function DrawAxes()
{
stroke(255, 128);
strokeWeight(2);
// X axis
Line(0, halfH, width, halfH);
// Y axis
Line(halfW, 0, halfW, height);
}
function DrawAllPoints()
{
stroke(255);
strokeWeight(2 * r);
for (const p of points)
DrawPoint(p);
}
function DrawPoint(p)
{
Point(p.x + halfW, halfH - p.y);
}
function DrawArithmeticMean()
{
if (points.length <= 1) return;
stroke(100, 140, 250);
strokeWeight(2 * r);
let x = 0;
let y = 0;
for (const p of points)
{
x += p.x;
y += p.y;
}
x /= points.length;
y /= points.length;
DrawPoint({ x: x, y: y });
}
function DrawGeometricMean()
{
if (points.length <= 1) return;
stroke(250, 40, 80);
strokeWeight(2 * r);
let x = 1;
let y = 1;
for (const p of points)
{
x *= p.x;
y *= p.y;
}
x = pow(x, 1 / points.length);
y = pow(y, 1 / points.length);
DrawPoint({ x: x, y: y });
}
function Line(x0, y0, x1, y1)
{
let f = 0.0;
line(x0 + f, y0 + f, x1 + f, y1 + f);
}
function Point(x0, y0)
{
let f = 0.5;
point(x0 + f, y0 + f);
}