Автор: Пользователь скрыл имя, 02 Апреля 2012 в 11:32, контрольная работа
Компьютерная графика, решение алгоритмов.
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:
'очистка буфера кадра
Worksheets("кадр").Range("A1:
'заполнение Z буфера фоновым значением
For x = 1 To 200
For y = 1 To 200
Worksheets("zbyf").Cells(y, x) = 10000
Next y
Next x
Worksheets("кадр").Range("A1:
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_
' если новое значение ближе к наблюдателю то заменняем значение в
' z буфере и в буфере кадра
If Rnabl < Zbyf Then
Worksheets("zbyf").Cells(Y_
Worksheets("кадр").Cells(Y_
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_zby
Производим сравнение, если новое значение Rnabl меньше, чем значение в z буфере, значит данная точка ближе к наблюдателю и закрывает от него предыдущую. Новое значение переменной Rnabl заносим на лист «zbyf».
If Rnabl < Zbyf Then
Worksheets("zbyf").Cells(Y_
Одновременно с изменением значения свойств пиксела на листе «zbyf» происходит изменение и на листе "кадр". В данном случае на этот лист заноситься значение индекса цвета грани параллелепипеда. Вид данного листа приведено ниже.
Worksheets("кадр").Cells(Y_
End If
Next x
Next y
Лист zbyf
Лист экран