自动驾驶感知面试-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

相关推荐
劲夫学编程24 分钟前
leetcode:杨辉三角
算法·leetcode·职场和发展
毕竟秋山澪27 分钟前
孤岛的总面积(Dfs C#
算法·深度优先
浮生如梦_2 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
励志成为嵌入式工程师4 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉5 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer5 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
wheeldown5 小时前
【数据结构】选择排序
数据结构·算法·排序算法
观音山保我别报错6 小时前
C语言扫雷小游戏
c语言·开发语言·算法
TangKenny8 小时前
计算网络信号
java·算法·华为
景鹤8 小时前
【算法】递归+深搜:814.二叉树剪枝
算法