感知面试手撕代码:这个博主总结的很好,尤其是关于叉积的计算
双线性插值
双线性插值公式记忆方法和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点到线段的距离
#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::atan
和std::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