自动驾驶感知面试-coding应用题

感知面试手撕代码:这个博主总结的很好,尤其是关于叉积的计算

双线性插值

双线性插值公式记忆方法和Python实现

NMS算法

python 复制代码
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
struct Box {
    int x1,x2,y1,y2;
    float score;
};

float iou(const Box& b1, const Box& b2) {
    int len = std::min(b1.x2, b2.x2) - std::max(b1.x1, b2.x1);
    int width = std::min(b1.y2, b2.y2) - std::max(b1.y1, b2.y1);
    int inter = std::max(0, len) * std::max(0, width);
    int area = (b1.x2 - b1.x1) * (b1.y2 - b1.y1) + (b2.x2 - b2.x1) * (b2.y2 - b2.y1);

    return float(inter) / area;
}

std::vector<Box> nms(vector<Box>& boxes, float thr) {
    std::sort(boxes.begin(), boxes.end(), [](const Box& b1, const Box&b2) -> bool {
        return b1.score > b2.score;
    });

    vector<Box> res;
    vector<bool> supress(boxes.size(), false);

    for (int i = 0; i < boxes.size(); i++) {
        if (!supress[i]) {
            res.push_back(boxes[i]);

            for (int j = i + 1; j < boxes.size(); j++) {
                if (!supress[j] && iou(boxes[j], res.back()) > thr) {
                    supress[j] = true;
                }
            }            
        }

    }
    return res;
}

计算机几何基础

1点到线段的距离

c++ 复制代码
#include <iostream>
#include <cmath>
using namespace std;

struct Point {
    double x, y;
};

double distance(Point p1, Point p2) {
    return sqrt(pow(p2.x - p1.x, 2) + pow(p2.y - p1.y, 2));
}

double distanceToLineSegment(Point p, Point p1, Point p2) {
    double area = abs((p1.x - p.x) * (p2.y - p.y) - (p1.y - p.y) * (p2.x - p.x));
    double len = distance(p1, p2);
    double dist = area / len;  // 根据二者面积相等计算

    double dotProduct = (p.x - p1.x) * (p2.x - p1.x) + (p.y - p1.y) * (p2.y - p1.y);
    if (dotProduct < 0) {  // 计算PP1,P2P1的夹角是否大于90度。
        return distance(p, p1);
    }

    dotProduct = (p.x - p2.x) * (p1.x - p2.x) + (p.y - p2.y) * (p1.y - p2.y);
    if (dotProduct < 0) {   // 计算PP2,P1P2的夹角是否大于90度。
        return distance(p, p2);
    }

    return dist;
}

2 点是否在三角形内

判断(AOxAB) · (AOxAC) < 0,(BOXBA) · (BOXBC) < 0, (COxCA)·(COxCB) < 0,三者同时小于零。

3 判断两条线段是否相交

这两个博客讲的更简单,通过快速排斥和跨立实验 https://blog.csdn.net/HelloZEX/article/details/80880385 https://blog.csdn.net/myf_666/article/details/124385438

这个博客讲的太复杂了 https://www.cnblogs.com/tuyang1129/p/9390376.html

4 已知三角形三个顶点,计算夹角

先计算叉积,再计算点积。叉积表示sin,点积表示cos,再用atant2计算夹角。

注:c++中std::atan2和std::atan有什么区别?

在C++中,std::atanstd::atan2都是数学函数,用于计算反正切值,但它们有以下主要区别:

  • std::atan(y)只接受一个参数,返回该参数的反正切值,结果在[][−π /2,π /2][−π /2,π/2]范围内。
  • std::atan2(y, x)接受两个参数,返回点(x, y)与正x轴之间角度的反正切值,结果在[−π ,π ]范围内。这允许atan2正确处理所有四个象限的角度,而atan只能处理两个象限。

std::atan2因此提供了更全面的角度计算功能,能够基于x和y的符号确定正确的角度,是处理二维空间角度的首选函数。

5 计算三角形面积

|(AB X AC)| / 2

6 计算任意多边形面积

按顺序每次连接相邻的两点和原点,构成一个三角形,计算该三角形的面积(计算叉积,不用管正负号,叉积对于凸多边形都是正的,对于凹多边形有正有负,刚好抵消),累加所有三角形的面积。

7 已知平面上的三个点A(x1,y1)、B(x2,y2)、C(x3,y3),判断它们是否在一条直线上?

方法一:判断向量AB和向量AC的斜率是否相等 。即(y2 - y1)/(x2 - x1) == (y3 - y1)/(x3 - x1).为了防止除数为零的问题可以把这个判断转成乘法:(y3 - y1) * (x2 - x1) - (y2 - y1) * (x3 - x1)==0

8 判断一堆点是否位于两条直线上

https://www.cnblogs.com/ccut-ry/p/8734329.html

相关推荐
南北是北北6 分钟前
android ViewBinding
面试
朝新_10 分钟前
【优选算法】第一弹——双指针(上)
算法
南北是北北26 分钟前
JetPack中常用的设计模式
面试
艾莉丝努力练剑32 分钟前
【C++STL :stack && queue (一) 】STL:stack与queue全解析|深入使用(附高频算法题详解)
linux·开发语言·数据结构·c++·算法
CoovallyAIHub1 小时前
ICLR 2026 惊现 SAM 3,匿名提交,实现“概念分割”,CV领域再迎颠覆性突破?
深度学习·算法·计算机视觉
IT古董1 小时前
【第五章:计算机视觉-计算机视觉在工业制造领域中的应用】1.工业缺陷分割-(2)BiseNet系列算法详解
算法·计算机视觉·制造
电鱼智能的电小鱼1 小时前
服装制造企业痛点解决方案:EFISH-SBC-RK3588 预测性维护方案
网络·人工智能·嵌入式硬件·算法·制造
我是华为OD~HR~栗栗呀1 小时前
华为OD-23届考研-Java面经
java·c++·后端·python·华为od·华为·面试
yan8626592461 小时前
于 C++ 的虚函数多态 和 模板方法模式 的结合
java·开发语言·算法
小此方1 小时前
C语言自定义变量类型结构体理论:从初见到精通(下)
c语言·数据结构·算法