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

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

给定三个点 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和p2, p3构成的线段的斜率,并计算它们的叉积。设点 p1 和 p2 构成的线段的斜率为x,另一条线段的斜率为y。现在有三种可能:

如果x - y == 0:如果点构成的斜率相等,则表示这三个点位于一条直线上,并且它们共线。

如果x - y > 0:如果点 p1, p2 形成的斜率大于 p2, p3,则表示正在形成右转结构,因此它是顺时针方向。

如果x - y < 0:如果点 p1, p2 构成的线段的斜率小于点 p2, p3 构成的线段的斜率,则表示正在形成左转结构,因此方向为逆时针。

根据上图,点 p1 和 p2 构成的线段的斜率为:x = (y2 - y1) / (x2 - x1)。

点 p2 和 p3 构成的线段的斜率为:y = (y3 - y2) / (x3 - x2)。两个斜率的叉积为:( y2 - y1) * (x3 - x2) - (x2 - x1) * (y3 - y2)。

以下是上述想法的 实现:

// C++ program to find the orientation

// of the three points

#include <bits/stdc++.h>

using namespace std;

// Function to find the orientation

void orientation(int x1, int y1, int x2,

int y2, int x3, int y3) {

// orientation of an (x, y) triplet

int val = ((y2 - y1) * (x3 - x2)) -

((x2 - x1) * (y3 - y2)) ;

if (val == 0)

cout << "Collinear";

else if (val > 0)

cout << "Clockwise";

else

cout << "CounterClockwise";

}

int main() {

int x1 = 0, y1 = 0, x2 = 4;

int y2 = 4, x3 = 1, y3 = 1;

orientation(x1, y1, x2, y2, x3, y3);

return 0;

}
输出

复制代码
Collinear

时间复杂度: O(1)
辅助空间: O(1)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
赤生云电竞32 分钟前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
小七在进步1 小时前
string的使用(2)
c++
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
wo_jack3 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
Oneshot4 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
青少儿编程课堂5 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
kongdong5 小时前
Hikyuu | RSI均值回归交易策略实现
算法·均值算法·回归·量化交易·交易策略·hikyuu
小王C语言5 小时前
优选算法:分治-归并排序
算法
草莓熊Lotso5 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试