C++ 获取一个点相对于正x轴的角度

2024-05-05 20:58

本文主要是介绍C++ 获取一个点相对于正x轴的角度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#define EPS  0.0000001
#define  PI            3.14159265358979323846


struct pt
{
    double x;
    double y;
};

//获取所在象限
int GetQuadrantForPoint(pt  p)
{
    if(p.x > 0 && p.y > 0) //第一象限
        return 1;
    else if(abs(p.x - 0)<EPS && p.y > 0) //在y轴正方向
        return  12;
    else if(p.x<0 && p.y>0) //2
    {
        return 2;
    }
    else if(p.x<0&& abs(p.y-0)<EPS) //-x
    {
        return 23;
    }
    else if(p.x<0&& p.y<0) //3
    {
        return 3;
    }
    else if(abs(p.x-0)<EPS && p.y<0) //-y
    {
        return 34;
    }
    else if(p.x>0&& p.y<0) //4
    {
        return 4;
    }
    else if(p.x>0&& abs(p.y-0)<EPS) //+x
    {
        return 41;
    }
    else if(abs(p.x-0)<EPS && abs(p.y-0)<EPS) //o
    {
        return 0;
    }
    else
    {
        return -1;
    }
}

//获取角度
BOOL GetAngleForPoint(pt p,double *angle)
{
    double x=abs(p.x);
    double y=abs(p.y);
    if(GetQuadrantForPoint(p) == 12)
    {
        *angle = 90.00;
    }
    else if(GetQuadrantForPoint(p) == 23)
    {
        *angle = 180.00;
    }
    else if(GetQuadrantForPoint(p) == 34)
    {
        *angle = 270.00;
    }
    else if(GetQuadrantForPoint(p) == 41)
    {
        *angle = 0.00;
    }
    else if(GetQuadrantForPoint(p) == 1)
    {
        *angle = atan(y/x)/PI*180;
    }
    else if(GetQuadrantForPoint(p) == 2)
    {
        *angle = atan(x/y)/PI*180+90;
    }
    else if(GetQuadrantForPoint(p) == 3)
    {
        *angle = atan(y/x)/PI*180+180;
    }
    else if(GetQuadrantForPoint(p) == 4)
    {
        *angle = atan(x/y)/PI*180+270;
    }
    else
    {
        return 0;
    }
    return 1;
}

这篇关于C++ 获取一个点相对于正x轴的角度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962660

相关文章

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决