【发布时间】:2016-01-30 17:48:07
【问题描述】:
定义了以下枚举:
public enum Direction
{
North,
South,
East,
West,
Northeast,
Northwest,
Southeast,
Southwest,
Undefined
}
给定二维空间中的两组坐标,我想确定点 2 到 1 的相对基本方向。
例子:
- P1(1,1) 和 P2(0,1) 返回 Direction.North,因为 P2 位于 P1 的北边
- P1(1,1) 和 P2(5,4) 返回 Direction.Southeast
- P1(1,1) 和 P2(1,1) 返回 Direction.Undefined
我目前的方法涉及一堆条件,即
if (P1.X == P2.X)
{
// either North, South or Undefined
if (P1.Y < P2.Y)
return Direction.South;
else if (P1.Y > P2.Y)
return Direction.North,
else
return Direction.Undefined;
}
else if (P1.Y == P2.Y)
{
...
}
else
{
...
}
我正在寻找一种更短更优雅的解决方案。
【问题讨论】:
-
使用矢量
P2 - P1的角度(使用arctan2()),然后执行if(-15° <= angle <= 15°) return Direction.North之类的操作? (即,将整个事物拆分为 numDirections 切片,然后检查角度是否在一个区间内)。另外我不明白为什么如果P1.X < P2.X为真(意味着点P1 位于P2 的左侧),为什么它会返回南方向? -
它是在标准笛卡尔坐标中定义的吗?如果是这样,那么第一个样本不应该是 Direction.West,第二个是 Direction.Northeast 吗?
-
@PiotrWolkowski 显然,OP 沿着负 X 轴向北,而不是更常见的正 Y 轴。这很奇怪,但“标准笛卡尔坐标”中没有任何东西可以指示北方的方向。
-
我们可以假设您需要一个 45 度楔形用于八个方向中的每一个吗?