c++ - 如何处理线段相交检查中的拐角

标签 c++ math game-physics

我正在创建一个使用光线段相交检查的光线转换模拟。在两条线段相交的拐角处,代码确定没有交叉点。
我尝试将这些段延长一小段距离,但这会导致模拟出现其他问题。在这种情况下我能做什么?
交叉口检查代码:

struct Point {
    double x, y;
}

std::unique_ptr<Point> Ray::cast(const Boundary& wall) const {
    const double x1 = wall.a.x;
    const double y1 = wall.a.y;
    const double x2 = wall.b.x;
    const double y2 = wall.b.y;

    const double x3 = pos.x;
    const double y3 = pos.y;
    const double x4 = pos.x + dir.x;
    const double y4 = pos.y + dir.y;

    const double den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
    if (den == 0) {
        return nullptr;
    }

    const double t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / den;
    const double u = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / den;

    if ((t > 0.0f && t < 1.0f) && u > 0.0f) {
        return std::make_unique<Point>(x1 + t * (x2 - x1), y1 + t * (y2 - y1));
    }
    else {
        return nullptr;
    }
}
交叉口故障:
img

最佳答案

一个标准答案是用 来定义问题。点”与转换的光线的关系。是known如何将平面划分为“左侧”、“右侧”和可选“在线”上的非重叠区域。 (最后一个是可选的,因为您可以任意将其包含在其他两个中的一个中。)如果两个端点位于不同的区域,则光线会撞击线段。

关于c++ - 如何处理线段相交检查中的拐角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63080853/

相关文章:

java - 当角度接近 90 时,子弹会变得 super 快

c++ - Typedef struct C 目标到 C++

javascript - 在 Javascript 中使用随机数和运算符生成随机数学方程式

iphone - 防止动态物体穿过花栗鼠中的静态物体?

python - 使用 Sympy 集成时遇到问题

c++ - 当一个相对较大的浮点值与两个相对较小的浮点值相乘时,消除误差的最佳算术顺序是什么

c# - 二维游戏物理向量问题

c++ - 加载共享库时出错 : libsfml-graphics. so.2.2.0

c++ - 如何禁用 Windows C++ MFC 应用程序状态栏中的 CAP NUM SCRL 指示器?

c++ - 从服务器接收 xml 结果