平面中有序三元组点的方向可以是
- 逆时针
- 顺时针
- 共线
下图显示了 (a,b,c) 的不同可能方向
如果 (p1, p2, p3) 的方向共线,那么 (p3, p2, p1) 的方向也共线。
如果 (p1, p2, p3) 的方向是顺时针,那么 (p3, p2, p1) 的方向是逆时针,反之亦然。
示例:给定三个点 p1、p2 和 p3,找出 (p1, p2, p3) 的方向。
Input: p1 = {0, 0}, p2 = {4, 4}, p3 = {1, 2}
Output: CounterClockWise
Input: p1 = {0, 0}, p2 = {4, 4}, p3 = {1, 1}
Output: Colinear
如何计算方向?
这个想法是使用斜率。 线段(p1, p2)的斜率:σ = (y2 – y1)/(x2 – x1) 线段(p2, p3)的斜率:τ = (y3 – y2)/(x3 – x2) 如果σ > τ ,方向是顺时针(右转) 使用上述 σ 和 τ 的值,我们可以得出结论,方向取决于以下表达式的符号: (y2 – y1)*(x3 – x2) – (y3 – y2)*( x2 – x1) 当 σ < τ 时,上式为负,即逆时针
下面是上述想法的实现。
C++
// A C++ program to find orientation of three points
#include
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 colinear
// 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; // colinear
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";
return 0;
}
Java
// JAVA Code to find Orientation of 3
// ordered points
class Point
{
int x, y;
Point(int x,int y){
this.x=x;
this.y=y;
}
}
class GFG {
// To find orientation of ordered triplet
// (p1, p2, p3). The function returns
// following values
// 0 --> p, q and r are colinear
// 1 --> Clockwise
// 2 --> Counterclockwise
public static 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; // colinear
// clock or counterclock wise
return (val > 0)? 1: 2;
}
/* Driver program to test above function */
public static void main(String[] args)
{
Point p1 = new Point(0, 0);
Point p2 = new Point(4, 4);
Point p3 = new Point(1, 2);
int o = orientation(p1, p2, p3);
if (o==0)
System.out.print("Linear");
else if (o == 1)
System.out.print("Clockwise");
else
System.out.print("CounterClockwise");
}
}
//This code is contributed by Arnav Kr. Mandal.
Python3
# A Python3 program to find orientation of 3 points
class Point:
# to store the x and y coordinates of a point
def __init__(self, x, y):
self.x = x
self.y = y
def orientation(p1, p2, p3):
# to find the orientation of
# an ordered triplet (p1,p2,p3)
# function returns the following values:
# 0 : Colinear points
# 1 : Clockwise points
# 2 : Counterclockwise
val = (float(p2.y - p1.y) * (p3.x - p2.x)) - \
(float(p2.x - p1.x) * (p3.y - p2.y))
if (val > 0):
# Clockwise orientation
return 1
elif (val < 0):
# Counterclockwise orientation
return 2
else:
# Colinear orientation
return 0
# Driver code
p1 = Point(0, 0)
p2 = Point(4, 4)
p3 = Point(1, 2)
o = orientation(p1, p2, p3)
if (o == 0):
print("Linear")
elif (o == 1):
print("Clockwise")
else:
print("CounterClockwise")
# This code is contributed by Ansh Riyal
C#
// C# Code to find Orientation of 3
// ordered points
using System;
public class Point
{
public int x, y;
public Point(int x,int y)
{
this.x = x;
this.y = y;
}
}
class GFG
{
// To find orientation of ordered triplet
// (p1, p2, p3). The function returns
// following values
// 0 --> p, q and r are colinear
// 1 --> Clockwise
// 2 --> Counterclockwise
public static 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; // colinear
// clock or counterclock wise
return (val > 0)? 1: 2;
}
/* Driver program to test above function */
public static void Main(String[] args)
{
Point p1 = new Point(0, 0);
Point p2 = new Point(4, 4);
Point p3 = new Point(1, 2);
int o = orientation(p1, p2, p3);
if (o == 0)
Console.WriteLine("Linear");
else if (o == 1)
Console.WriteLine("Clockwise");
else
Console.WriteLine("CounterClockwise");
}
}
/* This code contributed by PrinciRaj1992 */
输出:
CounterClockwise
方向的概念在以下文章中使用:
- 找到一组给定点的简单闭合路径
- 如何检查两个给定的线段是否相交?
- 凸包 |设置 1(Jarvis 的算法或包装)
- 凸包 |第 2 组(格雷厄姆扫描)
资料来源: http : //www.dcs.gla.ac.uk/~pat/52233/slides/Geometry1x1.pdf
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。