Представьте квадрат внутри квадрата -1..1, где позиция палки (X) находится на одной из сторон:
+-----------------+ +-----------------+
| | | |
| | | |
| X | | +-----X-+ |
| | | | | |
| O | | | O | |
| | | | | |
| | | +-------+ |
| | | |
| | | |
+-----------------+ +-----------------+
Вам просто нужно выяснить, на какой стороне находятся координатыи проверьте, находится ли он ближе к центру стороны или в углу.Если внутренний квадрат слишком мал, вы можете считать палку центрированной.
Что-то вроде:
Public enum Direction {
None,
LeftUp, Up, RightUp, Right, RightDown, Down, LeftDown, Left
}
public Direction GetDirection(double x, double y) {
double absX = Math.Abs(x);
double absY = Math.Abs(y);
if (absX < 0.1 && absY < 0.1) {
// close to center
return Direction.None;
}
if (absX > absY) {
// vertical side
double half = absX * 0.4142;
if (x > 0) {
// left side
if (y > half) return Direction.LeftDown;
if (y < -half) return Diretion.LeftUp;
return Direction.Left;
} else {
// right side
if (y > half) return Direction.RightDown;
if (y < -half) return Direction.RightUp;
return Direction.Right;
}
} else {
// horisontal side
double half = absY * 0.4142;
if (y > 0) {
// bottom
if (x > half) return Direction.RightDown;
if (x < -half) return Direction.LeftDown;
return Direction.Down;
} else {
// top
if (x > half) return Direction.RightUp;
if (x < -half) return Direction.LeftUp;
return Direction.Up;
}
}
}
Нет тригонометрии, только простые сравнения, поэтому он должен быть довольно быстрым.:)
(Хотя я использовал тригонометрию для вычисления точки 0,4142, которая является загаром (22,5), или положения на стороне, где угол равен 45/2.)