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

已知圆弧的起点端点和凸度计算圆心_圆弧凸度-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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值