Войти
ПрограммированиеФорумОбщее

Найти формулу для координат соседей

Страницы: 1 2 3 Следующая »
#0
(Правка: 22:59) 16:28, 25 мая 2021

Есть 8 соседей вокруг точки с координатой (0, 0). Нужно найти формулу чтобы по координатам соседа найти его индекс.

6 3 7
0 * 1
4 2 5

Для вертикальных и горизонтальных соседей индекс от 0 до 3 в любом порядке.
Для диагоналей от 4 до 7 тоже в любом порядке.

Пример:

+ Показать

В любом порядке значит, что допустимы оба варианта:

+ Показать

Но для одних и тех же параметров функция должна возвращать одно и то же значение.
Ищу именно формулу без ифов и предопределнных масивов.


#1
21:07, 25 мая 2021

AlexeyLarin

> для одних и тех же параметров функция должна возвращать одно и то же значение
и
> (0, -1) => 1
> (0, -1) => 2

Это как?
И чем не подходит std::map<Vector2, int> ?

#2
21:40, 25 мая 2021

постановка задачи это половина ответа

#3
(Правка: 23:00) 22:57, 25 мая 2021

rcsim
> Это как?
Это две функции и их результаты. Оба варианта допустимы.

Первый вариант
5 3 7
0 * 1
4 2 6

Второй вариант
6 2 7
0 * 3
4 1 5

> И чем не подходит std::map<Vector2, int> ?
Примерно так сейчас и сделано. Вариант с формулой должен быть быстрей (разумеется если удастся ее найти).

ИПавлов
Не знаю как еще понятней описать.
Вон пример сверху где звездочка. Звездочка это наш центр (0,0). Цифры вокруг нее это ее соседи.
Нужно найти формулу чтобы по координатам соседа вычислить его индекс. Для диагональных соседей индекс должен быть от 4 до 7, а для остальных от 0 до 3.

#4
23:56, 25 мая 2021

AlexeyLarin
> Оба варианта допустимы.
> Не знаю как еще понятней описать.

Я бы употребил русское народное слово "рандом".
И если это не оно, не знаю, что это еще может быть.

AlexeyLarin
> Вариант с формулой должен быть быстрей

Разумеется нет.
Твои координаты пакуются в байт(даже 6 бит, но не суть).
Тут даже map не нужен. Просто вектор или массив.
Походу даже switch будет быстрее.

#5
(Правка: 23:57) 23:56, 25 мая 2021

AlexeyLarin
> Вариант с формулой должен быть быстрей
Вместо мапа используй массив.

int cn[]={6,2,7,0,-1,3,4,1,5}

cn[(x+1)+(y+1)*3]
#6
(Правка: 6:24) 6:20, 26 мая 2021

описано то понятно, но понимаешь, что функция "без ифов" будет просто умножать два числа и давать 0 либо 1 от этого будет определятся пренадлежность к диагонали, а далее 0 или 1 будет умножаться на рандом чтобы получить число от 4 до 7
тоесть это тоже самое, что иф !=0 то 4--7, елсе 0--3

#7
23:37, 26 мая 2021

AlexeyLarin
> Для вертикальных и горизонтальных соседей индекс от 0 до 3 в любом порядке.
> Для диагоналей от 4 до 7 тоже в любом порядке.

Длинновато вышло:

f = x + y - (x And 1) + 2 + (x * y And 1) * (4 * x * x + (x And 2) \ 2)

"\" - это целочисленное деление, можно заменить на битовый сдвиг.

#8
(Правка: 8:39) 8:39, 27 мая 2021

Обязательно индексировать именно так?
Можно по формуле dx + dy*3 + 4 считать такие индексы:
0 1 2
3 4 5
6 7 8
Чем не подходит такой вариант?

#9
8:49, 27 мая 2021
(0524100736>>(12+x*3+y*9))&7
#10
(Правка: 9:45) 9:40, 27 мая 2021

FordPerfect
Оценил мысль, класс! Только вместо 0524100736 должно быть, например, 125371204.
Иначе не работает.

#11
9:50, 27 мая 2021

Mikle
> Оценил мысль, класс!
LUT без массива подобен LUT с массивом, только без массива.

#12
9:57, 27 мая 2021

Mikle
> Только вместо 0524100736 должно быть, например 125371204.
https://ru.m.wikipedia.org/wiki/Восьмеричная_система_счисления#В_… граммирования

0524100736==89162206

#13
10:02, 27 мая 2021

Но в каком-нибудь C# этих литералов нет, да.

#14
(Правка: 10:08) 10:08, 27 мая 2021

FordPerfect

Ряд языков программирования, в частности, Си/C++, Ada, Perl, Java и Python (до 3.0), имеют специальный синтаксис (аналогичный использованию префикса "0x" для шестнадцатеричных констант) для записи восьмеричных констант

А я в шарпе проверял - там нет такой записи восьмеричных чисел.

Пока писал, ты сам про шарп вспомнил.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее