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

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

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

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

Как я понял, пункты 1-3 относятся к тому, как занести тело в трехмерный массив. Это - отдельная задача, и она может оказаться намного сложнее, чем рисовать проекцию. Все зависит от того, как поджодить к интерфейсу. Но даже в простейщем варианте она ненамного проще проецирования. Но в том условии, которое ты написал, она просто не стоит. То есть трехмерный массив нужно промто считать заданным. Я не прав?
Merhaba
Цитата(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; { Трехмерный массив }
Lapp
Цитата(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;

Ты можешь написать непосредственно три таких куска (меняя только массивы, представляющие плоскость, и индексы). Если хочешь реализовать, как функцию (для большего кпд кода), то нужно будет немного поменять архитектуру данных (либо вставить выбор непосредственно в цикл, что не есть хорошо и красиво).
Merhaba
Цитата(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)" означает?
Lapp
Цитата(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;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.