3 / 2 / 1
Регистрация: 11.08.2022
Сообщений: 46
1

Как узнать индекс ячейки в которой находится "точка", зная структуру ячеек?

23.03.2023, 11:37. Показов 3317. Ответов 44

Author24 — интернет-сервис помощи студентам
Здравствуйте, я знаю как найти индекс кубических ячеек, но не знаю как найти индекс усеченных кубических ячеек, разница в том, что у усеченных на углах дополнительные ячейки, поэтому они и усеченные кубы. Помогите мне пожалуйста модифицировать алгоритм сложения векторов для кубических ячеек: id + 1 = X * Xv + Y * Yv + Z * Zv, Где X,Y,Z это координаты, Xv,Yv,Zv это множитель изменения id в зависимости от изменения по одноименному вектору координаты, и да все ячейки начинаются с нуля координат, и уходят в ++. Помогите пожалуйста, а то ну очень поможет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2023, 11:37
Ответы с готовыми решениями:

Как узнать индекс столбца в dataGrid, зная содержимое заголовка?
Здравствуйте! Знает ли кто-нибудь, как узнать индекс столбца, зная, что написано в его...

Как узнать индекс элемента ListBox, зная только его текст
И снова всем Добрый день! Не давно разобрался со сравнением элементов в listbox. Теперь у меня...

Как узнать индекс элемента массива, зная итератор на этот элемент?
Вот пример: #include <iostream> #include <vector> #include <algorithm> size_t get_index ...

