C++ 3 个有序点的方向(Orientation of 3 ordered points)

news2024/9/26 21:57:17

给定三个点 p1、p2 和 p3,任务是确定这三个点的方向。

平面中有序三重点的方向可以是

逆时针

顺时针

共线

下图显示了 (a,b,c) 的不同可能方向

如果 (p1, p2, p3) 的方向共线,则 (p3, p2, p1) 的方向也共线。 

如果 (p1, p2, p3) 的方向是顺时针,则 (p3, p2, p1) 的方向是逆时针,反之亦然。

例子: 
 
输入:   p1 = {0, 0}, p2 = {4, 4}, p3 = {1, 2}

输出:  逆时针

输入:   p1 = {0, 0}, p2 = {4, 4}, p3 = {1, 1}

输出:  共线

如何计算方向? 

这个想法就是利用斜率。  

线段 (p1, p2) 的斜率:? = (y2 - y1)/(x2 - x1)

线段 (p2, p3) 的斜率:? = (y3 - y2)/(x3 - x2)

如果 ? > ?,则方向为顺时针(右转)

使用上述 ? 和 ? 的值,我们可以得出结论,

方向取决于以下表达式的符号:

(y2 - y1)*(x3 - x2) - (y3 - y2)*(x2 - x1)

当 ? < ? 时,上述表达式为负数,即逆时针

下面是上述想法的实现:

 // A C++ program to find orientation of three points
#include <iostream>
using namespace std;
 
struct Point {
    int x, y;
};
 
// To find orientation of ordered triplet (p1, p2, p3).
// The function returns following values
// 0 --> p, q and r are collinear
// 1 --> Clockwise
// 2 --> Counterclockwise
int orientation(Point p1, Point p2, Point p3)
{
    // See 10th slides from following link for derivation
    // of the formula
    int val = (p2.y - p1.y) * (p3.x - p2.x)
              - (p2.x - p1.x) * (p3.y - p2.y);
 
    if (val == 0)
        return 0; // collinear
 
    return (val > 0) ? 1 : 2; // clock or counterclock wise
}
 
// Driver program to test above functions
int main()
{
    Point p1 = { 0, 0 }, p2 = { 4, 4 }, p3 = { 1, 2 };
    int o = orientation(p1, p2, p3);
    if (o == 0)
        cout << "Linear";
    else if (o == 1)
        cout << "Clockwise";
    else
        cout << "CounterClockwise";
    cout << endl;
 
    p1 = { 0, 0 }, p2 = { 4, 4 }, p3 = { 1, 1 };
    o = orientation(p1, p2, p3);
    if (o == 0)
        cout << "Linear";
    else if (o == 1)
        cout << "Clockwise";
    else
        cout << "CounterClockwise";
    cout << endl;
 
    p1 = { 1, 2 }, p2 = { 4, 4 }, p3 = { 0, 0 };
    o = orientation(p1, p2, p3);
    if (o == 0)
        cout << "Linear";
    else if (o == 1)
        cout << "Clockwise";
    else
        cout << "CounterClockwise";
    return 0;
}

输出:

逆时针

线性

顺时针

时间复杂度: O(1)

辅助空间: O(1) 

以下文章使用了方向的概念: 

找到给定点集的简单闭合路径

c++ https://blog.csdn.net/hefeng_aspnet/article/details/141715783
java https://blog.csdn.net/hefeng_aspnet/article/details/141715877
python https://blog.csdn.net/hefeng_aspnet/article/details/141715899
C# https://blog.csdn.net/hefeng_aspnet/article/details/141715914
Javascript https://blog.csdn.net/hefeng_aspnet/article/details/141715931 

如何检查两个给定的线段是否相交?

c++ https://blog.csdn.net/hefeng_aspnet/article/details/141713655
java https://blog.csdn.net/hefeng_aspnet/article/details/141713762
python https://blog.csdn.net/hefeng_aspnet/article/details/141714389
C# https://blog.csdn.net/hefeng_aspnet/article/details/141714420
Javascript https://blog.csdn.net/hefeng_aspnet/article/details/141714442 

凸包 | 集合 1(贾维斯算法或包装)

c++ https://blog.csdn.net/hefeng_aspnet/article/details/141716082
java https://blog.csdn.net/hefeng_aspnet/article/details/141716363
python https://blog.csdn.net/hefeng_aspnet/article/details/141716444
C# https://blog.csdn.net/hefeng_aspnet/article/details/141716403
Javascript https://blog.csdn.net/hefeng_aspnet/article/details/141716421 

凸包 | 集合 2(格雷厄姆扫描)

c++ https://blog.csdn.net/hefeng_aspnet/article/details/141716566
java https://blog.csdn.net/hefeng_aspnet/article/details/141717095
python https://blog.csdn.net/hefeng_aspnet/article/details/141717139
C# https://blog.csdn.net/hefeng_aspnet/article/details/141717214
Javascript https://blog.csdn.net/hefeng_aspnet/article/details/141717264 

