赞
踩
感知面试手撕代码:这个博主总结的很好,尤其是关于叉积的计算
#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; }
#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; }
判断(AOxAB) · (AOxAC) < 0,(BOXBA) · (BOXBC) < 0, (COxCA)·(COxCB) < 0,三者同时小于零。
这两个博客讲的更简单,通过快速排斥和跨立实验 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
先计算叉积,再计算点积。叉积表示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的符号确定正确的角度,是处理二维空间角度的首选函数。
|(AB X AC)| / 2
按顺序每次连接相邻的两点和原点,构成一个三角形,计算该三角形的面积(计算叉积,不用管正负号,叉积对于凸多边形都是正的,对于凹多边形有正有负,刚好抵消),累加所有三角形的面积。
方法一:判断向量AB和向量AC的斜率是否相等。即(y2 - y1)/(x2 - x1) == (y3 - y1)/(x3 - x1)
.为了防止除数为零的问题可以把这个判断转成乘法:(y3 - y1) * (x2 - x1) - (y2 - y1) * (x3 - x1)==0
https://www.cnblogs.com/ccut-ry/p/8734329.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。