ListBox узнать текст зная индекс элемента и узнать индекс зная текст элемента
Мне нужно что-то в этом роде for(int b ; b < listBox1.Items.Count ; b++) { string name = Узнаем...

44
3 / 2 / 1
Регистрация: 11.08.2022
Сообщений: 46
23.03.2023, 19:05  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от zayats80888 Посмотреть сообщение
пронумеруйте ячейки, как вы хотите их видеть:
id при пересечении XY = 0, в направлении направо красная = 1, след = 2, желтая = 5, красная = 9, желтая = 14, ну вы поняли.
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
23.03.2023, 19:05 22
Цитата Сообщение от Gifer Посмотреть сообщение
ну вы поняли.
Не совсем, цвета - это вершины. Например, на картинке красная вершина XY = 0 является общей для двух соседних ячеек (если считаем их ромбами в 2D) или трех соседних ячейек (если считаем их октаэдрами). Просто желтые вершины с отрицательными координатами, которые являются частью крайних ячеек, но вам не нужны, я не стал рисовать.
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
23.03.2023, 19:12 23
Вот я вам для наглядности дорисовал пару вершин и раскрасил ячейки. Какие id у зеленой, синей, оранжевой и светло желтой?
Как узнать индекс ячейки в которой находится "точка", зная структуру ячеек?
0
3 / 2 / 1
Регистрация: 11.08.2022
Сообщений: 46
23.03.2023, 19:14  [ТС] 24
тогда как то так
Изображения
 
0
3 / 2 / 1
Регистрация: 11.08.2022
Сообщений: 46
23.03.2023, 19:17  [ТС] 25
Цитата Сообщение от zayats80888 Посмотреть сообщение
Какие id у зеленой, синей, оранжевой и светло желтой?
у синей id0 у зеленой 4, ор5,желтой9
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
23.03.2023, 19:39 26
Цитата Сообщение от Gifer Посмотреть сообщение
тогда как то так
Тогда примерно как-то так (псевдокод):
Код
дано 3 координаты:
x, y, z
дана длина красного ребра ячейки:
L

приводим координаты к кубической сетке:
x = x / L;
y = y / L;
z = z / L;

берем от полученных значений целые:
xc = ceil(x);
yc = ceil(y);
zc = ceil(z);
и вещественные части:
xf = fract(x);
yf = fract(y);
zf = fract(z);

приводим вещественные части в диапазон -1..1 для удобства:
xf = xf * 2 - 1;
yf = yf * 2 - 1;
zf = zf * 2 - 1;

далее выбираем добавки,
соответствющих одной из шести пирамидок внутри кубика (abs - это модуль, && - логическое И):
if (xf >= 0.5 && xf >= abs(yf) && xf >= abs(zf))
    xc = xc + 1;
else if (yf >= 0.5 && yf >= abs(xf) && yf >= abs(zf))
    yc = yc + 1;
else if (zf >= 0.5 && zf >= abs(xf) && zf >= abs(yf))
    zc = zc + 1;

считаем индекс,
n - количество ячеек по оси X,
m - количество ячеек по оси Y:
id = zc * n * m + yc * n + xc;
1
3 / 2 / 1
Регистрация: 11.08.2022
Сообщений: 46
23.03.2023, 19:59  [ТС] 27
zayats80888, Спасибо за решение, я поражаюсь вашему альтруизму, думаю это пригодится не только мне!
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
23.03.2023, 20:04 28
Цитата Сообщение от Gifer Посмотреть сообщение
Спасибо за решение
Рановато радуетесь, я написал, что нужно выбрать одну из шести добавок, а сам выбрал одну из четырех, там надо еще два условия написать в ветке if. Сейчас башка не варит, завтра попробую уточнить.
И плюсом опечатался, там надо стравнивать с нулем, а не с 0.5

Не по теме:

(Снял вашу отметку решения со своего поста)

0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,738
23.03.2023, 21:12 29
Цитата Сообщение от zayats80888 Посмотреть сообщение
берем от полученных значений целые:
Стандартная техника floor, работает и для отрицательных, напр floor(-0.1) = -1

Цитата Сообщение от Gifer Посмотреть сообщение
у синей id0 у зеленой 4, ор5,желтой9
Ну в "одномерном" индексе смысла никакого, нужна именно тройка индексов (обычно чтобы щупать соседей)

Добавлено через 58 минут
Интересно, а сколько у тетраэдрона (вплотную прилегающих) соседей? (у куба 26)
0
3 / 2 / 1
Регистрация: 11.08.2022
Сообщений: 46
23.03.2023, 21:32  [ТС] 30
Цитата Сообщение от Igor3D Посмотреть сообщение
Интересно, а сколько у тетраэдрона (вплотную прилегающих) соседей? (у куба 26)
16 вроде
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
24.03.2023, 06:55 31
Цитата Сообщение от zayats80888 Посмотреть сообщение
Сейчас башка не варит, завтра попробую уточнить.
Gifer, примерно так, но это не точно:
Код
дано 3 координаты:
x, y, z
дана длина красного ребра ячейки:
L

приводим координаты к кубической сетке:
    x = x / L;
    y = y / L;
    z = z / L;

берем от полученных значений целые:
    xc = floor(x);
    yc = floor(y);
    zc = floor(z);
и вещественные части:
    xf = fract(x);
    yf = fract(y);
    zf = fract(z);

удваиваем целые:
    xc = xc * 2;
    yc = yc * 2;
    zc = zc * 2;

приводим вещественные части в диапазон -1..1 для удобства:
    xf = xf * 2 - 1;
    yf = yf * 2 - 1;
    zf = zf * 2 - 1;

далее выбираем добавки, соответствющие одной из
шести пирамидок внутри кубика (abs - это модуль, && - логическое И):
    if (xf < 0 && xf < -abs(yf) && xf < -abs(zf))
        xc = xc - 1;
    else if (xf >= 0 && xf >= abs(yf) && xf >= abs(zf))
        xc = xc + 1;
    else if (yf < 0 && yf < -abs(xf) && yf < -abs(zf))
        yc = yc - 1;
    else if (yf >= 0 && yf >= abs(xf) && yf >= abs(zf))
        yc = yc + 1;
    else if (zf < 0 && zf < -abs(xf) && zf < -abs(yf))
        zc = zc - 1;
    else if (zf >= 0 && zf >= abs(xf) && zf >= abs(yf))
        zc = zc + 1;

!!! на этом этапе мы имеем три целых числа (xc, yc, zc),
которые уникально идентифицируют октаэдр, но преобразование их
в одномерный индекс - условность, на ваше усмотрение,
в частности, можно "сдвинуть" по каким-то индексам,
чтоб сместить "начало" отсчета, а можно оставить как есть.

например, пусть даны три целых числа:
n - какая-то размерность по оси X,
m - какая-то размерность по оси Y,
k - какая-то размерность по оси Z, тогда
если xc принадлежит полуинтервалу [0, n)
и yc принадлежит полуинтервалу [0, m)
и zc принадлежит полуинтервалу [0, k), то:
    id = zc * n * m + yc * n + xc;
иначе отбрасываем, однозначное преобразование невозможно,
индексы выходят за ограниченый условно объем.
1
547 / 129 / 7
Регистрация: 21.01.2023
Сообщений: 195
26.03.2023, 20:57 32
Всю тему не читал, может повторюсь: октаэдрами невозможно заполнить пространство без зазоров, тетраэдрами тоже.
Из многогранников, которыми заполнить пространство можно, приходит на ум шестиугольная призма - тоже 8 граней, как у октаэдра.
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,738
27.03.2023, 21:28 33
Цитата Сообщение от Mikle Quits Посмотреть сообщение
может повторюсь: октаэдрами невозможно заполнить пространство без зазоров, тетраэдрами тоже.
Давайте не просто "утверждать", а "аргументировать" Заполоняем пр-во кубами и "усекаем" каждый куб. В каждом вертексе (угле) куба 8 кубов в которые этот вертекс входит. Отсечка одного угла = 1/16 часть куба. Поэтому как "начальный" так и "собранный" кубы (вернее тетраэдры в которые они превратились) вдвое меньше исходного. Поэтому заполняется пр-во тетраэдрами

Не по теме:

Ну и все проще: видел такую опцию в софте. Из той же оперы "гексагон" (типа пчелиных сот) - тоже головняк

0
547 / 129 / 7
Регистрация: 21.01.2023
Сообщений: 195
27.03.2023, 22:21 34
Цитата Сообщение от Igor3D Посмотреть сообщение
Из той же оперы "гексагон" (типа пчелиных сот) - тоже головняк
Я выше уже написал: "шестиугольная призма".
Не очень понял про отсечение, но я ЗНАЮ, что октаэдры плотно не укладываются, вообще никакие правильные многогранники, кроме кубов, не укладываются. Можно уложить октаэдры плюс тетраэдры, в отношении 1/2.
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
27.03.2023, 23:12 35
Цитата Сообщение от Mikle Quits Посмотреть сообщение
правильные многогранники
Так а кто говорит о правильных?
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,738
28.03.2023, 01:14 36
Цитата Сообщение от Mikle Quits Посмотреть сообщение
но я ЗНАЮ,
Видимо отсюда? Ну все равно, как гордо звучит "ЗНАЮ"

Мои источники: статья середины 80-х, называется как-то "Implicit Surfaces", и есть исходники на С, называется "polygonizer". Автор Джуль Блюменталь (из Xerox). Там точно помню выбор между опциями куб/тетраэдр. И еще помню шейдер который в любом сечении дает "hexagon", т.е. пчелиные соты. Правда разбираться там с индексами - мрачно. Подымать эти ссылки и перепроверять - у меня лично энтузиазма нет

Кстати ТС приводит октаэдр, про тетраэдр как-то само придумалось Оба - правильные, так что о них говорим
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
28.03.2023, 08:15 37
Цитата Сообщение от Igor3D Посмотреть сообщение
Кстати ТС приводит октаэдр, про тетраэдр как-то само придумалось Оба - правильные, так что о них говорим
Что там ТС приводит, оставим за скобками
А как тогда называть неправильный октаэдр? Бипирамида?
0
547 / 129 / 7
Регистрация: 21.01.2023
Сообщений: 195
28.03.2023, 08:17 38
Цитата Сообщение от zayats80888 Посмотреть сообщение
Так а кто говорит о правильных?
Тот, кто первый написал "октаэдр".
Цитата Сообщение от Igor3D Посмотреть сообщение
Видимо отсюда?
Нет, я сам когда-то считал, тогда же и нашёл вариант смешанного применения октаэдров и тетраэдров.
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
28.03.2023, 08:33 39
Цитата Сообщение от Mikle Quits Посмотреть сообщение
Тот, кто первый написал "октаэдр".
Да, этот термин часто используется для обозначения именно "правильного октаэдра", но это не исчерпывает его значения.
0
547 / 129 / 7
Регистрация: 21.01.2023
Сообщений: 195
28.03.2023, 09:10 40
Цитата Сообщение от zayats80888 Посмотреть сообщение
тот термин часто используется для обозначения именно "правильного октаэдра", но это не исчерпывает его значения.
Верно, неправильными октаэдрами можно заполнить пространство, просто изначально топикстартером ставилась задача по правильным октаэдрам:
Как узнать индекс ячейки в которой находится "точка", зная структуру ячеек?
Цитата оттуда:
гранями которого являются правильные треугольники
0
28.03.2023, 09:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2023, 09:10
Помогаю со студенческими работами здесь

Как узнать индекс строки в котором находится определенное слово
Здравствуйте Создал поиск по тексту и он находит слово введенное в textBox. Как узнать индекс...

Как определить адрес ячейки, в которой находится картинка?
Задача такая: экспортировать все картинки из файла xlsx, который представляет собой каталог...

Если точка не лежит на координатных осях, то вывести номер четверти, в которой находится точка
Даны два целых числа, координаты точки на плоскости A (x, y). Если точка не лежит на координатных...

Дано четыре ячейки. Из той ячейки, в которой число окажется больше, вычесть числа из остальных ячеек
Нужна помощь по созданию простенького условия, сам что то не с интуичу (тупой я). Дано четыре...

Как узнать адрес страницы, на которой находится пользователь?
Привет! Собственно и весь вопрос... Использую JSP. И если такое возможно, хотелось бы узнать адрес...

Как узнать является ли строка адресом ячейки или ячеек?
Там вроде надо проверять через isobject. Покажите пример кода.

Даны координаты точки на плоскости. Вывести номер координатной четверти, в которой находится данная точка, если точка
1. Из файла сценария с помощью функции диалогового ввода ввести с клавиатуры все необходимые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru