// Copyright Team Lumi. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "UniStrokeRectangle.h" #include "UniStrokePoint.generated.h" static const float Phi = 0.5f * (-1.0f + FMath::Sqrt(5.0f)); USTRUCT() struct WIZARDINGCENTRAL_API FUniStrokePoint { GENERATED_BODY() FUniStrokePoint(); FUniStrokePoint(const float& X, const float& Y); ~FUniStrokePoint() = default; static void Resample(TArray& Points, const int& Num); static float PathLength(const TArray& Points); static void RotateToZero(TArray& Points); static void RotateBy(TArray& Points, const float& Theta); static void ScaleToSquare(TArray& Points, const float& Size); static void TranslateTo(TArray& Points, const FUniStrokePoint& Point); static void TranslateToOrigin(TArray& Points); static float DistanceAtBestAngle(const TArray& Points, const TArray& T, const float& ThetaFrom, const float& ThetaTo, const float& ThetaThreshold); static float DistanceAtAngle(const TArray& Points, const TArray& T, const float& Theta); static float PathDistance(const TArray& PathA, const TArray& PathB); /** * Converts a TArray of FVector2D to a TArray of FUniStrokePoint * * @param Points The points to convert * @return The converted points as a TArray of FUniStrokePoint */ static TArray From(const TArray& Points); static float Distance(const FUniStrokePoint& PointA, const FUniStrokePoint& PointB); static FUniStrokePoint Centroid(const TArray& Points); static FUniStrokeRectangle BoundingBox(const TArray& Points); static float OptimalCosineDistance(const TArray& VectorA, const TArray& VectorB); static TArray Vectorize(const TArray& Points); private: float X; float Y; };