Public
Edited
Aug 28, 2024
1 star
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
data = {
let n = simulations,
data = [];

for (let i = 0; i < n; ++i) {
data.push({ p1: rndPoint(), p2: rndPoint(), p3: rndPoint() });
}

// Find the center of the outer circle
// And compute the co and r
let c, co, r, flag;
data.map((d) => {
c = computeCenter(d);
co = abs(c);
r = abs(sub(c, d.p1));
// Whether the circle is all inside the unit circle
flag = co + r < 1;
Object.assign(d, { c, co, r, flag });
});

return data;
}
Insert cell
computeCenter = (s) => {
let { p1, p2, p3 } = s,
q3 = sub(p1, p2),
q2 = sub(p3, p1),
q1 = sub(p2, p3),
num = sum3(
scale(q3, dot(p3, conj(p3))),
scale(q2, dot(p2, conj(p2))),
scale(q1, dot(p1, conj(p1)))
),
den = sum3(
multiplyComplex(q3, conj(p3)),
multiplyComplex(q2, conj(p2)),
multiplyComplex(q1, conj(p1))
);

return divideComplex(num, den);
}
Insert cell
Insert cell
p = rndPoint()
Insert cell
sum3 = (a, b, c) => {
return { r: a.r + b.r + c.r, i: a.i + b.i + c.i };
}
Insert cell
scale = (a, b) => {
return { r: a.r * b, i: a.i * b };
}
Insert cell
sub = (a, b) => {
return { r: a.r - b.r, i: a.i - b.i };
}
Insert cell
abs = (p) => {
return Math.sqrt(dot(p, conj(p)));
}
Insert cell
dot = (a, b) => {
return a.r * b.r - a.i * b.i;
}
Insert cell
function multiplyComplex(z1, z2) {
const { r: r1, i: i1 } = z1; // 第一个复数的实部和虚部
const { r: r2, i: i2 } = z2; // 第二个复数的实部和虚部

// 计算结果的实部和虚部
const realPart = r1 * r2 - i1 * i2;
const imagPart = r1 * i2 + i1 * r2;

return { r: realPart, i: imagPart };
}
Insert cell
function divideComplex(z1, z2) {
const { r: r1, i: i1 } = z1; // 第一个复数的实部和虚部
const { r: r2, i: i2 } = z2; // 第二个复数的实部和虚部

// 计算分母
const denominator = r2 * r2 + i2 * i2;

// 计算分子的实部和虚部
const realNumerator = r1 * r2 + i1 * i2;
const imagNumerator = i1 * r2 - r1 * i2;

// 计算结果的实部和虚部
const realPart = realNumerator / denominator;
const imagPart = imagNumerator / denominator;

return { r: realPart, i: imagPart };
}
Insert cell
conj = (p) => {
return Object.assign({}, { r: p.r, i: -p.i });
}
Insert cell
rndPoint = () => {
let rnd = d3.randomUniform(-1, 1),
p = { r: rnd(), i: rnd() };

while (abs(p) > 1) {
p = { r: rnd(), i: rnd() };
}

return p;
}
Insert cell
d3 = require("d3")
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more