From 1db25e62e7a5f63d926d7d265a597b4b8dbeac9d Mon Sep 17 00:00:00 2001 From: PopSlime Date: Thu, 20 Mar 2025 21:47:52 +0800 Subject: [PATCH] fix: Fix wave circle shape when hypocenter is near antimeridian --- .../Map/Element/WaveCircleElement.cs | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Assets/Cryville.EEW.Unity/Map/Element/WaveCircleElement.cs b/Assets/Cryville.EEW.Unity/Map/Element/WaveCircleElement.cs index 07b0157..407b7b3 100644 --- a/Assets/Cryville.EEW.Unity/Map/Element/WaveCircleElement.cs +++ b/Assets/Cryville.EEW.Unity/Map/Element/WaveCircleElement.cs @@ -98,24 +98,25 @@ namespace Cryville.EEW.Unity.Map.Element { for (int d = 0; d < 360; d++) { Quaternion q = Quaternion.AngleAxis(d, axis); Vector3 p = q * rp; - Vector2 p2 = ToTilePos(p).ToVector2(); - if (lp2 != null) { - float dx = p2.x - lp2.Value.x; - if (MathF.Abs(dx) >= 0.5) { - _vertexBuffer[d] = p2.x < 0.5 ? p2 + new Vector2(1, 0) : p2 - new Vector2(1, 0); - renderer.AddSegment(_vertexBuffer, segmentIndex, d - segmentIndex + 1); - segmentIndex = d; - } - } - _vertexBuffer[d] = p2; - lp2 = p2; + AddVertex(renderer, ref lp2, ref segmentIndex, d, p); } - Vector2 rp2 = ToTilePos(rp).ToVector2(); - _vertexBuffer[360] = rp2; + AddVertex(renderer, ref lp2, ref segmentIndex, 360, rp); renderer.AddSegment(_vertexBuffer, segmentIndex, 361 - segmentIndex); } renderer.SetMaterial(isHistory ? m_historyMaterial : m_ongoingMaterial); } + + void AddVertex(MultiLineRenderer renderer, ref Vector2? lp2, ref int segmentIndex, int d, Vector3 p) { + Vector2 p2 = ToTilePos(p).ToVector2(); + if (lp2 != null && MathF.Abs(p2.x - lp2.Value.x) >= 0.5) { + _vertexBuffer[d] = p2.x < 0.5 ? p2 + new Vector2(1, 0) : p2 - new Vector2(1, 0); + renderer.AddSegment(_vertexBuffer, segmentIndex, d - segmentIndex + 1); + segmentIndex = d; + } + _vertexBuffer[d] = p2; + lp2 = p2; + } + static PointF ToTilePos(Vector3 p) => MapTileUtils.WorldToTilePos(new(MathF.Atan2(p.z, p.x) / MathF.PI * 180f, MathF.Asin(p.y) / MathF.PI * 180f)); } }