Рассчитать идентификатор для ячейки на основе х и у - PullRequest
0 голосов
/ 06 марта 2011

Я вычисляю идентификатор для ячейки сетки следующим образом:

id = x * 65536 + y;

Пытаясь вычислить x и y для идентификатора, я делаю это:

x = id / 65536;
y = id - (x * 65536);

Это работает, пока Y больше 0. Если Y отрицателен, я должен вычислить это так:

x = (int)Math.Ceiling((double)id / 65536.0);
y = id - (x * 65536);

Как узнать, нужно ли мне округлять вверх или вниз, прежде чем я узнаю, что у? Есть ли лучший способ создать один идентификатор для ячейки на основе х и у? Я чувствую, что упускаю что-то очевидное, но после нескольких часов выслеживания странных ошибок в задачах округления мой мозг не работает.

Ответы [ 4 ]

2 голосов
/ 06 марта 2011

Если вы знаете, что 30 000> y> -30 000, вы можете сделать это:

x = (id + 30000) / 65536
y = id - (x * 65536)

Если 65536> y> -65536, то:

id = x * 131072 + y

x = (id + 65536) / 131072
y = id - (x * 131702)
1 голос
/ 06 марта 2011

Вы сказали в комментариях, что y может принимать значение от -65336 до 655536. В этом случае вы должны использовать:

id = x * 131072 + y; // 131072 = 2^17

В противном случае пусть id будет 100000, тогда это можно перевести в две разные координаты:

100000 == 1 * 65536 + 34464  // x = 1, y = 34464
100000 == 2 * 65536 - 31072  // x = 2, y = -31072

Таким образом, если диапазон y составляет от -65536 до 65535 включительно, то вы должны использовать

id = x * 131072 + y;

и для обратного преобразования вы должны использовать решение, которое grc предложил:

x = (id + 65536) / 131072;
y = id - (x * 131072);
0 голосов
/ 06 марта 2011

Вы ищете это?

    UInt16 x = 123;
    UInt16 y = 456;

    UInt32 Point;

    // encode y high, x low
    Point = (UInt32)(x | (y << 0x10));

    // decode
    x = (UInt16)(Point & 0x0000FFFF);
    y = (UInt16)((Point & 0xFFFF0000) >> 0x10);
0 голосов
/ 06 марта 2011

Если в C # есть модуль (предположительно оператор %), используйте это. (Я предполагаю, что x и y являются целыми числами.)

...