方法#2:使用斜率

该方法通过计算由点形成的线段的斜率来检查平面中 3 个有序点的方向。如果斜率相等,则这些点共线。如果前两个点形成的线段的斜率小于后两个点形成的线段的斜率,则方向为逆时针,否则为顺时针。

算法
1. 计算 (p1,p2) 和 (p2,p3) 形成的线的斜率

2. 如果斜率相等,则点共线

3. 如果 (p1,p2) 的斜率 < (p2,p3) 的斜率,则点处于逆时针方向

4. 如果 (p1,p2) 的斜率 > (p2,p3) 的斜率,则点处于顺时针方向

#include <iostream>
using namespace std;
 
string orientation(int p1[], int p2[], int p3[])
{
    // Calculate slopes
    int slope1 = (p2[1] - p1[1]) * (p3[0] - p2[0]);
    int slope2 = (p3[1] - p2[1]) * (p2[0] - p1[0]);
    // Check orientation
    if (slope1 == slope2) {
        return "Collinear";
    }
    else if (slope1 < slope2) {
        return "CounterClockWise";
    }
    else {
        return "ClockWise";
    }
}
 
int main()
{
    // Example usage
    int p1[] = { 0, 0 };
    int p2[] = { 4, 4 };
    int p3[] = { 1, 1 };
    cout << orientation(p1, p2, p3) << endl;
 
    int p4[] = { 0, 0 };
    int p5[] = { 4, 4 };
    int p6[] = { 1, 2 };
    cout << orientation(p4, p5, p6) << endl;
 
    return 0;
}
// This code is contributed by user_dtewbxkn77n

输出:

共线

逆时针

时间复杂度:O(1)

空间复杂度:O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2168096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea不想提交前端代码,只提交.java和.xml文件配置

1.按图创建.gitignore文件 &#xff08;忽略文件&#xff09; 2.该文件的内容 直接cp /.gitignore *.DS_Store Thumbs.db *.sw? .#* *# *~ *.sublime-* # Build Artifacts .gradle/ build/ target/ bin/ dependency-reduced-pom.xml # Eclipse Project Files .classpath .pro…

Python办公自动化案例:将Excel数据批量保存到Word表格中

案例:将excel数据批量保存到Word表格中 要将Excel数据批量保存到Word表格中,可以使用Python的openpyxl库来读取Excel文件,以及python-docx库来创建和编辑Word文档。以下是一段示例代码,以及代码解释和一些注意事项。 准备好的Excel数据: 1.安装所需库 首先,确保你已经…

Electron-vue asar 局部打包优化处理方案——绕开每次npm run build 超级慢的打包问题

背景 因为组员对于 Electron 打包过程存在比较迷糊的状态&#xff0c;且自己也没主动探索 Electron-vue 打包细节&#xff0c;导致每次打包过程都消耗 5-6 分钟的时间&#xff0c;在需要测试生产打包时&#xff0c;极其浪费时间&#xff0c;为此针对 Electron-vue 打包的几个环…

如何使用ssm实现学生考勤管理系统的设计与实现+vue

TOC ssm703学生考勤管理系统的设计与实现vue 绪论 课题背景 身处网络时代&#xff0c;随着网络系统体系发展的不断成熟和完善&#xff0c;人们的生活也随之发生了很大的变化。目前&#xff0c;人们在追求较高物质生活的同时&#xff0c;也在想着如何使自身的精神内涵得到提…

即插即用篇 | DenseNet卷土重来! YOLOv8 引入全新密集连接卷积网络 | ECCV 2024

本改进已同步到YOLO-Magic框架! 本文重新审视了密集连接卷积网络(DenseNets),并揭示了其在主流的ResNet风格架构中被低估的有效性。我们认为,由于未触及的训练方法和传统设计元素没有完全展现其能力,DenseNets的潜力被忽视了。我们的初步研究表明,通过连接实现的密集连接…

未能参加工博会的open61499

上海工博会正在如火如荼的进行中&#xff0c;各大工业板块的厂商都展示出了自家新的产品和解决方案&#xff0c;遗憾的是open61499没能到上海工博会亮相&#xff0c;只能通过写文章发自媒体的方式给大家介绍open61499。 open61499是基于IEC61499标准打造的工业编程平台&#xf…

Keil5安装arm和C51共存环境

一、安装前准备 ①Keil5 mdk安装包 ②Keil5 C51安装包 ③注册机 如下 二、安装步骤 ①建立两个文件夹用于存放Keil5 C51安装程序和keil5 mdk安装程序 如下图 ②点击c51v95a.exe进行安装&#xff0c;一路next&#xff0c;安装在Keil5_C51目录下 ③点击MDK539.ext进行安装…

Redis篇(环境搭建)

