Programing Challenge 2 - Ordenar puntos en espacio tridimensional, Clase (Python)


En esta entrega de Programming Challenge vamos a evolucionar el código que habíamos creado para ordenar puntos en espacio tridimensional.
Para ello vamos a introducirnos a las clases y objetos en Python. De igual manera que otros lenguajes de programción podemos crear clases, que a groso modo son contenedores de información y además podemos crear funciones de la clases que nos permiten manejar esa información.

Para poder usar estos contenedores de información instanciamos, creamos, objetos. Estos objetos tienen las características específicas de la clase a la que pertenezcan.


Para este Challenge he creado una clase punto que simplemente es capaz de almacenar las tres coordenadas de un punto. Este método tiene un def que podríamos compararlo con el constructor de cualquier lenguaje orientado a objetos, el método def __init__(), se ejecutará al instanciar un objeto.
____________________________________________
class Point

    def __init__(self, xc=0, yc=0, zc=0):
        self.xc = xc
        self.yc = yc
        self.zc = zc

    def setXc(xc):
        self.xc = xc
    
    def setYc(yc):
        self.yc = yc
        
    def setZc(zc):
        self.zc = zc
        
    def getXc(self):
        return self.xc
    
    def getYc(self):
        return self.yc
        
    def getZc(self):
        return self.zc
________________________________

Además hemos añadidos los métodos get y set para poder interactuar con estas variables. El código anterior está situado en un fichero a parte de python llamado Poitn.py. De esta manera desde cualquier otro script de python. Para poder acceder a esta clase debeos importar la biblioteca.

from Point import Point

Podemos situar múltiples clases en un fichero, de esta manera podríamos tener un fichero con un conjunto de clases relacionadas, por ejemplo un fichero Geometrics e importar múltiples clases de el.

from Geometrics import Point
from Geometrics import Line
from Geometrics import Cube
from Geometrics import Cone
...

Lo mas complejo de las clases que se diferencia de otro lenguajes es el uso del self esta palabra la utilizamos para referirnos al propio objeto instanciado de la clase. Si no usáramos esta referencia de no podríamos referirnos al propio objeto de la clase.

El resto del código es muy similar a la anterior entrega del programming challenge. Podemos ver que en el momento de crear los puntos random creamos objetos de la clase Point. El resto se basa en utilizar los métodos get de la clase para calcular la distancia al origen.

Todos los ficheros .py usados en los challenges los podéis encontrar en mi GitHub (https://github.com/KarlVaello/python-programming-challenges)
___________________________________________________________
from random import randint
import math
from Point import Point

# def that sort an array of points (bubble algorithm)
def bubbleSort(alist):
    n = len(alist)
    for i in range(len(alist)-1):
        swp = False
        for j in range(len(alist)-1):
            if (alist[j][2] > alist[j+1][2]):
                tempPoint =  alist[j]
                alist[j] = alist[j+1]
                alist[j+1] = tempPoint
                swp = True

        if (swp == False):
            break

nPoint = 9 # numer of points
points = [] # points array

pointRange = 90 #aleatory range

# loop to create new random points
for x in range (nPoint):
    newPointObjet = Point(randint(-pointRange,pointRange),randint(-pointRange,pointRange),randint(-pointRange,pointRange))
    newPoint = [x+1, newPointObjet]
    points.append(newPoint)

# loop to print element on creation order
print("Element on creation order [x,y,z]")
for i in range(nPoint):
    print("(" + str(points[i][0]) + ",[" + str(points[i][1].getXc())+ ", " + str(points[i][1].getYc())+ ", " + str(points[i][1].getZc()) + "])")
    
print()
# loop to calculate distance to [0, 0, 0] of each point
for e in range (nPoint):
    d = math.sqrt(((points[e][1].getXc()-0)**2)+((points[e][1].getYc()-0)**2)+((points[e][1].getYc()-0)**2))
    points[e].append(d)
   
# loop to print element on creation order and distance to [0, 0, 0]
print("Element on creation order ( n [x,y,z] / DistanceTo0,0,0]")
for i in range(nPoint):
    print("(" + str(points[i][0]) + ",[" + str(points[i][1].getXc())+ ", " + str(points[i][1].getYc())+ ", " + str(points[i][1].getZc()) + "], " + str(points[i][2]) +  ")")
    
# bubble sort algorithm 
bubbleSort(points)

print()
# print elements in order
print("Elements ordered by distance")
for i in range(nPoint):
    print("(" + str(points[i][0]) + ",[" + str(points[i][1].getXc())+ ", " + str(points[i][1].getYc())+ ", " + str(points[i][1].getZc()) + "], " + str(points[i][2]) +  ")")
   
___________________________________________________________



   
   
  





0 comentarios:

Publicar un comentario