TArray<FVector2D> DiscretizeArcLine2D(const FVector2D& InStart, const FVector2D& InEnd, float InBulge, int InNumSegments)
{
TArray<FVector2D> Points;
Points.Add(InStart);
if (FMath::IsNearlyZero(InBulge))
{
Points.Add(InEnd);
return Points;
}
double theta = (4 * FMath::Atan(InBulge));
double chordLength = (InStart- InEnd).Size();
double radius = FMath::Abs(chordLength / (2 * FMath::Sin(theta / 2)));
float b = 0.5 * (1 / InBulge - InBulge);
float centerX = ((InStart.X + InEnd.X) - b * (InEnd.Y - InStart.Y)) * 0.5f;
float centerY = ((InStart.Y + InEnd.Y) + b * (InEnd.X - InStart.X)) * 0.5f;
/*double centerX = (InStart.X + InEnd.X) / 2 - (InStart.Y - InEnd.Y) / (2 * FMath::Tan(theta / 2));
double centerY = (InStart.Y + InEnd.Y) / 2 + (InStart.X - InEnd.X) / (2 * FMath::Tan(theta / 2));*/
double startAngle = FMath::Atan2(InStart.Y - centerY, InStart.X - centerX);
double endAngle = FMath::Atan2(InEnd.Y - centerY, InEnd.X - centerX);
if (InBulge < 0) {
Swap(startAngle, endAngle);
}
double angleIncrement = (endAngle - startAngle) / InNumSegments;
for (int i = 1; i < InNumSegments; ++i) {
double angle = startAngle + i * angleIncrement;
double x = centerX + radius * std::cos(angle);
double y = centerY + radius * std::sin(angle);
Points.Add(FVector2D(x, y));
}
Points.Add(InEnd);
return Points;
}