当前位置:   article > 正文

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

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

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

双线性插值

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

NMS算法

#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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

计算机几何基础

1点到线段的距离

#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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/213678
推荐阅读
  

闽ICP备14008679号