IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Проекция массива
Merhaba
сообщение 1.05.2011 21:34
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Мужской

Репутация: -  0  +


Добрый Вечер!!!
Помогите Пожалуйста решить задачу:
В трехмерном массиве размерностью m*n*l , состоящим из нулей и единиц, хранится изображение(сеточное)некоторого трехмерного тела. Получить двумерный массив - его проекцию(тень) на любое выбранное направление.

Я думаю, что:
1. В 3D координатах рисуем кубик, представляющий исхдный массив (если размерности не равны, то кубик кубиком уже не будет, но это к делу не относится).
2. Рисуем плоскость проекции.
3. Разбиваем плоскость на "пиксели", соответствующие элементам получаемого массива-проекции, т.е. на квадратики.
4. Проецируем на плоскость все элементы массива. Если в любую точку "пикселя" падает проекция хоть одной единицы - элементу массива-проекции присваиваем единицу. Если только нули - ноль.

Помогите Пожалуйста написать код)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 2.05.2011 3:59
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Merhaba @ 1.05.2011 22:34) *
Помогите Пожалуйста написать код)

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

Как я понял, пункты 1-3 относятся к тому, как занести тело в трехмерный массив. Это - отдельная задача, и она может оказаться намного сложнее, чем рисовать проекцию. Все зависит от того, как поджодить к интерфейсу. Но даже в простейщем варианте она ненамного проще проецирования. Но в том условии, которое ты написал, она просто не стоит. То есть трехмерный массив нужно промто считать заданным. Я не прав?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Merhaba
сообщение 2.05.2011 12:02
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Мужской

Репутация: -  0  +


Цитата(Lapp @ 2.05.2011 4:59) *

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

Как я понял, пункты 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 - 2.05.2011 12:14
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 3.05.2011 9:03
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Merhaba @ 2.05.2011 12:02) *
Перед этим нужно запросить у пользователя n.
Организовать три цикла по заполнению массива с помощью генератора целых чисел в диапозоне: 0..1
С этим сам справишься? Только одно НО: нельзя запрашивать у пользователя 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;

Ты можешь написать непосредственно три таких куска (меняя только массивы, представляющие плоскость, и индексы). Если хочешь реализовать, как функцию (для большего кпд кода), то нужно будет немного поменять архитектуру данных (либо вставить выбор непосредственно в цикл, что не есть хорошо и красиво).


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Merhaba
сообщение 4.05.2011 21:14
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 57
Пол: Мужской

Репутация: -  0  +


Цитата(Lapp @ 3.05.2011 10:03) *

С этим сам справишься? Только одно НО: нельзя запрашивать у пользователя 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)" означает?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 4.05.2011 23:36
Сообщение #6


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Merhaba @ 4.05.2011 22:14) *
Скажите Пожалуйста, а что " 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;


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 30.05.2024 6:02
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"