学习笔记搜索

学习笔记 / C++ 练习

二维直线路径 LOS 制导

C++17 · 制导 · 几何 · 32 组测试

题目

无限直线路径 A→BA\to B:χ=atan2⁡(By−Ay,Bx−Ax),e=−(x−Ax)sin⁡χ+(y−Ay)cos⁡χ,\chi=\operatorname{atan2}(B_y-A_y,B_x-A_x),\quad e=-(x-A_x)\sin\chi+(y-A_y)\cos\chi, ψ=wrap⁡[−π,π](χ−atan2⁡(e,Δ)).\psi=\operatorname{wrap}_{[-\pi,\pi]}\left(\chi-\operatorname{atan2}(e,\Delta)\right). 若 ∥B−A∥2<10−10\lVert B-A\rVert_2<10^{-10},输出 DEGENERATE。不是航点切换、避障或海流补偿。 判题对首个输出角度使用环绕角误差 ∣atan2⁡(sin⁡(ψ−ψ∗),cos⁡(ψ−ψ∗))∣|\operatorname{atan2}(\sin(\psi-\psi^*),\cos(\psi-\psi^*))|,因此 −π-\pi 与 +π+\pi 等价;仍要求输出在 [−π,π][-\pi,\pi] 内(容差允许边界舍入)。第二个输出横向误差按普通浮点规则比较。

回到相关教材 →

输入

Ax,Ay,Bx,By,x,y,ΔA_x,A_y,B_x,B_y,x,y,\Delta;Δ>0\Delta>0;角度单位 rad。

输出

ψ,e\psi,e;退化路径输出 DEGENERATE。

示例

输入

-3.75083734625231 1.3242494039467196 -3.75083734625231 1.3242494039467196 3.6306381965027157 0.1420738550790599 0.10053092483031315

期望输出

DEGENERATE

在线 C++17 练习

在浏览器编译运行,代码不上传;首次下载约 28 MB。

尚未运行

    运行环境

    Clang 22 / C++17 / WASI,支持本题所需标准库;不支持线程、C++ 异常或任意宿主系统访问。每例 2 秒、256 MiB 线性内存、64 KiB 输出;编译器另占浏览器内存,不适合低内存设备。初次加载最多等待 120 秒,可随时停止。

    草稿保存在本浏览器。测试公开,属于本地自测而非防作弊竞赛判题;参考解答不参与运行。所有运行资产均由本站提供。

    编译器来源与开源许可
    参考实现(完成后再展开)

    对照自己的推导,检查状态更新顺序、边界条件与单位,而不只比较最终输出。

    #include <iostream>
    #include <iomanip>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <array>
    #include <queue>
    #include <tuple>
    #include <limits>
    using namespace std;
    
    // Reference implementation: optional; solve the starter before opening.
    int main() {
        cout << setprecision(17);
        double ax,ay,bx,by,x,y,D;
        cin>>ax>>ay>>bx>>by>>x>>y>>D;
        if(hypot(bx-ax,by-ay)<1e-10) {
            cout<<"DEGENERATE";
            return 0;
        }
        double chi=atan2(by-ay,bx-ax),e=-(x-ax)*sin(chi)+(y-ay)*cos(chi),p=chi-atan2(e,D);
        cout<<atan2(sin(p),cos(p))<<" "<<e;
    }
    离线命令行练习与报告导入(可选)

    也可使用包内 practice/README.md 的 C++17 命令行流程。

    查看本地判题结果

    选取判题器生成的 JSON 报告,逐项查看结果。文件只在浏览器内读取。

    ← 返回练习目录