diff --git a/OngekiFumenEditor/Modules/FumenVisualEditor/Graphics/Drawing/Editors/DrawPlayableAreaHelper.cs b/OngekiFumenEditor/Modules/FumenVisualEditor/Graphics/Drawing/Editors/DrawPlayableAreaHelper.cs index 916f4cf3..a02ef28b 100644 --- a/OngekiFumenEditor/Modules/FumenVisualEditor/Graphics/Drawing/Editors/DrawPlayableAreaHelper.cs +++ b/OngekiFumenEditor/Modules/FumenVisualEditor/Graphics/Drawing/Editors/DrawPlayableAreaHelper.cs @@ -1,5 +1,4 @@ -using Advanced.Algorithms.Geometry; -using Caliburn.Micro; +using Caliburn.Micro; using OngekiFumenEditor.Base.OngekiObjects; using OngekiFumenEditor.Base; using OngekiFumenEditor.Kernel.Graphics; @@ -151,34 +150,32 @@ void appendPoint(List list, XGrid xGrid, float y) .Where(x => x.LaneType == type) .ToArray(); - var polylines = lanes.Select(x => x.GenAllPath().Where(x => minTGrid.TotalGrid <= x.pos.Y && x.pos.Y <= maxTGrid.TotalGrid).Select(x => x.pos).SequenceConsecutivelyWrap(2).Select(x => (x.FirstOrDefault(), x.LastOrDefault())).ToArray()) - .ToArray(); + var polylines = lanes + .SelectMany(x => + x.GenAllPath() + .Where(x => minTGrid.TotalGrid <= x.pos.Y && x.pos.Y <= maxTGrid.TotalGrid) + .Select(x => x.pos) + .SequenceConsecutivelyWrap(2) + .Select(x => (x.FirstOrDefault(), x.LastOrDefault()))) + .ToList(); + + polylines.SortBy(x => x.Item1.Y); - for (int r = 0; r < polylines.Length; r++) + for (int r = 0; r < polylines.Count; r++) { - var polylineA = polylines[r]; - for (int t = r + 1; t < polylines.Length; t++) + var a = polylines[r]; + for (int t = r + 1; t < polylines.Count; t++) { - var polylineB = polylines[t]; - - for (int ai = 0; ai < polylineA.Length; ai++) - { - for (int bi = 0; bi < polylineB.Length; bi++) - { - var a = polylineA[ai]; - var b = polylineB[bi]; + var b = polylines[t]; - if (a == b) - continue; + if (a == b) + continue; - var lineA = new Line(new(a.Item1.X, a.Item1.Y), new(a.Item2.X, a.Item2.Y)); - var lineB = new Line(new(b.Item1.X, b.Item1.Y), new(b.Item2.X, b.Item2.Y)); + if (a.Item2.Y < b.Item1.Y) + break; - var point = LineIntersection.Find(lineA, lineB); - if (point is not null) - points.Add((float)point.Y); - } - } + if (GetLinesIntersection(a.Item1.ToSystemNumericsVector2(), a.Item2.ToSystemNumericsVector2(), b.Item1.ToSystemNumericsVector2(), b.Item2.ToSystemNumericsVector2()) is Vector2 p) + points.Add(p.Y); } } @@ -192,10 +189,7 @@ void appendPoint(List list, XGrid xGrid, float y) } var sortedPoints = points.Where(x => minTGrid.TotalGrid < x && x < maxTGrid.TotalGrid).OrderBy(x => x).ToList(); - /* - if (sortedPoints.Count == 0 || sortedPoints.FirstOrDefault() > minTGrid.TotalGrid) - sortedPoints.Insert(0, minTGrid.TotalGrid); - */ + sortedPoints.InsertBySortBy(minTGrid.TotalGrid, x => x); sortedPoints.InsertBySortBy(maxTGrid.TotalGrid, x => x); @@ -203,7 +197,7 @@ void appendPoint(List list, XGrid xGrid, float y) foreach ((var fromY, var toY) in segments) { - var midY = ((fromY + toY) / 2); + var midY = (fromY + toY) / 2; var midTGrid = TGrid.FromTotalGrid((int)midY); //获取这个segement范围内要选取的轨道 @@ -469,28 +463,6 @@ out _ private void AdjustLaneIntersection(IDrawingContext target, List leftPoints, List rightPoints) { - Vector2? GetIntersection(Vector2 p1, Vector2 p2, Vector2 q1, Vector2 q2) - { - var r = new Vector2(p2.X - p1.X, p2.Y - p1.Y); - var s = new Vector2(q2.X - q1.X, q2.Y - q1.Y); - - float cross_r_s = r.X * s.Y - r.Y * s.X; - - if (Math.Abs(cross_r_s) < 1e-6) - return null; - - float t = ((q1.X - p1.X) * s.Y - (q1.Y - p1.Y) * s.X) / cross_r_s; - float u = ((q1.X - p1.X) * r.Y - (q1.Y - p1.Y) * r.X) / cross_r_s; - - if (t >= 0 && t <= 1 && u >= 0 && u <= 1) - return new Vector2(p1.X + t * r.X, p1.Y + t * r.Y); - - return null; - } - - //var leftPointsStr = string.Join(Environment.NewLine, leftPoints.Select(p => $"{p.X,-20}{p.Y}")); - //var rightPointsStr = string.Join(Environment.NewLine, rightPoints.Select(p => $"{p.X,-20}{p.Y}")); - using var d = ObjectPool>.GetWithUsingDisposable(out var tempLeft, out _); using var d2 = ObjectPool>.GetWithUsingDisposable(out var tempRight, out _); using var d3 = ObjectPool>.GetWithUsingDisposable(out var intersectionPoints, out _); @@ -556,7 +528,7 @@ bool tryExchange(int li, int ri) continue; } - if (GetIntersection(leftLine.from, leftLine.to, rightLine.from, rightLine.to) is Vector2 intersectionPoint && !intersectionPoints.Contains(intersectionPoint)) + if (GetLinesIntersection(leftLine.from, leftLine.to, rightLine.from, rightLine.to) is Vector2 intersectionPoint && !intersectionPoints.Contains(intersectionPoint)) { intersectionPoints.Add(intersectionPoint); diff --git a/OngekiFumenEditor/Modules/PreviewSvgGenerator/Kernel/DefaultPreviewSvgGenerator.cs b/OngekiFumenEditor/Modules/PreviewSvgGenerator/Kernel/DefaultPreviewSvgGenerator.cs index 566c496c..97393cc4 100644 --- a/OngekiFumenEditor/Modules/PreviewSvgGenerator/Kernel/DefaultPreviewSvgGenerator.cs +++ b/OngekiFumenEditor/Modules/PreviewSvgGenerator/Kernel/DefaultPreviewSvgGenerator.cs @@ -1,5 +1,4 @@ -using Advanced.Algorithms.Geometry; -using OngekiFumenEditor.Base; +using OngekiFumenEditor.Base; using OngekiFumenEditor.Base.Collections; using OngekiFumenEditor.Base.EditorObjects.Svg; using OngekiFumenEditor.Base.OngekiObjects; @@ -1082,12 +1081,12 @@ void appendPoint(List list, XGrid xGrid, float y) if (a == b) continue; - var lineA = new Line(new(a.Item1.X, a.Item1.Y), new(a.Item2.X, a.Item2.Y)); - var lineB = new Line(new(b.Item1.X, b.Item1.Y), new(b.Item2.X, b.Item2.Y)); - - var point = LineIntersection.Find(lineA, lineB); - if (point is not null) - points.Add((float)point.Y); + if (GetLinesIntersection( + a.Item1.ToSystemNumericsVector2(), + a.Item2.ToSystemNumericsVector2(), + b.Item1.ToSystemNumericsVector2(), + b.Item2.ToSystemNumericsVector2()) is System.Numerics.Vector2 p) + points.Add((float)p.Y); } } } diff --git a/OngekiFumenEditor/OngekiFumenEditor.csproj b/OngekiFumenEditor/OngekiFumenEditor.csproj index d945a228..0752f118 100644 --- a/OngekiFumenEditor/OngekiFumenEditor.csproj +++ b/OngekiFumenEditor/OngekiFumenEditor.csproj @@ -153,7 +153,6 @@ - diff --git a/OngekiFumenEditor/Properties/PublishProfiles/FolderProfile.pubxml b/OngekiFumenEditor/Properties/PublishProfiles/FolderProfile.pubxml index eec997eb..1db13cce 100644 --- a/OngekiFumenEditor/Properties/PublishProfiles/FolderProfile.pubxml +++ b/OngekiFumenEditor/Properties/PublishProfiles/FolderProfile.pubxml @@ -8,10 +8,10 @@ https://go.microsoft.com/fwlink/?LinkID=208121. Any CPU bin\Release\publish\ FileSystem - net5.0-windows - win-x86 + net8.0-windows + win-x64 true - False - True + false + true \ No newline at end of file diff --git a/OngekiFumenEditor/Utils/MathUtils.cs b/OngekiFumenEditor/Utils/MathUtils.cs index 55774c69..b197694c 100644 --- a/OngekiFumenEditor/Utils/MathUtils.cs +++ b/OngekiFumenEditor/Utils/MathUtils.cs @@ -51,6 +51,25 @@ public static int GCD(int a, int b) return b == 0 ? a : GCD(b, a % b); } + public static System.Numerics.Vector2? GetLinesIntersection(System.Numerics.Vector2 p1, System.Numerics.Vector2 p2, System.Numerics.Vector2 q1, System.Numerics.Vector2 q2) + { + var r = new System.Numerics.Vector2(p2.X - p1.X, p2.Y - p1.Y); + var s = new System.Numerics.Vector2(q2.X - q1.X, q2.Y - q1.Y); + + float cross_r_s = r.X * s.Y - r.Y * s.X; + + if (Math.Abs(cross_r_s) < 1e-6) + return null; + + float t = ((q1.X - p1.X) * s.Y - (q1.Y - p1.Y) * s.X) / cross_r_s; + float u = ((q1.X - p1.X) * r.Y - (q1.Y - p1.Y) * r.X) / cross_r_s; + + if (t >= 0 && t <= 1 && u >= 0 && u <= 1) + return new(p1.X + t * r.X, p1.Y + t * r.Y); + + return null; + } + public static double CalculateLength(TGrid from, TGrid to, BpmList bpmList) { var fromBpm = bpmList.GetBpm(from); @@ -219,7 +238,7 @@ public static XGrid CalculateXGridFromBetweenObjects(TGrid fromTGrid, XGrid from { var timeX = CalculateXFromTwoPointFormFormula(tGrid.TotalGrid, fromXGrid.TotalGrid, fromTGrid.TotalGrid, toXGrid.TotalGrid, toTGrid.TotalGrid); - var xGrid = new XGrid((float) (timeX / fromXGrid.ResX)); + var xGrid = new XGrid((float)(timeX / fromXGrid.ResX)); xGrid.NormalizeSelf(); return xGrid; @@ -274,14 +293,14 @@ public static IEnumerable GetIntegersBetweenTwoValues(double from, double t if (sign > 0) { - begin = (int) Math.Ceiling(from); - end = (int) Math.Floor(to); + begin = (int)Math.Ceiling(from); + end = (int)Math.Floor(to); } if (sign < 0) { - begin = (int) Math.Floor(from); - end = (int) Math.Ceiling(to); + begin = (int)Math.Floor(from); + end = (int)Math.Ceiling(to); } for (var i = begin; sign > 0 ? i <= end : i >= end; i += sign) diff --git a/OngekiFumenEditor/Utils/Vector2ExtensionMethod.cs b/OngekiFumenEditor/Utils/Vector2ExtensionMethod.cs new file mode 100644 index 00000000..020f1018 --- /dev/null +++ b/OngekiFumenEditor/Utils/Vector2ExtensionMethod.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OngekiFumenEditor.Utils +{ + public static class Vector2ExtensionMethod + { + public static OpenTK.Mathematics.Vector2 ToOpenTKVector2(this System.Numerics.Vector2 p) + => new (p.X, p.Y); + + public static System.Numerics.Vector2 ToSystemNumericsVector2(this OpenTK.Mathematics.Vector2 p) + => new (p.X, p.Y); + } +}