当前位置: 首页 > news >正文

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

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


http://www.mrgr.cn/news/3891.html

相关文章:

  • Java 前端与后端交互:解锁 RESTful API 设计的秘密
  • pyqt5用QPainter在扇形上面描绘数据点,并可点击提示
  • 优雅处理枚举前端丢失大Long精度问题
  • Debian12安装jdk8环境
  • Real DOM, Virtual DOM, Shadow DOM,之间有什么区别
  • 【今夕是何年】雅达利发布Atari 7800+游戏主机:配备无线手柄、HDMI接口
  • 通用人工智能不应该完全以人类为标准
  • CSS的:dir()伪类:根据文本方向定制样式的指南
  • idea 项目启动慢,报内存溢出,调整jvm参数
  • 简历相关!!
  • 详解golang内存管理
  • 自定义View实例
  • XSS的一些相关案例及DOM破坏的案例
  • 最新动态鲨鱼导航网引导页html源码
  • C++:模板 II(非类型模板参数,特化,分离编译)
  • Google 开发者大会东南亚制胜攻略分享
  • 5.9.9 串级PID控制器
  • SQL基础——SQL分类
  • 【赵渝强老师】Spark中的RDD
  • 重新认识AbstractQueuedSynchronizer