圆弧的起点端点和凸度计算圆心、离散化为多段线

发布于:2024-08-21 ⋅ 阅读:(128) ⋅ 点赞:(0)

已知圆弧的起点端点和凸度计算圆心_圆弧凸度-CSDN博客

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;
}


网站公告

今日签到

点亮在社区的每一天
去签到