ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Тривимірна графіка
         

     

    Інформатика, програмування

    Міністерство освіти України

    Кафедра ПЗ ЕОМ

    ЗВІТ

    Про лабораторної роботи на тему:

    «Тривимірна графіка» з дисципліни «Комп'ютерна графіка»

    Короткі теоретичні відомості.

    Кожна точка простору (крім початкової точки О) може бути заданачетвіркою одночасно не рівних нулю чисел ((x, y, z, 1) або, більш загально,
    (hx, hy, hz, h), де). Ця четвірка визначена однозначно з точністю доспільного множника. Запропонований підхід дає можливість скористатисяматричної записом і в більш складних, тривимірних задачах.

    Як відомо, будь-яке Афінний перетворення в тривимірному просторіможе бути представлено у вигляді суперпозиції обертань розтягувань, відбитківі переносів. Тому досить докладно описати матриці тільки цихостанніх перетворень.

    A. Матриці обертання в просторі.

    Матриця обертання навколо осі абсцис на кут q:

    Матриця обертання навколо осі ординат на кут w:

    Матриця обертання навколо осі апплікат на кут x:

    Б. Матриця розтягування (стискання):

    тут a> 0 - коефіцієнт розтягування (стискання) уздовж осі абсцис, b> 0 --коефіцієнт розтягування (стискання) уздовж осі ординат, y> 0-коефіцієнтрозтягування (стискання) уздовж осі апплікат.

    В. Матриця відображення.

    Матриця відображення відносно площини xOy:

    Матриця відображення щодо площині yOz:

    Матриця відображення відносно площини zOx:

    Г. Матриця перенесення:

    Тут (r, q, v)-вектор переносу.

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

    Ортографіческая проекція - картинна площина збігається з однією з координатних площин або паралельна їй. Матриця проектуванняуздовж осі Х на площину YOZ має вигляд

    У випадку, якщо площину проектування паралельна координатноїплощині, необхідно помножити матрицю [Px] на матрицю зсуву. Маємо

    Аналогічно записуються матриці проектування вздовж 2-хкоординатних осей:

    Аксонометріческая проекція - проектують прямі перпендикулярнікартинній площині.

    Розрізняють три види проекцій залежно від взаємного розташуванняплощині проектування та координатних осей:тріметрія-нормальний вектор картинній площині утворює з ортамікоординатних осей попарно різні кути (рис.15);Діаметр-два кути між нормаллю картинній площині і координатними осямирівні (рис. 16).

    - ізометрія-всі три кути між нормаллю картинній площині ікоординатними осями рівні (рис. 17).

    Кожен із трьох видів зазначених проекцій виходить комбінацієюповоротів, за якою йде паралельне проектування.

    Перспективні (центральні) проекції будуються більш складно.
    Припустимо що центр проектування лежить на осі Z - C (0,0, c) а площинупроектування збігається з координатної площиною XOY (рис. 19).
    Візьмемо в просторі довільну точку M (x, y, z), проведемо через неї іточку С пряму і запишемо її параметричні рівняння. Маємо:

    X `= xt, Y` = yt, Z `= c + (zc) t

    Знайдемо координати точки перетину цієї прямої з площиною XOY.
    З того, що z `= 0, отримуємо

    Той же самий результат ми отримаємо, залучаючи матрицю

    Справді ,

    Mатріца проектування, звичайно, виродилися; матриця жвідповідного перспективного перетворення (без проектування) маєтакий вигляд

    Мова С + + надає дуже зручні засоби, що дозволяють помітноспростити роботу з векторами і перетвореннями в просторі.

    Розглянемо реалізацію роботи з векторами.

    // Файл vector.h
    # ifndef __VECTOR__
    # define __VECTOR__

    # include

    class Vector
    (public: double x, y, z;
    Vector () ();
    Vector (double v) (x = y = z = v;);
    Vector (const Vector & v) (x = vx ; y = vy; z = vz;);
    Vector (double vx, double vy, double vz) (x = vx; y = vy; z = vz;);
    Vector & operator = (const Vector & v ) (x = vx; y = vy; z = vz; return * this;)
    Vector & operator = (double f) (x = y = z = f; return * this;);
    Vector operator -- () const;
    Vector & operator + = (const Vector &);
    Vector & operator -= (const Vector &);
    Vector & operator *= (const Vector &);
    Vector & operator *= (double) ;
    Vector & operator/= (double); friend Vector operator + (const Vector &, const Vector &); friend Vector operator - (const Vector &, const Vector &); friend Vector operator * (const Vector &, const Vector &); friend Vector operator * (double, const Vector &); friend Vector operator * (const Vector &, double); friend Vector operator/(const Vector &, double); friend Vector operator/(const Vector &, const Vector &); friend double operator & (const Vector & u, const Vector & v)

    (return ux * vx + uy * vy + uz * vz;); friend Vector operator ^ (const Vector &, const Vector &); double operator! () (Return (double) sqrt (x * x + y * y + z * z);); double & operator [] (int n) (return * (& x + n);); int operator <(double v) (return x (double v) (return x> v & & y> v & & z> v;);
    );

    class Ray
    (public:
    Vector Org;
    Vector Dir;
    Ray () ();
    Ray (Vector & o, Vector & d) (Org = o, Dir = d;);
    Vector Point (double t) (return Org + Dir * t;);
    );

    inline Vector Vector:: operator - () const
    (Return Vector (-x,-y,-z);
    )

    inline Vector operator + (const Vector & u, const Vector & v)
    (Return Vector (ux + vx, uy + vy, uz + vz);
    )

    inline Vector operator - (const Vector & u, const Vector & v)
    (Return Vector (ux - vx, uy - vy, uz - vz);
    )

    inline Vector operator * (const Vector & u, const Vector & v)
    (Return Vector (ux * vx, uy * vy, uz * vz);
    )

    inline Vector operator * (const Vector & u, double f)
    (Return Vector (ux * f, uy * f, uz * f);
    )

    inline Vector operator * (double f, const Vector & v)
    (Return Vector (f * vx, f * vy, f * vz);
    )

    inline Vector operator/(const Vector & u, const Vector & v)
    (Return Vector (ux/vx, uy/vy, uz/vz);
    )

    inline Vector operator/(const Vector & u, double f)
    (Return Vector (ux/f, uy/f, uz/f);
    )

    inline Vector & Vector:: operator + = (const Vector & v)
    (X + = v.x; y + = v.y; z + = v.z; return * this;
    )

    inline Vector & Vector:: operator -= (const Vector & v)
    (X -= v.x; y -= v.y; z -= v.z; return * this;
    )

    inline Vector & Vector:: operator *= (const Vector & v)
    (X *= v.x; y *= v.y; z *= v.z; return * this;
    )

    inline Vector & Vector:: operator *= (double v)
    (X *= v; y *= v; z *= v; return * this;
    )

    inline Vector & Vector:: operator/= (double v)
    (X/= v; y/= v; z/= v; return * this;
    )

    inline Vector Normalize (Vector & v) (return v /! v;)

    Vector RndVector ();
    Vector & Clip (Vector & v);

    # endif


    -------------------------------------------------- --------------------------

    // Файл vector.срр
    # include
    # include
    # include "vector.h"

    Vector operator ^ (const Vector & u, const Vector & v)
    (Return Vector (uy * vz - uz * vy, uz * vx - ux * vz, ux * vy - uy * vx);
    )

    Vector RndVector ()
    (
    Vector v (rand () - 0.5 * RAND_MAX, rand () - 0.5 * RAND_MAX, rand () - 0.5 * RAND_MAX); return Normalize (v);
    )

    Vector & Clip (Vector & v)
    (If (vx <0.0) vx = 0.0; else if (vx> 1.0) vx = 1.0; if (vy <0.0) vy = 0.0; else if (vy> 1.0) vy = 1.0; if (vz <0.0) vz = 0.0; else if (vz> 1.0) vz = 1.0; return v;
    )

    З цією метою створюється клас Vector, що містить у собі компонентивектора, і для цього класу перевизначаються основні знаки операцій.

    - - унарний мінус і поелементне віднімання векторів;

    + - поелементне додавання векторів;

    * - множення вектора на число;

    * - поелементне множення векторів;

    /- ділення вектора на число;

    /- поелементне розподіл векторів;

    & - скалярний добуток векторів;

    ^ - векторне твір;

    ! - Довжина вектора;

    [] - компонента вектора.

    При цьому стандартні пріоритети операцій зберігаються.

    Крім цих операцій визначаються також деякі прості функції дляроботи з векторами:

    . Normalize - нормування вектора;

    . RndVector - отримання майже рівномірно розподіленого випадкового одиничного вектора;

    . Clip - відсікання вектора.

    З використанням цього класу можна в природному і зручній формізаписувати складні векторні вирази.

    Аналогічним чином вводиться клас Matrix, що служить для представленняматриць перетворень в тривимірному просторі. Для цього класу такожпроводиться перевизначення основних знаків операцій.

    // Файл matrix.h
    # ifndef __MATRIX__
    # define __MATRIX__

    # include "vector.h"

    class Matrix
    (public: double x [4] [4];
    Matrix () ();
    Matrix (double);
    Matrix & operator + = (const Matrix &);
    Matrix & operator -= (const Matrix & );
    Matrix & operator *= (const Matrix &);
    Matrix & operator *= (double);
    Matrix & operator/= (double); void Invert (); void Transpose (); friend Matrix operator + (const Matrix &, const Matrix &); friend Matrix operator - (const Matrix &, const Matrix &); friend Matrix operator * (const Matrix &, double); friend Matrix operator * (const Matrix &, const Matrix &); friend Vector operator * (const Matrix & , const Vector &);
    );

    Matrix Translate (const Vector &);
    Matrix Scale (const Vector &);
    Matrix RotateX (double);
    Matrix RotateY (double);
    Matrix RotateZ (double);
    Matrix Rotate (const Vector &, double);
    Matrix MirrorX ();
    Matrix MirrorY ();
    Matrix MirrorZ ();

    # endif

    //--------------------------- -----------------------------------------------< br>-

    // Файл matrix.cpp
    # include
    # include "matrix.h"

    Matrix:: Matrix (double v)
    (Int j; for (int i = 0; i <4; i + +) for (j = 0; j <4; j + +) x [i] [j] = (i == j)? v: 0.0; x [3] [3] = 1;
    )

    void Matrix:: Invert ()

    (
    Matrix Out (1); for (int i = 0; i <4; i + +) (double d = x [i] [i]; if (d! = 1.0) (for (int j = 0; j <4; j + +) (

    Out.x [i] [j]/= d; x [i] [j]/= d;

    )

    ) for (int j = 0; j <4; j + +) (if (j! = i) (if ( x [j] [i]! = 0.0) (double mulby = x [j] [i]; for (int k = 0; k <4; k + +) (x [j] [k] -= mulby * x [ i] [k];

    Out.x [j] [k] -= mulby * Out.x [i] [k];

    )

    )

    )

    )
    )
    * this = Out;
    )

    void Matrix:: Transpose ()
    (Double t; int j; for (int i = 0; i <4; i + +) for (j = 0; j <4; j + +) if (i! = J) (t = x [i] [j]; x [i] [j] = x [j] [i]; x [j] [i] = t;

    )
    )

    Matrix & Matrix:: operator + = (const Matrix & A)
    (Int j; for (int i = 0; i <4; i + +) for (j = 0; j <4; j + +) x [i] [j] + = Ax [i] [j]; return * this;
    )

    Matrix & Matrix:: operator -= (const Matrix & A)
    (Int j; for (int i = 0; i <4; i + +) for (j = 0; j <4; j + +) x [i] [j] -= Ax [i] [j]; return * this;
    )

    Matrix & Matrix:: operator *= (double v)
    (Int j; for (int i = 0; i <4; i + +) for (j = 0; j <4; j + +) x [i] [j] *= v; return * this;
    )

    Matrix & Matrix:: operator *= (const Matrix & A)
    (
    Matrix res = * this; int j; for (int i = 0; i <4; i + +) for (j = 0; j <4; j + +) (double sum = 0; for (int k = 0 ; k <4; k + +) sum + = res.x [i] [k] * Ax [k] [j]; x [i] [j] = sum;

    ) return * this;
    )

    Matrix operator + (const Matrix & A, const Matrix & B)
    (
    Matrix res; int j; for (int i = 0; i <4; i + +) for (j = 0; j <4; j + +) res.x [i] [j] = Ax [i] [ j] + Bx [i] [j]; return res;
    )

    Matrix operator - (const Matrix & A, const Matrix & B)
    (
    Matrix res; int j; for (int i = 0; i <4; i + +) for (j = 0; j <4; j + +) res.x [i] [j] = Ax [i] [ j] - Bx [i] [j]; return res;
    )

    Matrix operator * (const Matrix & A, const Matrix & B)
    (
    Matrix res; int j; for (int i = 0; i <4; i + +) for (j = 0; j <4; j + +) (double sum = 0; for (int k = 0; k < 4; k + +) sum + = Ax [i] [k] * Bx [k] [j]; res.x [i] [j] = sum;

    ) return res;
    )

    Matrix operator * (const Matrix & A, double v)
    (
    Matrix res; int j; for (int i = 0; i <4; i + +) for (j = 0; j <4; j + +) res.x [i] [j] = Ax [i] [ j] * v; return res;
    )

    Vector operator * (const Matrix & M, const Vector & v)
    (
    Vector res; res.x = vx * Mx [0] [0] + vy * Mx [1] [0] + vz * Mx [2] [0] + Mx
    [3] [0]; res.y = vx * Mx [0] [1] + vy * Mx [1] [1] + vz * Mx [2] [1] + Mx
    [3] [1]; res.z = vx * Mx [0] [2] + vy * Mx [1] [2] + vz * Mx [2] [2] + Mx
    [3] [2]; double denom = vx * Mx [0] [3] + vy * Mx [1] [3] + vz * Mx [2] [3] + Mx [3] [3]; if ( denom! = 1.0) res/= denom; return res;
    )

    Matrix Translate (const Vector & Loc)
    (
    Matrix res (1); res.x [3] [0] = Loc.x; res.x [3] [1] = Loc.y; res.x [3] [2] = Loc. z; return res;
    );

    Matrix Scale (const Vector & v)
    (
    Matrix res (1); res.x [0] [0] = vx; res.x [1] [1] = vy; res.x [2] [2] = vz; return res; < br>);

    Matrix RotateX (double Angle)
    (
    Matrix res (1); double Cosine = cos (Angle); double Sine = sin (Angle); res.x [1] [1] = Cosine; res.x [2] [1] = - Sine ; res.x [1] [2] = Sine; res.x [2] [2] = Cosine; return res;
    );

    Matrix RotateY (double Angle)
    (
    Matrix res (1); double Cosine = cos (Angle); double Sine = sin (Angle); res.x [0] [0] = Cosine; res.x [2] [0] = - Sine ; res.x [0] [2] = Sine; res.x [2] [2] = Cosine; return res;
    );

    Matrix RotateZ (double Angle)
    (
    Matrix res (1); double Cosine = cos (Angle); double Sine = sin (Angle); res.x [0] [0] = Cosine; res.x [1] [0] = - Sine ; res.x [0] [1] = Sine; res.x [1] [1] = Cosine; return res;
    );

    Matrix Rotate (const Vector & axis, double angle)
    (
    Matrix res (1); double Cosine = cos (angle); double Sine = sin (angle); res.x [0] [0] = axis.x * axis.x + (1 - axis.x * axis.x) * Cosine; res.x [0] [1] = axis.x * axis.y * (1 - Cosine) + axis.z * Sine; res.x [0] [2] = axis. x * axis.z * (1 - Cosine) - axis.y * Sine; res.x [0] [3] = 0; res.x [1] [0] = axis.x * axis.y * (1 - Cosine) - axis.z * Sine; res.x [1] [1] = axis.y * axis.y + (1 - axis.y * axis.y) * Cosine; res.x [1] [2 ] = axis.y * axis.z * (1 - Cosine) + axis.x * Sine; res.x [1] [3] = 0; res.x [2] [0] = axis.x * axis. z * (1 - Cosine) + axis.y * Sine; res.x [2] [1] = axis.y * axis.z * (1 - Cosine) - axis.x * Sine; res.x [2] [2] = axis.z * axis.z + (1 - axis.z * axis.z) * Cosine; res.x [2] [3] = 0; res.x [3] [0] = 0; res.x [3] [1] = 0; res.x [3] [2] = 0; res.x [3] [3] = 1; return res;
    );

    Matrix MirrorX ()
    (
    Matrix res (1); res.x [0] [0] = -1; return res;
    );

    Matrix MirrorY ()
    (
    Matrix res (1); res.x [1] [1] = -1; return res;
    );

    Matrix MirrorZ ()
    (
    Matrix res (1); res.x [2] [2] = -1; return res;
    )

    У наступній бібліотеці була реалізована робота з тривимірними об'єктами:гранню, графічним об'єктом і простором. Реалізовані наступніможливості:поворот об'єктів навколо координатних осей;дзеркальне відображення об'єктів по відношенню до координатним осях;центральне і паралельне проектування;масштабування об'єктів;видалення невидимих поверхонь;переміщення об'єктів у просторі.

    // Файл 3dworks.h
    # ifndef __3DWORKS__
    # define __3DWORKS__

    # include
    # include
    # include "vector.h"
    # include "matrix.h"

    # define OneSd 0
    # define TwoSds 1

    # define MaxPoints 10
    # define MaxFacets 10
    # define MaxObjects 10

    class Polygon
    (public: int PointNumber;
    Vector * Point;
    Vector Normal;
    Vector Center; int Color; int TwoSides;
    Polygon () ();
    Polygon (Vector *, int, int , int); void Draw (const Vector &); void Move (const Vector &); void Rotate (double, double, double); void PolyScale (const Vector &); void PolyMirrorX (); void PolyMirrorY (); void PolyMirrorZ ();
    );

    class GrObject
    (public: int FacetNumber;
    Polygon * Facet;
    Vector Coords;
    GrObject () ();
    GrObject (Polygon *, int, const Vector &); void Move (const Vector &); void Rotate (double, double, double); void ObjScale (const Vector &); void ObjMirrorX (); void ObjMirrorY (); void ObjMirrorZ ();
    );

    struct BSPNode
    (
    Polygon * Poly; double d;
    BSPNode * Left;
    BSPNode * Right;
    );

    class Space
    (public: int ObjectNumber;
    GrObject * Object [MaxObjects];
    Space () (ObjectNumber = 0;);
    Space (GrObject *, int); void Add (GrObject *); void Draw (const Vector &);
    );

    int IsVisible (const Polygon &, const Vector &);void DrawBSPTree (BSPNode *, const Vector &);

    # endif

    //---------------------- -------------------------------------------------- -
    -

    // Файл 3dworks.cpp
    # include "3dworks.h"

    // Polygon's methods

    Polygon:: Polygon (Vector * PointArr, int PointNum, int Col, int TS)
    (If (PointNum Tree -> d) (if (Tree -> Right! = NULL) DrawBSPTree (Tree -> Right, PrCntr);

    Tree -> Poly -> Draw (PrCntr); if ( Tree -> Left! = NULL) DrawBSPTree (Tree -> Left, PrCntr);
    ) else (if (Tree -> Left! = NULL) DrawBSPTree (Tree -> Left, PrCntr);

    Tree -> Poly -> Draw (PrCntr); if (Tree -> Right! = NULL) DrawBSPTree (Tree -> Right, PrCntr);
    )
    )

    Далі представлена демонстраційна програма, яка виконує всіперераховані вище операції з тетраедрів.

    // Файл 3dgame.cpp
    # include
    # include
    # include
    # include
    # include
    # include
    # include "3dworks.h"

    void DrawObject (GrObject * Obj, const Vector & v)
    (For (int i = 0; i FacetNumber; i + +) if (IsVisible (Obj-> Facet [i], v)) Obj-> Facet [i]. Draw (v);
    )

    main ()
    (
    Vector Poly1 [3], Poly2 [3], Poly3 [3], Poly4 [3];
    Polygon O [4];
    Vector A (-50, 0, 0),

    B (0, 0, 50),

    C (50, 0, 0),

    D (0, 100, 0),

    PrCenter (0, 0, 1000);

    Poly1 [0] = A; Poly2 [0] = B;
    Poly1 [1] = D; Poly2 [1] = D;
    Poly1 [2] = B; Poly2 [2] = C;

    Poly3 [0] = C; Poly4 [0] = C;
    Poly3 [1] = A; Poly4 [ 1] = D;
    Poly3 [2] = B; Poly4 [2] = A;

    Polygon * P1 = new Polygon (Poly1, 3, 11, OneSd);
    Polygon * P2 = new Polygon (Poly2, 3, 12, OneSd);
    Polygon * P3 = new Polygon (Poly3, 3, 13, OneSd);
    Polygon * P4 = new Polygon (Poly4, 3, 14, OneSd );

    O [0] = * P1; O [1] = * P2;
    O [2] = * P3; O [3] = * P4;

    delete P1; delete P2; delete P3; delete P4;

    GrObject * Obj = new GrObject (O, 4, Vector (0));

    double fi = 0.1, psi = 0.1, step = 0.1; int ch = 0, Page = 3;

    int driver = DETECT, mode, res; initgraph (& driver, & mode, ""); if ((res = graphresult () )! = grOk) (printf ( "nGraphics error:% sn", grapherrormsg (res)); exit (1);
    ) setgraphmode (1);

    DrawObject (Obj, PrCenter);

    do (

    setactivepage (Page% 2); clearviewport (); if (kbhit ())

    (switch (ch = getch ()) ( case '+': Obj-> ObjScale ((1.1,1.1,1.1)); break; case '-': Obj-> ObjScale ((0.9,0.9,0.9)); break; case 'x': Obj-> ObjMirrorX (); break; case 'y': Obj-> ObjMirrorY (); break; case 'z': Obj-> ObjMirrorZ (); break;

    ); if (ch == 0)

    (switch (ch = getch ()) (case 72: fi -= step; break; case 80: fi + = step; break; case 75: psi + = step; break; case 77: psi -= step; break;

    );

    );

    );

    Obj-> Rotate (fi, psi, 0);

    DrawObject (Obj, PrCenter);

    setvisualpage (Page + +% 2); if (fi == 0 & & psi == 0) while (! kbhit ()) ;

    ) while (ch! = 27);

    delete Obj;

    closegraph ();
    )

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status