如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
给定三个点 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)
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。