目录 一、安装包 1. Windows版下载地址 2. Linux版下载地址 二、安装Redis 1. 在Linux中安装Redis 2. 在Windows中安装Redis 3. 细节问题 三、Redis服务启动 1. 默认启动 2. 指定配置启动 3. 开机自启 四、Redis服务停止 1. Linux系统中启动和停止Redis 2. Window…

MongoDB 双活集群在运营商的实践

在现代电信行业中&#xff0c;订单中心作为核心业务系统之一&#xff0c;承担着处理客户订单、管理订单状态、与各个业务系统进行交互等重要职责。其订单中心的高效运作直接关系到客户体验和业务连续性。为了满足不断增长的业务需求和日益复杂的运营环境&#xff0c;运营商需要…

微调大模型(Finetuning Large Language Models)—Where finetuning fits in(二)

1.什么时候适合用finetune 微调&#xff08;finetuning&#xff09;对人的作用包括行为改变和知识获取。行为改变方面&#xff0c;包括学习更一致地回应、学会专注&#xff08;如适度&#xff09;以及发挥能力&#xff08;如更擅长对话&#xff09;&#xff1b;知识获取方面&am…

三、人物骨骼介绍

一、迁移骨骼包 注意&#xff1a;要迁移所有骨骼压缩包&#xff08;单独可能会有问题&#xff09; 二、认识骨骼 点击骨骼 进入骨骼页面

尚庭公寓-接口定义

5. 接口定义 5.1 后台管理系统接口定义 5.1.1 公寓信息管理 5.1.1.1 属性管理 属性管理页面包含公寓和房间各种可选的属性信息&#xff0c;其中包括房间的可选支付方式、房间的可选租期、房间的配套、公寓的配套等等。其所需接口如下 房间支付方式管理 页面如下 所需接口如…

【Linux】Linux 的 权限

一、 Linux 权限的概念 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以在 linux 系统下做任何事情&#xff0c;不受限制普通用户&#xff1a;在 linux 下做有限的事情。超级用户的命令提示符是“#”&#xff0c;普…

每日一题|2535. 数组元素和与数字和的绝对差|数位运算

简单题。先加后减&#xff0c;可以剪枝。 先加后减就是对于每一个数字之间完成该数字的值-数位和&#xff0c;然后再去下一个数字。 特别的&#xff0c;对于小于10的数字&#xff0c;减自身就是0&#xff0c;没必要计算&#xff0c;可以跳过。 class Solution(object):def d…

C++之美:代码整洁、安全又跑得快的30个要诀(好书推荐)

在编程领域&#xff0c;C 以其高效性和灵活性著称&#xff0c;但同时也因其复杂性和易出错性而闻名。如何写出既整洁、又安全且高效的 C 代码&#xff0c;是每个 C 开发者都需要思考的问题。《C之美&#xff1a;代码整洁、安全又跑得快的30个要诀》这本书为我们提供了宝贵的指导…

git clone代码报错Permission denied (publickey)

git clone gerrit SSH的Clone with commit-msg hook代码连接&#xff0c;报错Permission denied (publickey). 一般在C:\Users\用户名.ssh文件夹下有一个id_rsa.pub文件 把文件里的内容复制 到gerrit网站上User Settings的SSH keys里 在New SSH key里粘贴刚刚复制的内容&…

【递归】6.LPC 44 开幕式火焰

1 题目描述 题目链接&#xff1a;开幕式火焰 2 解答思路 递归分为三步&#xff0c;接下来就按照这三步来思考问题 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系…

那些年我和 ChatGPT 合谋摸鱼的日子

文章目录 那些年我和 ChatGPT 合谋摸鱼的日子1 序个言2 说正事3 这次是真正的正事4 总个结 那些年我和 ChatGPT 合谋摸鱼的日子 1 序个言 看到 CSDN 出这个活动有段时间了&#xff0c;奈何俗务缠身&#xff0c;一直没静下心来想想怎么写。今天碰巧赶上了&#xff0c;就顺便聊聊…

【Linux扩容根分区】LVM分区扩容过程踩坑记录

最近想要给自己使用的Linux操作系统的根分区进行扩容&#xff0c;解决完发现&#xff0c;原来问题如此简单。 特此记录&#xff0c;希望能帮助到有需要的人。 通过df -Th查看系统磁盘分区情况 通过vgdisplay 查看内容 实操过程中&#xff0c;原来红框中&#xff0c;Free PE …

2024年双十一买啥最划算?双十一好物推荐闭眼入!

一年一度的双十一购物狂欢节已悄然临近&#xff0c;这不仅是一场消费者的盛宴&#xff0c;更是各大品牌竞相展示实力、推出优惠的绝佳时机。在这个全民狂欢的日子里&#xff0c;数码产品作为科技与生活的桥梁&#xff0c;相信已经有不少朋友想要大买特买了。无论是追求极致性能…