Skip to content

Commit

Permalink
try optimze
Browse files Browse the repository at this point in the history
  • Loading branch information
MikiraSora committed Sep 24, 2024
1 parent d47caeb commit cdf37d3
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 70 deletions.
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -151,34 +150,32 @@ void appendPoint(List<Vector2> 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);
}
}

Expand All @@ -192,18 +189,15 @@ void appendPoint(List<Vector2> 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);

var segments = sortedPoints.SequenceConsecutivelyWrap(2).Select(x => (x.FirstOrDefault(), x.LastOrDefault())).ToArray();

foreach ((var fromY, var toY) in segments)
{
var midY = ((fromY + toY) / 2);
var midY = (fromY + toY) / 2;
var midTGrid = TGrid.FromTotalGrid((int)midY);

//获取这个segement范围内要选取的轨道
Expand Down Expand Up @@ -469,28 +463,6 @@ out _

private void AdjustLaneIntersection(IDrawingContext target, List<Vector2> leftPoints, List<Vector2> 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<List<Vector2>>.GetWithUsingDisposable(out var tempLeft, out _);
using var d2 = ObjectPool<List<Vector2>>.GetWithUsingDisposable(out var tempRight, out _);
using var d3 = ObjectPool<HashSet<Vector2>>.GetWithUsingDisposable(out var intersectionPoints, out _);
Expand Down Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -1082,12 +1081,12 @@ void appendPoint(List<Vector2> 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);
}
}
}
Expand Down
1 change: 0 additions & 1 deletion OngekiFumenEditor/OngekiFumenEditor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,6 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Advanced.Algorithms" Version="1.0.0" />
<PackageReference Include="AssetsTools.NET" Version="2.0.12" />
<PackageReference Include="AssocSupport" Version="1.1.0" />
<PackageReference Include="AvalonEdit" Version="6.3.0.90" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Platform>Any CPU</Platform>
<PublishDir>bin\Release\publish\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net5.0-windows</TargetFramework>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
<TargetFramework>net8.0-windows</TargetFramework>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<SelfContained>true</SelfContained>
<PublishSingleFile>False</PublishSingleFile>
<PublishReadyToRun>True</PublishReadyToRun>
<PublishSingleFile>false</PublishSingleFile>
<PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup>
</Project>
29 changes: 24 additions & 5 deletions OngekiFumenEditor/Utils/MathUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -274,14 +293,14 @@ public static IEnumerable<int> 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)
Expand Down
17 changes: 17 additions & 0 deletions OngekiFumenEditor/Utils/Vector2ExtensionMethod.cs
Original file line number Diff line number Diff line change
@@ -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);
}
}

0 comments on commit cdf37d3

Please sign in to comment.