Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Коссак графіка.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

View(3);

s = surface(L, 'EdgeColor' , 'none', 'FaceColor' , [1 0 0], ...

'FaceLighting', 'phong', 'AmbientStrength', 0.3, ...

'DiffuseStrength', 0.6, 'Clipping', 'off ', ...

'BackFaceLighting', 'lit', 'SpecularStrength', 1.1, ...

'SpecularColorReflectance', 1 , 'SpecularExponent', 7);

t = hgtransform('Parent', w);

set(s, 'Parent',t);

Rz = makehgtform('yrotate', pi/2);

set(t, 'Matrix', Rz);

hold on

s = surface(L, 'EdgeColor' , 'none', 'FaceColor' , [0 1 0], ...

'FaceLighting', 'phong', 'AmbientStrength', 0.3, ...

'DiffuseStrength', 0.6, 'Clipping', 'off ', ...

'BackFaceLighting', 'lit', 'SpecularStrength', 1.1, ...

'SpecularColorReflectance', 1 , 'SpecularExponent', 7);

Рис. 5.17. Вихідне положення - зверху, результат – внизу.

У разі використання симетрії, виділений у рамці оператор буде замінений відповідною матрицею. Перед утворенням об’єкта необхідно помістити рисунок в змінну S, в іншому випадку не отримаємо потрібного результату. Якщо вже маємо один графік, то його треба перемістити в ту саму змінну і це можна зробити так:

vertex = [0 1 1 0 0 0 1 1;

0 0 1 1 1 0 0 1;

0 0 0 0 1 1 1 1];

facesm = [1 2 3 4;5 6 7 8;3 4 5 8;1 2 7 6;2 3 8 7;1 4 5 6];

hold on

h(1)= patch('Vertices',vertex','Faces',facesm,'FaceVertexCData',...

[0 0 1],'FaceColor','flat')

h(2)= plot3([0,0],[0,1],[1.8 1.8]);

Якщо цікавлять двовимірні об’єкти, які хочемо утворити за допомогою команд hgtransform і makehgtform, то в цьому випадку треба уявляти, що працюєте в тривимірному просторі. Наприклад, у разі потреби перенести якусь точку в іншу з координатами (x, y) її треба перенести в точку з координатами (x, y,0). Якщо передбачено поворот, то це буде поворот навкола осі z.

Перетворення осей. Команда makehgtform обчислює таблиці геометричних перетворень. Підсумком команди makehgtform є відповідні таблиці перетворення осей. Навіть якщо використовувати перетворення осей або геометричні перетворення, то остаточний результат (матриця перетворень) повинен бути той самий.

5.3.2. Проекції тривимірного простору в

Розглянемо площинні проекції та з їхнє використанням в Matlab Ці проекції можна розділити на дві головні категорії. До першої належать центральні проекції, в яких відстань від центру проекції до проекційної площини є скінченою, до другої – паралельні проекції, у яких відстань від центра проектування до площини проектування нескінченна.

Ці категорії повинні задовольняти такі властивості:

  • лінії після перетворення переходять у лінії;

  • відстань загалом змінюються;

  • паралельні лінії перестають бути паралельними після проектування, вони перетинаються в певних точках збіжності.

  • кути між лініями не змінюються, якщо задана площина паралельна до площини проектування.

Центральна проекція. Вважаємо, що проекційною площиною може бути екран комп’ютера, на якому треба відобразити нескінченну кількість точок тривимірного об’єкта. Для цього можна використати лінійну апроксимацію об’єктів у тривимірному просторі за допомогою відрізків прямих та плоских багатокутників. У цьому випадку, як зазначено вище, прямі після перспективного перетворення переходять у прямі на проекційній площині. Завдяки цій властивості центральної перспективи можна проектувати (обчислювати) лише для граничні точки відрізків, а потім з’єднувати проекції точок лініями вже на проекційній площині.

Розглянемо точку , що розміщена за проекційною площиною на відстані , і її проекцію на екран . Розташуємо спостерігача в точці , що на осі на відстані від екрана (проекційної площини) з координатами . Нехай координати точки на екрані є .

У цьому випадку перетворення не є лінійними, тому для використання їх у Matlab буде застосуємо таку матрицю:

така, що ,

де (x,y,z) координати точки на площині xOy. Нам залишається лише нормалізувати вектор, унаслідок чого отримаємо

.

Для цього треба виконати такі кроки:

  • перемістити центр проекції на вісь z;

  • обернути об’єкт, так, щоб споглядання відбувалось з xy;

  • застосувати матрицю перетворень для центральної проекції.

Паралельні проекції. Такі проекції поділяють на дві великі категорії – ортогональні та косокутні. Розглянемо визначення косокутних проекцій. Для цього використаємо теорію. Маємо матрицю перетворень, яка передбачає проекцію на площину xy.

,

а координати точок проекції задають рівняннями

.

Таблицю для ортогональних проекцій обчислюють при d = 0.

Проекції в MATLAB. Найпростіший шлях для побудови проекцій у Matlab – це шлях за якому ми зберігаємо дві матриці, одна з яких є матрицею проекції, а друга – матрицею, яка містить координати об’єкта, який маємо намір перетворювати. Недоліками цього підходу – утруднена побудова другої матриці, що апотребує великих затрат пам’яті. Для того, щоб оминути ці труднощі, можна використати програму, про яку згадано у розділі про перетворення. У випадку попередньо запропонованого методу, можна застосувати команду hgtransform без виклику програми про побудову проекцій матриць, як це робили за допомогою команди makehgtform під час перетворень. Отже, ми постійно повинні створювати нову функцію, яка будує потрібні нам матриці. Функція, яку використовують для побудови паралельних проекцій, може мати такий вигляд

function M = par_proj(a,fi)

d = 1/tan(a);

M = [1 0 d * cos(fi) 0;

0 1 d * sin(fi) 0;

0 0 0 0;

0 0 0 1];

Ця функція вхідними параметрами має два кути фігури і (fi) (обидва в радіанах). Отже, для створення проекції Кабіне одиничного кубу (рис. 5.18) на площині xy, можна використати результати наступного М-файлу. На рис.5.19 зображено результат вищенаведеної програми.

ax = axes;

x = [0 1 1 0 0 0 1 1 0 0 1 1 1 1 0 0];

y = [0 0 1 1 0 0 0 1 1 0 0 0 1 1 1 1];

z = [0 0 0 0 0 1 1 1 1 1 1 0 0 1 1 0];

h=plot3(x,y,z);

t = hgtransform('Parent',ax);

set(h,'Parent',t);

M = par_proj(63*pi/180,pi/6);

set(t,'Matrix',M);