- Разработать класс Sphere для представления сферы в трехмерном пространстве. Обеспечить следующие методы класса
- Решение
- Русские Блоги
- Примечания к Python OpenGL (25): сфера отрисовки динамического конвейера
- Во-первых, цель
- Во-вторых, результаты работы программы
- В-третьих, формирование сферы
- Четыре, функция glPolygonMode
- Пять, исходный код
- Шесть, справочные материалы
Разработать класс Sphere для представления сферы в трехмерном пространстве. Обеспечить следующие методы класса
Разработать класс Sphere для представления сферы в трехмерном пространстве.
Обеспечить следующие методы класса:
1. конструктор, принимающий 4 действительных числа: радиус, и 3 координаты центра
шара. Если конструктор вызывается без аргументов, создать объект сферы с
единичным радиусом и центром в начале координат. Если конструктор
вызывается с 1 аргументом, создать объект сферы с соответствующим радиусом и
центром в начале координат.
2. метод get_volume (), который возвращает действительное число — объем шара, ограниченной
текущей сферой.
3. метод get_square (), который возвращает действительное число — площадь внешней поверхности
сферы.
4. метод get_radius (), который возвращает действительное число — радиус сферы.
5. метод get_center (), который возвращает тьюпл с 3 действительными числами — координатами
центра сферы в том же порядке, в каком они задаются в конструкторе.
6. метод set_radius (r), который принимает 1 аргумент — действительное число, и меняет радиус
текущей сферы, ничего не возвращая.
7. метод set_center (x, y, z), который принимает 3 аргумента — действительных числа, и меняет
координаты центра сферы, ничего не возвращая. Координаты задаются в том
же порядке, что и в конструкторе.
8. метод is_point_inside (x, y, z), который принимает 3 аргумента — действительных числа —
координаты некоторой точки в пространстве (в том же порядке, что и в конструкторе), и
возвращает логическое значение True или False в зависимости от того, находится ли
эта точка внутри сферы.
Класс: Составить описание класса для объектов-векторов, задаваемых координатами концов в трехмерном пространстве
Не знаю с чего начал, и что брать за основу подскажите? (на с++) Составить описание класса для.
Создать шаблонный класс List. Для этого класса реализовать следующие методы
▪ конструктор по умолчанию; ▪ конструктор копирования; ▪ конструктор перемещения; ▪ деструктор;.
Создать класс для работы со строками. Разработать следующие члены класса:
Создать класс для работы со строками. Разработать следующие члены класса: – поле: string line; –.
Сообщение было отмечено Mariya1758 как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
from math import pi class Sphere: def __init__(self, *arg): if len(arg) == 0: arg = (1, 0, 0, 0) elif len(arg) == 1: arg = (arg[0], 0, 0, 0) else: raise TypeError # raise TypeError("") self.r, self.x, self.y, self.z = arg def get_volume(self): return (self.r ** 3) * pi * 4 / 3 def get_square(self): return (self.r ** 2) * pi * 4 def get_radius(self): return self.r def get_center(self): return (self.x, self.y, self.z) def set_radius(self, r): self.r = r def set_center(self, x, y, z): self.x = x self.y = y self.z = z def is_point_inside(self, x, y, z): return (self.x-x)**2 + (self.y-y)**2 + (self.z-z)**2 self.r**2
Создать класс для работы с датой. Разработать следующие элементы класса
Можно полный код для запуска программы? Создать класс для работы с датой. Разработать следующие.
Составить описание класса для представления даты. Разработать методы установки даты
Задание такое: Составить описание класса для представления даты. Разработать методы установки даты.
Описание класса для объектов-векторов в трехмерном пространстве
Здравствуйте, помогите решить, пожалуйста Составить описание класса для объектов-векторов.
Разработать класс, реализующий следующие методы:
Разработать класс, реализующий следующие методы: 1) Инициализация массива заданной размерности;.
Разработать класс, реализующий следующие методы:
Помогите пожалуйста,Разработать класс, реализующий следующие методы: 1) Инициализация массива.
Создать класс для хранения данных работника Worker. Разработать следующие элементы класса:
Создать класс для хранения данных работника Worker. Разработать следующие элементы класса: 1).
Написать класс для хранения координат в трёхмерном пространстве
Доброго времени суток, прошу помочь с решением задачи. Напишите класс Point3D для хранения.
Русские Блоги
Примечания к Python OpenGL (25): сфера отрисовки динамического конвейера
Во-первых, цель
Во-вторых, результаты работы программы
В-третьих, формирование сферы
1. Разрежьте сферу на 30 частей в поперечном направлении и 30 частей в продольном направлении, всего 900 точек, см. Схему.
2, циклически генерировать пространственные координаты (x, y, z) 900 точек, координаты точки C на сфере
3、 x= R * cos(NumAngleHy) * cos(NumAngleZx)
4、 y = R * sin(NumAngleHy)
5、 z = R * cos(NumAngleHy) * sin(NumAngleZx)
6. Последовательно сохранить 900 точек в буфере вершин,
7. Сохраните последовательные значения индекса трех соседних точек в буфере индекса.
8, вызовите динамический конвейер OpenGL для визуализации.
Четыре, функция glPolygonMode
Функция: используется для управления отображением полигонов.
glPolygonMode — это функция, прототип: void glPolygonMode (лицо GLenum, режим GLenum);
- Параметр face определяет, к каким частям объекта будет применяться режим отображения, и управляет режимом рисования передней и задней части многоугольника:
GL_FRONT указывает, что режим отображения будет применен к лицевой стороне объекта (то есть к лицу, которое объект может видеть)
GL_BACK означает, что режим отображения будет применен к задней поверхности объекта (то есть к поверхности, которую нельзя увидеть на объекте).
GL_FRONT_AND_BACK означает, что режим отображения будет применен ко всем граням объекта. - Параметр mode определяет способ отображения поверхности выбранного объекта (режим отображения):
GL_POINT означает отображение вершин, полигоны отображаются в точках
GL_LINE означает отображение сегментов линии, а многоугольники отображаются в виде контуров.
GL_FILL представляет поверхность отображения, а многоугольник заполнен
Пять, исходный код
""" Название программы: GL_DrawSphere01.py Программирование: dalong10 Функция: рисовать сферу Справочные материалы: """ import myGL_Funcs #Common OpenGL utilities,see myGL_Funcs.py import sys, random, math import OpenGL from OpenGL.GL import * from OpenGL.GL.shaders import * import numpy import numpy as np import glfw strVS = """ #version 330 core layout(location = 0) in vec3 position; uniform mat4 uMVMatrix; uniform mat4 uPMatrix; uniform float a; uniform float b; uniform float c; uniform float Rx; uniform float Ry; uniform float Rz; uniform float theta1; void main() < mat4 rot1=mat4(vec4(1.0, 0.0,0.0,0), vec4(0.0, 1.0,0.0,0), vec4(0.0,0.0,1.0,0.0), vec4(a,b,c,1.0)); mat4 rot3=mat4( vec4(cos(theta1)+Rx*Rx*(1-cos(theta1)), Rx*Ry*(1-cos(theta1))-Rz*sin(theta1), Rx*Rz*(1-cos(theta1))+Ry*sin(theta1), 0), vec4(Rx*Ry*(1-cos(theta1))+Rz*sin(theta1),cos(theta1)+Ry*Ry*(1-cos(theta1)),Ry*Rz*(1-cos(theta1))-Rx*sin(theta1),0), vec4(Rx*Rz*(1-cos(theta1))-Ry*sin(theta1),Ry*Rz*(1-cos(theta1))+Rx*sin(theta1),cos(theta1)+Rz*Rz*(1-cos(theta1)), 0.0), vec4(0.0, 0.0,0.0, 1.0)); gl_Position=uPMatrix * uMVMatrix* rot1 *rot3 *vec4(position.x, position.y, position.z, 1.0); >""" strFS = """ #version 330 core out vec3 color; void main() < color = vec3(0,1,1); >""" VIEW = np.array ([- 0.8, 0.8, -0.8, 0.8, 1.0, 20.0]) # Левая / правая / нижняя / верхняя / ближняя / дальняя шесть сторон просматриваемого объема SCALE_K = np.array ([1.0, 1.0, 1.0]) # Масштабирование модели cameraPos = np.array ([0.0, 0.0, 1.2]) # Положение глаз (положительное направление оси Z по умолчанию) cameraFront = np.array ([0.0, 0.0, 0.0]) # Контрольная точка направления прицеливания (по умолчанию - начало координат) cameraUp = np.array ([0.0, 1.0, 0.0]) # Определить верхнюю сторону для наблюдателя (по умолчанию положительное направление оси Y) WIN_W, WIN_H = 640, 480 # Переменные для сохранения ширины и высоты окна class FirstSphere: def __init__(self, cube_verticeside ,indices): # load shaders self.program = myGL_Funcs.loadShaders(strVS, strFS) glUseProgram(self.program) self.vertIndex = glGetAttribLocation(self.program, b"position") cube_vertices = cube_verticeside self.indices = indices # set up vertex array object (VAO) self.vao = glGenVertexArrays(1) glBindVertexArray(self.vao) # set up VBOs vertexData = numpy.array(cube_vertices, numpy.float32) self.vertexBuffer = glGenBuffers(1) glBindBuffer(GL_ARRAY_BUFFER, self.vertexBuffer) glBufferData(GL_ARRAY_BUFFER, 4*len(vertexData), vertexData, GL_STATIC_DRAW) # set up EBOs indiceData = numpy.array(indices, numpy.int32) self.eboID = glGenBuffers(1) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,self.eboID) glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 *len(indiceData), indiceData, GL_STATIC_DRAW) # enable arrays glEnableVertexAttribArray(self.vertIndex) # Position attribute glBindBuffer(GL_ARRAY_BUFFER, self.vertexBuffer) glVertexAttribPointer(self.vertIndex, 3, GL_FLOAT, GL_FALSE, 0,None) # unbind VAO glBindVertexArray(0) glBindBuffer(GL_ARRAY_BUFFER, 0) def render(self, xx, yy, zz, Rx,Ry,Rz,r1,pMatrix,mvMatrix): # use shader glUseProgram(self.program) # set proj matrix glUniformMatrix4fv(glGetUniformLocation(self.program, 'uPMatrix'), 1, GL_FALSE, pMatrix) # set modelview matrix glUniformMatrix4fv(glGetUniformLocation(self.program, 'uMVMatrix'), 1, GL_FALSE, mvMatrix) glUniform1f(glGetUniformLocation(self.program, "a"), xx) glUniform1f(glGetUniformLocation(self.program, "b"), yy) glUniform1f(glGetUniformLocation(self.program, "c"), zz) glUniform1f(glGetUniformLocation(self.program, "Rx"), Rx) glUniform1f(glGetUniformLocation(self.program, "Ry"), Ry) glUniform1f(glGetUniformLocation(self.program, "Rz"), Rz) theta1 = r1*PI/180.0 glUniform1f(glGetUniformLocation(self.program, "theta1"), theta1) # bind VAO glBindVertexArray(self.vao) # draw glDrawElements(GL_TRIANGLES, self.indices.size, GL_UNSIGNED_INT, None) # unbind VAO glBindVertexArray(0) def drawglobeVBO(): PI = 3.14159265358979323846264 statcky = 30 # Сколько ломтиков нарезано по горизонтали stlicex = 30 # Сколько ломтиков разрезать продольно R = 1.0 # радиус angleHy = (2 * PI) / statcky # Вычислить значение радиана для каждого угла горизонтали. angleZx = (2 * PI) / stlicex; # Вычислить значение каждого вертикального угла в радианах NumAngleHy = 0.0 # текущий горизонтальный угол NumAngleZx = 0.0 # текущий продольный угол x=0.0 y=0.0 z=0.0 c=numpy.array([], numpy.float32) for j in range(statcky): for i in range(stlicex): NumAngleHy = angleHy*i # NumAngleZx = angleZx * j # Начальная точка - это направление, в котором указывает ось. Выбирайте рулевое управление по правилу правой руки, если рулевое управление одинаковое, то подходят два x = R*np.cos(NumAngleHy)*np.cos(NumAngleZx) y = R*np.sin(NumAngleHy) z = R*np.cos(NumAngleHy)*np.sin(NumAngleZx) c=np.hstack((c,numpy.array([x,y,z], numpy.float32) )) return c def drawglobeEBO(): PI = 3.14159265358979323846264 statcky = 30 # Сколько ломтиков нарезано по горизонтали stlicex = 30 # Сколько ломтиков разрезать продольно vbo = drawglobeVBO() only = vbo.size num = (int)((only/(3*statcky))*2) ebo=numpy.array([], numpy.int) for x in range(int(stlicex/2)): for y in range(statcky): ebo=np.hstack((ebo,numpy.array([y+x*stlicex,y+x*stlicex+1,y+x*stlicex+stlicex,y+x*stlicex+stlicex+1,y+x*stlicex+stlicex,y+x*stlicex+1]))) return ebo #Is called whenever a key is pressed/released via GLFW def on_key(window, key, scancode, action, mods): if key == glfw.KEY_ESCAPE and action == glfw.PRESS: glfw.set_window_should_close(window,1) if __name__ == '__main__': import sys import glfw import OpenGL.GL as gl keys=numpy.zeros(1024) deltaTime = 0.0 lastFrame = 0.0 # Time of last frame # Initialize the library if not glfw.init(): sys.exit() # Create a windowed mode window and its OpenGL context window = glfw.create_window(640, 480, "GL_DrawSphere01 ", None, None) if not window: glfw.terminate() sys.exit() # Make the window's context current glfw.make_context_current(window) # Install a key handler glfw.set_key_callback(window, on_key) PI = 3.14159265358979323846264 # Нарисуйте сферу vert = drawglobeVBO() ind = drawglobeEBO() # Loop until the user closes the window a=0 firstSphere1 = FirstSphere(vert,ind) while not glfw.window_should_close(window): currentFrame = glfw.get_time() deltaTime = currentFrame - lastFrame lastFrame = currentFrame # Render here width, height = glfw.get_framebuffer_size(window) WIN_W, WIN_H =width, height ratio = width / float(height) glfw.poll_events() gl.glViewport(0, 0, width, height) gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); # Используется для управления режимом отображения многоугольника gl.glMatrixMode(gl.GL_PROJECTION) gl.glLoadIdentity() gl.glOrtho(-ratio, ratio, -1, 1, 1, -1) gl.glMatrixMode(gl.GL_MODELVIEW) gl.glLoadIdentity() gl.glClearColor(0.0,0.1,0.1,1.0) # modelview matrix mvMatrix = myGL_Funcs.lookAt (cameraPos, cameraFront, cameraUp) # установить точку обзора if WIN_W > WIN_H: zLeft=VIEW[0] * WIN_W / WIN_H zRight=VIEW[1] * WIN_W / WIN_H zBottom=VIEW[2] zTop=VIEW[3] zNear=VIEW[4] zFar=VIEW[5] else: zLeft=VIEW[0] zRight=VIEW[1] zBottom=VIEW[2] * WIN_H / WIN_W zTop=VIEW[3] * WIN_H / WIN_W zNear=VIEW[4] zFar=VIEW[5] pMatrix =myGL_Funcs.perspective(zLeft,zRight,zTop,zBottom, zNear, zFar) firstSphere1.render (0, 0, 0, 0, 1,1, a, pMatrix, mvMatrix) # # a=a+1 # if a>360: # a=0 # Swap front and back buffers glfw.swap_buffers(window) # Poll for and process events glfw.poll_events() glfw.terminate()