From ccf0b16136ee6997a847561735dda571bdafdade Mon Sep 17 00:00:00 2001 From: Pascal Serrarens Date: Wed, 7 Jan 2026 12:21:12 +0100 Subject: [PATCH] Fixed Spherical.ToVector3 --- .../NanoBrain/LinearAlgebra/src/Spherical.cs | 59 +++++++++++-------- Assets/NanoBrain/Neuroid.cs | 32 ++++++---- 2 files changed, 54 insertions(+), 37 deletions(-) diff --git a/Assets/NanoBrain/LinearAlgebra/src/Spherical.cs b/Assets/NanoBrain/LinearAlgebra/src/Spherical.cs index 3a76085..0b7c8b4 100644 --- a/Assets/NanoBrain/LinearAlgebra/src/Spherical.cs +++ b/Assets/NanoBrain/LinearAlgebra/src/Spherical.cs @@ -72,18 +72,22 @@ namespace LinearAlgebra { } public readonly Vector3 ToVector3() { - float verticalRad = (AngleFloat.deg90 - this.direction.vertical).inRadians; - float horizontalRad = this.direction.horizontal.inRadians; - float cosVertical = (float)Math.Cos(verticalRad); - float sinVertical = (float)Math.Sin(verticalRad); - float cosHorizontal = (float)Math.Cos(horizontalRad); - float sinHorizontal = (float)Math.Sin(horizontalRad); + // float verticalRad = (AngleFloat.deg90 - this.direction.vertical).inRadians; + // float horizontalRad = this.direction.horizontal.inRadians; + // float cosVertical = (float)Math.Cos(verticalRad); + // float sinVertical = (float)Math.Sin(verticalRad); + // float cosHorizontal = (float)Math.Cos(horizontalRad); + // float sinHorizontal = (float)Math.Sin(horizontalRad); - float x = this.distance * sinVertical * sinHorizontal; - float y = this.distance * cosVertical; - float z = this.distance * sinVertical * cosHorizontal; + // float x = this.distance * sinVertical * sinHorizontal; + // float y = this.distance * cosVertical; + // float z = this.distance * sinVertical * cosHorizontal; - Vector3 v = new(x, y, z); + // Vector3 v = new(x, y, z); + // return v; + + Vector3 v = this.direction.ToVector3(); + v *= this.distance; return v; } #else @@ -99,22 +103,29 @@ namespace LinearAlgebra { } public readonly Vector3Float ToVector3() { - float verticalRad = (AngleFloat.deg90 - this.direction.vertical).inRadians; - float horizontalRad = this.direction.horizontal.inRadians; - float cosVertical = (float)Math.Cos(verticalRad); - float sinVertical = (float)Math.Sin(verticalRad); - float cosHorizontal = (float)Math.Cos(horizontalRad); - float sinHorizontal = (float)Math.Sin(horizontalRad); + // float verticalRad = (AngleFloat.deg90 - this.direction.vertical).inRadians; + // float horizontalRad = this.direction.horizontal.inRadians; + // float cosVertical = (float)Math.Cos(verticalRad); + // float sinVertical = (float)Math.Sin(verticalRad); + // float cosHorizontal = (float)Math.Cos(horizontalRad); + // float sinHorizontal = (float)Math.Sin(horizontalRad); - float x = this.distance * sinVertical * sinHorizontal; - float y = this.distance * cosVertical; - float z = this.distance * sinVertical * cosHorizontal; + // float x = this.distance * sinVertical * sinHorizontal; + // float y = this.distance * cosVertical; + // float z = this.distance * sinVertical * cosHorizontal; - Vector3Float v = new(x, y, z); + // Vector3Float v = new(x, y, z); + Vector3Float v = this.direction.ToVector3(); + v *= this.distance; return v; } #endif + public override readonly string ToString() { + return $"Spherical(h: {this.direction.horizontal}, v: {this.direction.vertical}, distance: {this.distance})"; + } + + public readonly float magnitude => this.distance; public Spherical normalized { @@ -228,7 +239,7 @@ namespace LinearAlgebra { return Spherical.Radians(rAvg, azAvgRad, elAvgRad); } - + /* public static Spherical Average(List vectors) { // float sumSinPhiCosTheta = 0.0f; // float sumSinPhiSinTheta = 0.0f; @@ -302,9 +313,9 @@ namespace LinearAlgebra { return new Spherical(rAvg, new Direction(horizontalAvg, verticalAvg)); } - + */ + -/* public static Spherical Average(IEnumerable vectors) { const float EPS = 1e-6f; if (vectors == null) throw new ArgumentNullException(nameof(vectors)); @@ -371,7 +382,7 @@ namespace LinearAlgebra { return Spherical.Radians(rAvgFinal, azAvg, elAvg); } -*/ + } } \ No newline at end of file diff --git a/Assets/NanoBrain/Neuroid.cs b/Assets/NanoBrain/Neuroid.cs index 301ce03..e0ba72f 100644 --- a/Assets/NanoBrain/Neuroid.cs +++ b/Assets/NanoBrain/Neuroid.cs @@ -87,27 +87,33 @@ public class Neuroid : Nucleus { float activatedValue = curve.Evaluate(synapseNucleus.outputValue.magnitude); float magnitude = weight * activatedValue; //Debug.Log($"{this.name} {synapseNucleus.outputValue.direction} {synapseNucleus.outputValue.direction.horizontal}{synapseNucleus.outputValue.direction.vertical} {direction}"); - - resultVector += direction * magnitude; + Vector3 a = direction * magnitude; + //Debug.Log($"A {direction} {magnitude} {a}"); + resultVector += a; } if (average && this.synapses.Count > 0) resultVector /= this.synapses.Count; Spherical result = Spherical.FromVector3(resultVector); - // List vectors = new(); - // foreach (Synapse synapse in this.synapses) { - // if (synapse.nucleus.isSleeping) - // continue; + List vectors = new(); + foreach (Synapse synapse in this.synapses) { + if (synapse.nucleus.isSleeping) + continue; - // vectors.Add(synapse.nucleus.outputValue); - // } - // Spherical result2 = Spherical.Average(vectors); - // if (average == false) - // result2 *= vectors.Count; + float weight = synapse.weight; + float activatedValue = curve.Evaluate(synapse.nucleus.outputValue.magnitude); + float magnitude = weight * activatedValue; + Spherical vector = new(magnitude, synapse.nucleus.outputValue.direction); + //Debug.Log($"B {synapse.nucleus.outputValue.direction.ToVector3()} {magnitude} {vector.ToVector3()}"); + vectors.Add(vector); //synapse.nucleus.outputValue); + } + Spherical result2 = Spherical.Average(vectors); + if (average == false) + result2 *= vectors.Count; - // if (result2 != result) - // Debug.Log($"update error {result2} != {result}"); + if (result2 != result) + Debug.Log($"update error {result2} != {result}"); UpdateResult(result);