def get_cor_face(self, face_int, pi, direcao_olho): """Retorna a cor RGB num ponto de uma face triangular resultante da soma das contribuições de todas as luzes em cena mesmo quando o ponto está em sombra (de uma ou mais luzes). """ resultado_cor = CorRGB(0.0, 0.0, 0.0) for luz in self.lista_luzes: raio_luz = Reta(pi, luz.posicao) sombra, _, t, _ = self.get_face_intercetada_mais_proxima(raio_luz) direcao_luz = raio_luz.vetor_diretor vetor_normal = face_int.normal resultado_cor += face_int.get_cor_phong().get_cor_rgb(luz, direcao_luz, vetor_normal, direcao_olho, sombra) return resultado_cor
def __init__(self, numero_linhas, numero_colunas): """Cria uma imagem com todos os pixels inicilaizados preto. Armazena o número de linhas e de colunas nos atributos "numero_linhas" e "numero_colunas", respectivamente. Inicializa o atributos "linhas" com as linhas de imagem com as dimensões especificadas e com todos os pixels a preto. """ self.numero_linhas = numero_linhas self.numero_colunas = numero_colunas self.linhas = [] for m in range(numero_linhas): linha = [] for n in range(numero_colunas): linha.append(CorRGB(0.0, 0.0, 0.0)) self.linhas.append(linha)
ficheiro.close() # testes if __name__ == "__main__": # teste ao construtor imagem1 = Imagem(5, 5) # teste a __str__ imagem2 = Imagem(5, 5) print(imagem2) # teste a set_cor imagem3 = Imagem(5, 5) branco = CorRGB(1.0, 1.0, 1.0) imagem3.set_cor(3, 3, branco) # print(imagem3) # testes a get_cor imagem4 = Imagem(5, 5) branco = CorRGB(1.0, 1.0, 1.0) imagem4.set_cor(3, 3, branco) # print(imagem4.get_cor(3, 3)) # print(imagem4.get_cor(5, 5)) # teste a guardar_como_ppm imagem5 = Imagem(3, 5) red = CorRGB(1.0, 0.0, 0.0) green = CorRGB(0.0, 1.0, 0.0) blue = CorRGB(0.0, 0.0, 1.0)
if not interceta_face: return self.cor_fundo direcao_olho = raio.vetor_diretor cor_face = self.get_cor_face(face_int, pi, direcao_olho) return cor_face # testes if __name__ == "__main__": # teste ao construtor # teste ao construtor - cor da face verde = CorRGB(0.0, 0.3, 0.0) brilho = 100.0 cor = CorPhong(verde, verde, verde, brilho) # teste ao construtor - face p1 = Ponto3D(0.0, 0.0, 0.0) p2 = Ponto3D(1.0, 0.0, 0.0) p3 = Ponto3D(0.0, 1.0, 0.0) face = FaceTriangular(p1, p2, p3, cor) lista_faces = [face] # teste ao construtor - luz branco = CorRGB(1.0, 1.0, 1.0) luz_posicao = Ponto3D(1.0, 0.0, 2.0) luz = Luz(luz_posicao, branco, branco, branco) lista_luzes = [luz] # teste ao construtor - camara camara_posicao = Ponto3D(0.0, 0.0, 2.0)
str(self.cor_phong) + ")") def get_cor_phong(self): """Retorna a cor Phong da face triangular.""" return self.cor_phong # testes if __name__ == "__main__": # teste ao construtor a = Ponto3D(0.0, 0.0, 0.0) b = Ponto3D(1.0, 0.0, 0.0) c = Ponto3D(0.0, 1.0, 0.0) k_ambiente = CorRGB(0.0, 0.0, 0.1) k_difusa = CorRGB(0.0, 0.0, 0.75) k_especular = CorRGB(1.0, 1.0, 1.0) brilho = 100.0 cor = CorPhong(k_ambiente, k_difusa, k_especular, brilho) face1 = FaceTriangular(a, b, c, cor) print("Até aqui não foram lançadas exceções.") # teste à exceção ErroPontosColineares try: face2 = FaceTriangular(a, a, c, cor) except ErroPontosColineares: print( "Ao tentar definir-se a face face2 = FaceTriangular(a, a, c, cor)") print("Foi lançada a exceção ErroPontosColineares.") print("É o comportamento herdado da classe Plano.")
r = direcao_luz * (-1.0) + normal * (2.0 * l_interno_n) cor_especular = (self.k_especular * luz.intensidade_especular * ((direcao_olho.interno(r))**self.brilho)) resultado = cor_ambiente + cor_difusa + cor_especular return resultado # testes if __name__ == "__main__": # teste ao construtor material_k_ambiente = CorRGB(0.0, 0.0, 0.1) material_k_difusa = CorRGB(0.0, 0.0, 0.9) material_k_especular = CorRGB(1.0, 1.0, 1.0) material_brilho = 100.0 material_cor = CorPhong(material_k_ambiente, material_k_difusa, material_k_especular, material_brilho) # teste a __str__ print(material_cor) # teste a get_cor_rgb luz_posicao = Ponto3D(1.0, 0.0, 1.0) luz_intensidade_ambiente = CorRGB(1.0, 1.0, 1.0) luz_intensidade_difusa = CorRGB(1.0, 1.0, 1.0) luz_intensidade_especular = CorRGB(1.0, 1.0, 1.0) luz = Luz(
# i_ significa intensidade_ # a posição é um objeto Ponto3D # as intensidades são objetos CorRGB self.posicao = posicao self.intensidade_ambiente = intensidade_ambiente self.intensidade_difusa = intensidade_difusa self.intensidade_especular = intensidade_especular def __str__(self): return ("Luz(" + str(self.posicao) + ", " + str(self.intensidade_ambiente) + ", " + str(self.intensidade_difusa) + ", " + str(self.intensidade_especular) + ")") if __name__ == "__main__": # teste ao construtor posicao = Ponto3D(1.0, 0.0, 3.0) intensidade_ambiente = CorRGB(0.1, 0.2, 0.3) intensidade_difusa = CorRGB(0.4, 0.5, 0.6) intensidade_especular = CorRGB(0.7, 0.8, 0.9) luz = Luz(posicao, intensidade_ambiente, intensidade_difusa, intensidade_especular) # teste a __str__ print(luz)