Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2016, 04:34   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию единый метод прохода по 3D-массиву

есть входной массив bool[][][](да именно так, хотя он прямоугольный параллелепипед) или иными словами массив данных для 3D текстуры.
собственно цель делать ее различные проекции,
принцип просто спроецировать на тему есть точка или нет точки.
сама отдельная проекция решается легко, всего три цикла и ИЛИ.
Код:
 public string PrintZY()
            {
                int width = maxY +1;//для переносов строк
                int height = maxZ;
                var res = new char[width * height];
                for (z = 0; z <= maxZ; z++)
                {
                    for (y = 0; y <= maxY; y++)
                    {
                        bool v = false;
                        for (x = 0; x <= maxX; x++)
                        {
                            v = v | _map[x][y][z];
                        }
                        res[width * (z) + (y)] = v?'1':'0';
                    }
                    res[width * (z + 1) - 1] = '\n';
                }
                return new string(res);
            }
Для вывода применяется кастомный шрифт, но это не так важно.
заменил на 1, 0 для простоты.

проблема в том что что для проекции в других плоскостях, применяется почти такая же процедура, но там изменен порядок циклов и меня убивает такое повторение кода.

сосбтвенно возможно ли написать такой метод чтоб не дублировать код?
например просто метод string Print(...)
и я потом уже буду из PrintXY дергать его с нужными параметрами.

может быть можно матрицами...но я плох с вышкой к сожалению
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Alex11223; 24.06.2019 в 15:07.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.05.2016, 05:23   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Думать в 5 часов утра уже не особо получается . Такая конструкция, на первый взгляд, должна делать разные проекции:
Код:
public string Print(int printType)
{
    // 1 -> ZY - X
    // 2 -> ZX - Y
    // 3 -> YX - Z
    int A, B, C;
    switch (printType)
    {
        case 1:
            A = maxZ;
            B = maxY;
            C = maxX;
            break;
        case 2:
            A = maxZ;
            B = maxX;
            C = maxY;
            break;
        case 3:
            A = maxY;
            B = maxX;
            C = maxZ;
    }
    int width = B + 1;
    int height = A;
    var res = new char[width * height];
    for (z = 0; z <= A; z++)
    {
        for (y = 0; y <= B; y++)
        {
            bool v = false;
            for (x = 0; x <= C; x++)
            {
                switch (printType)
                {
                    case 1:
                        v = v | _map[x][y][z];
                        break;
                    case 2:
                        v = v | _map[y][x][z];
                        break;
                    case 3:
                        v = v | _map[y][z][x];
                }
            }
            res[width * (z) + (y)] = v?'1':'0';
        }
        res[width * (z + 1) - 1] = '\n';
    }
    return new string(res);
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.05.2016, 10:53   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а есть иные мысли кроме свича?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.05.2016, 18:55   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
public string Print(int projectionAxis, int widthAxis, int heightAxis)
{
    int A, B, C;
    C = (projectionAxis == 1) * maxX + (widthAxis == 1) * maxY + (heightAxis == 1) * maxZ; 
    B = (projectionAxis == 2) * maxX + (widthAxis == 2) * maxY + (heightAxis == 2) * maxZ; 
    A = (projectionAxis == 3) * maxX + (widthAxis == 3) * maxY + (heightAxis == 3) * maxZ; 
    int width = B + 1;
    int height = A;
    var res = new char[width * height];
    for (z = 0; z <= A; z++)
    {
        for (y = 0; y <= B; y++)
        {
            bool v = false;
            for (x = 0; x <= C; x++)
            {
                v = v | _map[(projectionAxis == 1) * x + (projectionAxis == 2) * y + (projectionAxis == 3) * z][(widthAxis == 1) * x + (widthAxis == 2) * y + (widthAxis == 3) * z][(heightAxis == 1) * x + (heightAxis == 2) * y + (heightAxis == 3) * z];
            }
            res[width * (z) + (y)] = v?'1':'0';
        }
        res[width * (z + 1) - 1] = '\n';
    }
    return new string(res);
}
На основе матрицы поворота, только вместо честной матрицы 3 на 3, передаются индексы (Ось X - индекс 1, Y - 2, Z - 3). Код не запускал - только в качестве идеи.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 12.05.2016 в 19:03.
BDA вне форума Ответить с цитированием
Старый 14.05.2016, 01:01   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

спасибо, работает
терь не раздражает =D

вынес все условия в переменные чтоб постоянно не сравнивал
+ надо сравнения обернуть в Convert.ToInt32
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.05.2016, 01:08   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Пожалуйста
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
надо сравнения обернуть в Convert.ToInt32
Не знал об этом (не пишу на шарпе).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
For each по переданному в метод динам. массиву WennY Общие вопросы C/C++ 7 22.06.2015 12:34
Единый источник :) cw_o Microsoft Office Word 10 05.02.2013 15:33
Отыскание прохода по лабиринту в Delphi CyberGirl Помощь студентам 0 06.04.2011 08:20
Отыскание прохода по лабиринту В Delphi CyberGirl Помощь студентам 0 15.03.2011 14:20
Единый исполняемый файл phobos Общие вопросы .NET 9 25.05.2009 19:32