Компьютерная графика

Автор: Пользователь скрыл имя, 02 Апреля 2012 в 11:32, контрольная работа

Краткое описание

Компьютерная графика, решение алгоритмов.

Файлы: 1 файл

контр графика пример.doc

— 596.50 Кб (Скачать)

End If

'отображение на экране 2 грани

If gran2 = True Then

RGBcolor = 11

Call четырехугольникXYZ(xa1, ya1, za1, xa, ya, za, xd, yd, zd, xd1, yd1, zd1)

End If

'отображение на экране 3 грани

If gran3 = True Then

RGBcolor = 10

Call четырехугольникXYZ(xd, yd, zd, xd1, yd1, zd1, xc1, yc1, zc1, xc, yc, zc)

End If

'отображение на экране 4 грани

If gran4 = True Then

RGBcolor = 8

Call четырехугольникXYZ(xa1, ya1, za1, xa, ya, za, xb, yb, zb, xb1, yb1, zb1)

End If

'отображение на экране 5 грани

If gran5 = True Then

RGBcolor = 9

Call четырехугольникXYZ(xa2, ya2, za2, xb2, yb2, zb2, xc2, yc2, zc2, xd2, yd2, zd2)

End If

If gran6 = True Then

RGBcolor = 6

Call четырехугольникXYZ(xa, ya, za, xb, yb, zb, xc, yc, zc, xd, yd, zd)

End If

If gran7 = True Then

RGBcolor = 6

Call четырехугольникXYZ(xb1, yb1, zb1, xc1, yc1, zc1, xc2, yc2, zc2, xb2, yb2, zb2)

End If

'отображение на экране 8 грани

If gran8 = True Then

RGBcolor = 7

Call четырехугольникXYZ(xa1, ya1, za1, xa2, ya2, za2, xd2, yd2, zd2, xd1, yd1, zd1)

End If

'отображение на экране 9 грани

If gran9 = True Then

RGBcolor = 15

Call четырехугольникXYZ(xd1, yd1, zd1, xd2, yd2, zd2, xc2, yc2, zc2, xc1, yc1, zc1)

End If

'отображение на экране 10 грани

If gran10 = True Then

RGBcolor = 10

Call четырехугольникXYZ(xa2, ya2, za2, xa1, ya1, za1, xb1, yb1, zb1, xb2, yb2, zb2)

End If

End Sub

 

результат:


Алгоритм №2

 

Пересечения фигуры  и куба.

 

 

 

В первой функции отчистим экран от прежних значений и заполним его значениями фона 10000. Указываем координаты точки А и длину, высоту и ширину фигуры.

Вызов функции Zvoksel, с  передачей в нее координаты дальней точки и длины, высоты и ширины.

Sub Z()

Worksheets("экран").Range("A1:iv200").Interior.ColorIndex = xlNone

'очистка буфера кадра

Worksheets("кадр").Range("A1:iv200").ClearContents

'заполнение Z буфера фоновым значением

For x = 1 To 200

    For y = 1 To 200

    Worksheets("zbyf").Cells(y, x) = 10000

    Next y

Next x

Worksheets("кадр").Range("A1:iv200").ClearContents

RGBcolor = 8

Call Zvoksel(0, 0, 0, 40, 40, 40)

Call экран_буфер_кадра(50, 200, 50, 200)

End Sub

 

В функци Zvoksel определяем координаты всех точек относительно точки А, и передаем их в следующую функцию Zшестигранник

Sub Zvoksel(xa, ya, za, dlina, shirina, vusota)

 

xb = xa + dlina: yb = ya: zb = za

xc = xb: yc = ya + shirina: zc = za

xd = xa: yd = ya + shirina: zd = za

xa1 = xa + 10: ya1 = ya + 10: za1 = za + vusota

xb1 = xb - 10: yb1 = yb + 10: zb1 = zb + vusota

xc1 = xc - 10: yc1 = yc - 10: zc1 = zc + vusota

xd1 = xd + 10: yd1 = yd - 10: zd1 = zd + vusota

xa2 = xa: ya2 = ya: za2 = za - 20

xb2 = xb: yb2 = yb: zb2 = zb - 20

xc2 = xc: yc2 = yc: zc2 = zc - 20

xd2 = xd: yd2 = yd: zd2 = zd - 20

Call Zшестигранник(xa, ya, za, xb, yb, zb, xc, yc, zc, xd, yd, zd, _

xa1, ya1, za1, xb1, yb1, zb1, xc1, yc1, zc1, xd1, yd1, zd1, _

xa2, ya2, za2, xb2, yb2, zb2, xc2, yc2, zc2, xd2, yd2, zd2)

End Sub

В функции Zшестигранник определяем грани и передаем их вершины в функции рисования граней, в зависимости от положения грани.

Sub Zшестигранник(xa, ya, za, xb, yb, zb, xc, yc, zc, xd, yd, zd, _

xa1, ya1, za1, xb1, yb1, zb1, xc1, yc1, zc1, xd1, yd1, zd1, _

xa2, ya2, za2, xb2, yb2, zb2, xc2, yc2, zc2, xd2, yd2, zd2)

