public static Point CoordToCell(Vector2 coord) {
// Divide the cell coordinate the value again (or multiply by -4)
// Then Math.Round() to eliminate any floating point inaccuracies
var cellY = (int)Math.Round(coord.y / -0.25f);
// Armed with the original Integer Y, we can undo the mutation of X (again, accounting for floating point inaccuracies)
var cellX = (int)Math.Round(coord.x - ((cellY % 2) * 0.5f));
return new Point() {
x = cellX,
y = cellY
};
}
Это должно обратить процесс вспять. Я использовал Point в качестве универсального контейнера для целочисленных координат X и Y, вы можете заменить его по мере необходимости.
Самая большая проблема, на мой взгляд, заключается в том, что мутация X изначально была основана на целочисленном значении Y, из которого вы затем сохранили значение с плавающей запятой. Я не мог найти способ изменить это без Math.Round(), чтобы надежно преобразовать результаты с плавающей запятой в целые значения.
Обновить Расчет координат ячейки, содержащей заданную мировую координату:
Глядя на то, как расположены ваши мировые координаты, мы видим, что центры каждой ячейки находятся на диагональных линиях, заданных следующим образом:
- y = ( x - i ) / 2 ... or ... x - 2y = i
- y = ( j - x ) / 2 ...
or ... x + 2y = j
где i и j — целые числа. Эта диаграмма показывает это для x - 2y = i диагоналей.
Используя их, мы можем взять мировые координаты данной точки, вычислить i и j, а затем округлить их до ближайшего целого числа, чтобы получить центр ячейки как i и j.
Затем мы можем использовать i и j для определения x и y центра ячейки и использовать функцию, которую я опубликовал ранее, чтобы преобразовать их обратно в координаты ячейки.
public static Point CoordToCell(Vector2 coord)
{
// Work out the diagonal i and j coordinates of the point.
// i and j are in a diagonal coordinate system that allows us
// to round them to get the centre of the cell.
var i = Math.Round( coord.x - coord.y * 2 );
var j = Math.Round( coord.x + coord.y * 2 );
// With the i and j coordinates of the centre of the cell,
// convert these back into the world coordinates of the centre
var centreX = ( i + j ) / 2;
var centreY = ( j - i ) / 4;
// Now convert these centre world coordinates back into the
// cell coordinates
int cellY = (int)Math.Round(centreY * -4f);
int cellX = (int)Math.Round(centreX - ((cellY % 2) * 0.5f));
return new Point() {
x = cellX,
y = cellY
};
}
Я использовал следующие координатные точки в качестве тестовых случаев
{ x = 1.5f, y = -0.25f } => ( 1, 1 ) // Centre of 1, 1
{ x = 1.9f, y = -0.25f } => ( 1, 1 ) // Near the right of 1, 1
{ x = 1.5f, y = -0.374f } => ( 1, 1 ) // Near the bottom of 1, 1
{ x = 1.1f, y = -0.25f } => ( 1, 1 ) // Near the left of 1, 1
{ x = 1.5f, y = -0.126f } => ( 1, 1 ) // Near the top of 1, 1
{ x = 2.5f, y = -0.25f } => ( 2, 1 ) // Centre of 2, 1
{ x = 2f, y = -0.5f } => ( 2, 2 ) // Centre of 2, 2
Надеюсь это поможет
person
Trevor
schedule
29.01.2018