diff --git a/lib/www/client/source/src/components/group-comparison-summary.vue b/lib/www/client/source/src/components/group-comparison-summary.vue index 80649c0..e3a2834 100644 --- a/lib/www/client/source/src/components/group-comparison-summary.vue +++ b/lib/www/client/source/src/components/group-comparison-summary.vue @@ -10,8 +10,8 @@ Metric - X (m) - Y (m) + I (m) + J (m) @@ -34,21 +34,24 @@ -

Counts

+

Error distribution

-

Other Metrics

+

Counts

+ +

Computation timestamp: {{ new Date(comparison.tstamp).toLocaleString() }}

@@ -139,10 +142,34 @@ export default { Math.abs(this.comparison['μ'][0]), Math.abs(this.comparison['μ'][1]) ); - const maxExtent = maxMu + 3 * maxSigma; + //const maxExtent = maxMu + 3 * maxSigma; + const maxExtent = 20; return 100 / maxExtent; // Adjust scale to fit within ~200 pixels diameter }, + ellipseArea () { + if (!this.comparison) return 0; + const a = Math.sqrt(this.comparison.eigenvalues[0]); + const b = Math.sqrt(this.comparison.eigenvalues[1]); + return Math.PI * a * b; + }, + + semiMajorAxis () { + if (!this.comparison) return 0; + return Math.max( + Math.sqrt(this.comparison.eigenvalues[0]), + Math.sqrt(this.comparison.eigenvalues[1]) + ); + }, + + semiMinorAxis () { + if (!this.comparison) return 0; + return Math.min( + Math.sqrt(this.comparison.eigenvalues[0]), + Math.sqrt(this.comparison.eigenvalues[1]) + ); + }, + meanX () { return this.comparison ? this.comparison['μ'][0] : 0; }, diff --git a/lib/www/client/source/src/components/group-repeatability-summary.vue b/lib/www/client/source/src/components/group-repeatability-summary.vue index 0dbe702..4113ad1 100644 --- a/lib/www/client/source/src/components/group-repeatability-summary.vue +++ b/lib/www/client/source/src/components/group-repeatability-summary.vue @@ -2,7 +2,7 @@ Group Repeatability Summary -

Inline standard deviation (σ_x) for each baseline-monitor pair. Lower values indicate better repeatability. Colors range from green (best) to red (worst).

+

Error ellipse area for each baseline-monitor pair. Lower values indicate better repeatability. Colors range from green (best) to red (worst).

@@ -17,18 +17,19 @@ -
σ_x: {{ getComp(baselineProject.pid, monitorProject.pid).meta['σ'][0].toFixed(2) }} m
-
σ_y: {{ getComp(baselineProject.pid, monitorProject.pid).meta['σ'][1].toFixed(2) }} m
+
σ_i: {{ getComp(baselineProject.pid, monitorProject.pid).meta['σ'][0].toFixed(2) }} m
+
σ_j: {{ getComp(baselineProject.pid, monitorProject.pid).meta['σ'][1].toFixed(2) }} m
Anisotropy: {{ getComp(baselineProject.pid, monitorProject.pid).meta.anisotropy.toFixed(0) }}
+
Ellipse Area: {{ getEllipseArea(baselineProject.pid, monitorProject.pid).toFixed(2) }} m²
Primary Direction: {{ formatPrimaryDirection(getComp(baselineProject.pid, monitorProject.pid)) }}°
@@ -64,30 +65,42 @@ export default { compMap () { return new Map(this.comparisons.map(c => [`${c.baseline_pid}-${c.monitor_pid}`, c])); }, - minSigmaX () { + minEllipseArea () { if (!this.comparisons.length) return 0; - return Math.min(...this.comparisons.map(c => c.meta['σ'][0])); + return Math.min(...this.comparisons.map(c => { + const a = Math.sqrt(c.meta.eigenvalues[0]); + const b = Math.sqrt(c.meta.eigenvalues[1]); + return Math.PI * a * b; + })); }, - maxSigmaX () { + maxEllipseArea () { if (!this.comparisons.length) return 0; - return Math.max(...this.comparisons.map(c => c.meta['σ'][0])); + return Math.max(...this.comparisons.map(c => { + const a = Math.sqrt(c.meta.eigenvalues[0]); + const b = Math.sqrt(c.meta.eigenvalues[1]); + return Math.PI * a * b; + })); } }, methods: { getComp (basePid, monPid) { return this.compMap.get(`${basePid}-${monPid}`); }, - getSigmaX (basePid, monPid) { - return this.getComp(basePid, monPid)?.meta?.['σ']?.[0] ?? null; + getEllipseArea (basePid, monPid) { + const comp = this.getComp(basePid, monPid); + if (!comp) return null; + const a = Math.sqrt(comp.meta.eigenvalues[0]); + const b = Math.sqrt(comp.meta.eigenvalues[1]); + return Math.PI * a * b; }, - formatSigmaX (basePid, monPid) { - const val = this.getSigmaX(basePid, monPid); + formatEllipseArea (basePid, monPid) { + const val = this.getEllipseArea(basePid, monPid); return val !== null ? val.toFixed(1) : ''; }, - getSigmaXColor (basePid, monPid) { - const val = this.getSigmaX(basePid, monPid); + getEllipseAreaColor (basePid, monPid) { + const val = this.getEllipseArea(basePid, monPid); if (val === null) return ''; - const ratio = (val - this.minSigmaX) / (this.maxSigmaX - this.minSigmaX); + const ratio = (val - this.minEllipseArea) / (this.maxEllipseArea - this.minEllipseArea); const hue = (1 - ratio) * 120; return `hsl(${hue}, 70%, 70%)`; },