惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
C
CERT Recently Published Vulnerability Notes
V
Visual Studio Blog
O
OpenAI News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
博客园 - 聂微东
L
Lohrmann on Cybersecurity
P
Proofpoint News Feed
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
AI
AI
S
Security @ Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
Jina AI
Jina AI
W
WeLiveSecurity
大猫的无限游戏
大猫的无限游戏
腾讯CDC
K
Kaspersky official blog
Hugging Face - Blog
Hugging Face - Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
宝玉的分享
宝玉的分享
AWS News Blog
AWS News Blog
月光博客
月光博客
P
Palo Alto Networks Blog
小众软件
小众软件
V2EX - 技术
V2EX - 技术
罗磊的独立博客
V
Vulnerabilities – Threatpost
J
Java Code Geeks
H
Heimdal Security Blog
S
SegmentFault 最新的问题
博客园 - 【当耐特】
Cyberwarzone
Cyberwarzone
S
Schneier on Security
博客园_首页
T
The Exploit Database - CXSecurity.com
Attack and Defense Labs
Attack and Defense Labs
Forbes - Security
Forbes - Security
N
News | PayPal Newsroom
IT之家
IT之家
Project Zero
Project Zero
Help Net Security
Help Net Security
P
Privacy International News Feed
爱范儿
爱范儿
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threat Research - Cisco Blogs

博客园 - 鹅要长大

【c++编程基础】理解lambda表达式 【c++编程基础】字节对齐pack的理解 【c++编程基础】虚函数virtual的理解与使用 【linux基础知识】理解nohup 【linux基础】如何理解python train_dtld.py 2>&1 | tee my_error_log.txt 【工具使用】docker的使用 【基础算法】银行家舍入法 【ubuntu工具】ubuntu好用工具总结 【ubuntu基础工具使用】ubuntu中screen的安装与使用 【linux操作基础】多目录文件复制且同名不覆盖 【linux基础操作】windows系统生成的txt文件在ubuntu打开乱码 【opencv编程基础】fillpoly和polylines函数的理解 【c++编程基础】std::unique的理解 【计算几何算法】道格拉斯普克(Douglas-Peuker)算法 [c++]c++ 工程代码中的debug时条件编译隐去的代码会影响程序运行的性能和耗时吗 【CV基础】语义分割任务计算类别权重 【opencv基础】resize使用的问题 git stash的用法 gflags的使用 opencv 判断某个坐标点是否在多边形内cv::pointPolygonTest 判断多边形的顶点内外角点以及对approxPolyDP函数的理解 用Python从零实现贝叶斯分类器 【CV数据集】智慧城市之CCPD车牌数据集
【编程基础】计算三个顶点之间的夹角
鹅要长大 · 2024-12-09 · via 博客园 - 鹅要长大

前言

code

float calculateAngle(cv::Point pre, cv::Point cur, cv::Point next){
    cv::Point v1 = {pre.x-cur.x, pre.y-cur.y}; // ABC, BA
    cv::Point v2 = {next.x-cur.x, next.y-cur.y}; // ABC, BC
    double dotProduct = v1.x * v2.x + v1.y * v2.y;
    double normProduct = std::sqrt(v1.x * v1.x + v1.y * v1.y) * std::sqrt(v2.x * v2.x + v2.y * v2.y);
    float angleR = std::acos(dotProduct / normProduct);
    // Convert from radians to degrees
    float angleD =  angleR * 180.0 / CV_PI;
    return  angleD;   
}

float calculateAngleB(cv::Point pre, cv::Point cur, cv::Point next) {  
    cv::Point v1 = {cur.x - pre.x, cur.y - pre.y};  
    cv::Point v2 = {next.x - cur.x, next.y - cur.y}; // 修正了向量v2的计算  
    double dotProduct = v1.x * v2.x + v1.y * v2.y;  
    double normProduct = std::sqrt(v1.x * v1.x + v1.y * v1.y) * std::sqrt(v2.x * v2.x + v2.y * v2.y);  
    double angleRadians = std::acos(dotProduct / normProduct); // 使用double类型来保持精度  
    float angleDegrees = static_cast<float>(angleRadians * 180.0 / CV_PI); // 将弧度转换为度数并转换为float类型  
    return (180.0-angleDegrees);  
}

// 计算两点间距离的函数  
double distance(cv::Point p1, cv::Point p2) {  
    return std::sqrt(std::pow(p2.x - p1.x, 2) + std::pow(p2.y - p1.y, 2));  
} 

float calculateAngleC(cv::Point A, cv::Point B, cv::Point C) {  
    // 计算三角形的三边长度  
    double a = distance(B, C); // BC边  
    double b = distance(A, C); // AC边  
    double c = distance(A, B); // AB边  
    // 应用余弦定理计算cosB  
    double cosB = (a * a + c * c - b * b) / (2 * a * c);  
    // 注意:acos函数返回的是弧度值,需要转换为度数  
    // 转换公式为:度数 = 弧度 * 180 / π  
    float angleB_degrees = std::acos(cosB) * 180.0 / CV_PI; // M_PI是math.h中定义的π值  
    // 返回角B的度数  
    return angleB_degrees;  
}  

View Code

参考

1.

各美其美,美美与共,不和他人作比较,不对他人有期待,不批判他人,不钻牛角尖。
心正意诚,做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。

Simple is clean. Complex is clever.
Logic & Aesthetics
Seeking Ground Truth within the pixels.

版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/