Call Z_четырехугольник(xa, ya, za, xb, yb, zb, xb2, yb2, zb2, xa2, ya2, za2)

RGBcolor = 1

Call Z_четырехугольник(xb, yb, zb, xb2, yb2, zb2, xc2, yc2, zc2, xc, yc, zc)

RGBcolor = 8

Call Z_четырехугольник(xc2, yc2, zc2, xc, yc, zc, xd, yd, zd, xd2, yd2, zd2)

RGBcolor = 3

Call Z_четырехугольник(xa2, ya2, za2, xb2, yb2, zb2, xc2, yc2, zc2, xd2, yd2, zd2)

RGBcolor = 6

Call Z_четырехугольник(xd, yd, zd, xd2, yd2, zd2, xa2, ya2, za2, xa, ya, za)

RGBcolor = 14

Call Z_четырехугольник(xa1, ya1, za1, xb1, yb1, zb1, xc1, yc1, zc1, xd1, yd1, zd1)

RGBcolor = 18

Call Z_четырехугольник1(xa, ya, za, xa1, ya1, za1, xd1, yd1, zd1, xd, yd, zd)

RGBcolor = 19

Call Z_четырехугольник2(xd, yd, zd, xd1, yd1, zd1, xc1, yc1, zc1, xc, yc, zc)

RGBcolor = 20

Call Z_четырехугольник3(xa1, ya1, za1, xa, ya, za, xb, yb, zb, xb1, yb1, zb1)

RGBcolor = 5

Call Z_четырехугольник4(xc1, yc1, zc1, xb1, yb1, zb1, xb, yb, zb, xc, yc, zc)

RGBcolor = 2

End Sub

 

Пример функции рисования наклонной грани:

Sub Z_четырехугольник2(xa, ya, za, xb, yb, zb, _

xc, yc, zc, xd, yd, zd)

Xnabl = 200

Ynabl = 200

Znabl = 0

   For x = xa To xd Step 1

        For y = ya To ya - 10 Step -0.1

        If y >= 40 - x And y >= x Then

         z = (0 * x + 0.025 * y - 1) / (-0.00625) 'Функция плоскости

         Call QQQ(x, y, z)

        End If

        Next y

    Next x

End Sub

Sub QQQ(x, y, z)

        Call XYZ(x, y, z, X_zbyf, Y_zbyf)

'        определяем квадрат расстояние от рассматриваемой точки до наблюдателя

     Rnabl = ((Xnabl - x) ^ 2 + (Ynabl - y) ^ 2 + (Znabl - z) ^ 2) ^ 0.5

'        извлекаем данные о значении координаты Y в Z буфере

        Zbyf = Worksheets("zbyf").Cells(Y_zbyf, X_zbyf)

'        если новое значение ближе к наблюдателю то заменняем значение в

'        z буфере и в буфере кадра

    If Rnabl < Zbyf Then

        Worksheets("zbyf").Cells(Y_zbyf, X_zbyf) = Rnabl

        Worksheets("кадр").Cells(Y_zbyf, X_zbyf) = RGBcolor

    End If

End Sub

 

Сканируем каждый пиксель каждой грани трехмерной фигуры.

Для граней организуем 2 два цикла по осям ox и oy или oz, по оси оу или oz вводим ограничения прямыми, проекциями отрезков ребер наклонной грани на плоскости.  Значения оставшейся координаты будем вычислять из функции плоскости.

ax+by+cz+d=0

Определяем координаты данной точки  на листах «экран» «кадр» и  «zbyf». Естественно, что вся информация о пикселах на экране храниться в ячейках с тем же именем на листах «кадр» и  «zbyf».

        Call XYZ(x, y, za, X_zbyf, Y_zbyf)

Определяем расстояние от рассматриваемой точки до наблюдателя.

     Rnabl = ((Xnabl - x) ^ 2 + (Ynabl - y) ^ 2 + (Znabl - z) ^ 2) ^ 0.5

Извлекаем данные о значении расстояния до наблюдателя точки с координатами  X_zbyf, Y_zbyf в Z буфере. Напомни, что на первых шагах, извлекаемые значения Zbyf=1000.

        Zbyf = Worksheets("zbyf").Cells(Y_zbyf, X_zbyf)

Производим сравнение, если новое значение Rnabl меньше, чем значение в z буфере, значит данная точка ближе к наблюдателю и закрывает от него предыдущую. Новое значение переменной Rnabl заносим на лист «zbyf».

    If Rnabl < Zbyf Then

        Worksheets("zbyf").Cells(Y_zbyf, X_zbyf) = Rnabl

Одновременно с изменением значения свойств пиксела на листе «zbyf» происходит изменение и на листе "кадр". В данном случае на этот лист заноситься значение индекса цвета грани параллелепипеда. Вид данного листа приведено ниже.

        Worksheets("кадр").Cells(Y_zbyf, X_zbyf) = RGBcolor

    End If

        Next x

    Next y

Лист zbyf

 

Лист экран

 



Информация о работе Компьютерная графика