130 lines
3.2 KiB
Python
130 lines
3.2 KiB
Python
# Alexander Bass
|
|
# Created 4/13/24
|
|
# Last Edited 4/13/24
|
|
from math import cos, sin
|
|
|
|
|
|
class Point:
|
|
def __init__(self):
|
|
self.__color = (1, 1, 1)
|
|
self.__x, self.__y, self.__z = 0, 0, 0
|
|
|
|
def set_xyz(self, x, y, z):
|
|
self.__x, self.__y, self.__z = x, y, z
|
|
return self
|
|
|
|
def rotate_x(self, angle):
|
|
cos_a = cos(angle)
|
|
sin_a = sin(angle)
|
|
y_1 = self.__y * cos_a - self.__z * sin_a
|
|
z_1 = self.__y * sin_a + self.__z * cos_a
|
|
self.set_xyz(self.__x, y_1, z_1)
|
|
return self
|
|
|
|
def rotate_z(self, angle):
|
|
cos_a = cos(angle)
|
|
sin_a = sin(angle)
|
|
|
|
x_1 = self.__x * cos_a - self.__y * sin_a
|
|
y_1 = self.__x * sin_a + self.__y * cos_a
|
|
self.set_xyz(x_1, y_1, self.__z)
|
|
return self
|
|
|
|
def rotate_y(self, angle):
|
|
cos_a = cos(angle)
|
|
sin_a = sin(angle)
|
|
|
|
x_1 = self.__x * cos_a + self.__z * sin_a
|
|
z_1 = self.__z * cos_a - self.__x * sin_a
|
|
self.set_xyz(x_1, self.__y, z_1)
|
|
return self
|
|
|
|
def translate(self, x, y, z):
|
|
self.__x += x
|
|
self.__y += y
|
|
self.__z += z
|
|
|
|
def translate_x(self, x):
|
|
self.__x += x
|
|
|
|
def translate_y(self, y):
|
|
self.__y += y
|
|
|
|
def translate_z(self, z):
|
|
self.__z += z
|
|
|
|
def get_xyz(self):
|
|
return (self.__x, self.__y, self.__z)
|
|
|
|
def rotate(self, transform):
|
|
x_n, y_n, z_n = transform.run(*self.get_xyz())
|
|
self.set_xyz(x_n, y_n, z_n)
|
|
|
|
def get_rgb(self):
|
|
return self.__color
|
|
|
|
def set_color(self, r, g, b):
|
|
if r > 255 or g > 255 or b > 255 or r < 0 or g < 0 or b < 0:
|
|
raise ValueError("Color is greater than 255 or less than 0")
|
|
self.__color = (r, g, b)
|
|
return self
|
|
|
|
|
|
class Rotator:
|
|
def __init__(self):
|
|
self.__alpha = 0.0
|
|
self.__beta = 0.0
|
|
self.__gamma = 0.0
|
|
|
|
self.__sin_alpha = 0.0
|
|
self.__cos_alpha = 0.0
|
|
self.__sin_beta = 0.0
|
|
self.__cos_beta = 0.0
|
|
self.__sin_gamma = 0.0
|
|
self.__cos_gamma = 0.0
|
|
|
|
def rotate_x(self, angle):
|
|
self.__alpha += angle
|
|
return self
|
|
|
|
def rotate_y(self, angle):
|
|
self.__beta += angle
|
|
return self
|
|
|
|
def rotate_z(self, angle):
|
|
self.__gamma += angle
|
|
return self
|
|
|
|
def build(self):
|
|
self.__sin_alpha = sin(self.__alpha)
|
|
self.__cos_alpha = cos(self.__alpha)
|
|
self.__sin_beta = sin(self.__beta)
|
|
self.__cos_beta = cos(self.__beta)
|
|
self.__sin_gamma = sin(self.__gamma)
|
|
self.__cos_gamma = cos(self.__gamma)
|
|
return self
|
|
|
|
def run(self, xI, yI, zI):
|
|
x_0 = xI
|
|
y_0 = yI
|
|
z_0 = zI
|
|
|
|
x_1, y_1 = 0, 0
|
|
|
|
# if self.__alpha != 0.0:
|
|
y_1 = y_0 * self.__cos_alpha - z_0 * self.__sin_alpha
|
|
z_0 = y_0 * self.__sin_alpha + z_0 * self.__cos_alpha
|
|
y_0 = y_1
|
|
|
|
# if self.__beta != 0.0:
|
|
x_1 = x_0 * self.__cos_beta + z_0 * self.__sin_beta
|
|
z_0 = z_0 * self.__cos_beta - x_0 * self.__sin_beta
|
|
x_0 = x_1
|
|
|
|
# if self.__gamma != 0.0:
|
|
x_1 = x_0 * self.__cos_gamma - y_0 * self.__sin_gamma
|
|
y_0 = x_0 * self.__sin_gamma + y_0 * self.__cos_gamma
|
|
x_0 = x_1
|
|
|
|
return x_0, y_0, z_0
|