Проекция массива |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Проекция массива |
Merhaba |
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Мужской Репутация: 0 |
Добрый Вечер!!!
Помогите Пожалуйста решить задачу: В трехмерном массиве размерностью m*n*l , состоящим из нулей и единиц, хранится изображение(сеточное)некоторого трехмерного тела. Получить двумерный массив - его проекцию(тень) на любое выбранное направление. Я думаю, что: 1. В 3D координатах рисуем кубик, представляющий исхдный массив (если размерности не равны, то кубик кубиком уже не будет, но это к делу не относится). 2. Рисуем плоскость проекции. 3. Разбиваем плоскость на "пиксели", соответствующие элементам получаемого массива-проекции, т.е. на квадратики. 4. Проецируем на плоскость все элементы массива. Если в любую точку "пикселя" падает проекция хоть одной единицы - элементу массива-проекции присваиваем единицу. Если только нули - ноль. Помогите Пожалуйста написать код) |
Lapp |
Сообщение
#2
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Помогите Пожалуйста написать код) Мы обязательно поможем. Но ты хотя бы начни. Мысли у тебя в целом верные. Как я понял, пункты 1-3 относятся к тому, как занести тело в трехмерный массив. Это - отдельная задача, и она может оказаться намного сложнее, чем рисовать проекцию. Все зависит от того, как поджодить к интерфейсу. Но даже в простейщем варианте она ненамного проще проецирования. Но в том условии, которое ты написал, она просто не стоит. То есть трехмерный массив нужно промто считать заданным. Я не прав? -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Merhaba |
Сообщение
#3
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Мужской Репутация: 0 |
Мы обязательно поможем. Но ты хотя бы начни. Мысли у тебя в целом верные. Как я понял, пункты 1-3 относятся к тому, как занести тело в трехмерный массив. Это - отдельная задача, и она может оказаться намного сложнее, чем рисовать проекцию. Все зависит от того, как поджодить к интерфейсу. Но даже в простейщем варианте она ненамного проще проецирования. Но в том условии, которое ты написал, она просто не стоит. То есть трехмерный массив нужно промто считать заданным. Я не прав? Да, нужно просто считать заданным.. У меня затруднение вызывает проектирование на любое выбранное направление Var Mas3: Array[1..n,1..n,1..n] of Integer;
Перед этим нужно запросить у пользователя n. Организовать три цикла по заполнению массива с помощью генератора целых чисел в диапозоне: 0..1 или так: Type
T1 = array[1 .. n] of integer; { Одномерный массив }
T2 = array[1 .. n] of T1; { Двумерный массив }
T3 = array[1 .. n] of T2; { Трехмерный массив }
Сообщение отредактировано: Merhaba - |
Lapp |
Сообщение
#4
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Перед этим нужно запросить у пользователя n. С этим сам справишься? Только одно НО: нельзя запрашивать у пользователя n, которое входит в определение типа. Либо нужно сделать тип по максимуму (и запрашивать ограничение), либо использовать динамические массивы (что, конечно, предпочтительнее).Организовать три цикла по заполнению массива с помощью генератора целых чисел в диапозоне: 0..1 Цитата У меня затруднение вызывает проектирование на любое выбранное направление Я полагаю, что "любое" означает "любое из трех" на самом деле - то есть параллельно x, y и z.Допустим, изображение находится в массиве a, и ты хочешь получить его проекцию на плоскость xz (то есть, параллельно направлению y). Массив для этой проекции так и назовем: xz. var
xz: array [1..n,1..n] of byte;
, мысля, что первый индекс - это x, а второй - z. Тогда сам процесс получения проекции можно организовать примерно так: for x:=1 to n do
for z:=1 to n do begin
y:= 1;
while (y<=n) and (a[x,y,z]=0) do Inc(y);
xz[x,z]:= byte(y<=n)
end;
Ты можешь написать непосредственно три таких куска (меняя только массивы, представляющие плоскость, и индексы). Если хочешь реализовать, как функцию (для большего кпд кода), то нужно будет немного поменять архитектуру данных (либо вставить выбор непосредственно в цикл, что не есть хорошо и красиво). -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Merhaba |
Сообщение
#5
|
Пионер Группа: Пользователи Сообщений: 57 Пол: Мужской Репутация: 0 |
С этим сам справишься? Только одно НО: нельзя запрашивать у пользователя n, которое входит в определение типа. Либо нужно сделать тип по максимуму (и запрашивать ограничение), либо использовать динамические массивы (что, конечно, предпочтительнее). Я полагаю, что "любое" означает "любое из трех" на самом деле - то есть параллельно x, y и z. Допустим, изображение находится в массиве a, и ты хочешь получить его проекцию на плоскость xz (то есть, параллельно направлению y). Массив для этой проекции так и назовем: xz. var
xz: array [1..n,1..n] of byte;
, мысля, что первый индекс - это x, а второй - z. Тогда сам процесс получения проекции можно организовать примерно так: for x:=1 to n do
for z:=1 to n do begin
y:= 1;
while (y<=n) and (a[x,y,z]=0) do Inc(y);
xz[x,z]:= byte(y<=n)
end;
Ты можешь написать непосредственно три таких куска (меняя только массивы, представляющие плоскость, и индексы). Если хочешь реализовать, как функцию (для большего кпд кода), то нужно будет немного поменять архитектуру данных (либо вставить выбор непосредственно в цикл, что не есть хорошо и красиво). Скажите Пожалуйста, а что " xz[x,z]:= byte(y<=n)" означает? |
Lapp |
Сообщение
#6
|
Уникум Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: 159 |
Скажите Пожалуйста, а что " xz[x,z]:= byte(y<=n)" означает? Явное преобразование типа. byte(true) = 1 byte(false) = 0 Ты каким компилятором пользуешься? В уродском PascalABC этого, кажется, нет. Короче, это можно заменить вот таким: if y<=n then xz[x,z]:= 1 else xz[x,z]:= 0;
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Текстовая версия | 13.01.2025 10:46 |