# Punto: crea una clase que representa puntos 2D.
# Poo.
import math
class Punto:
"""Representa puntos formados por las coordenadas x e y"""
ORIGEN = None
num_puntos = 0
@ staticmethod
def get_origen( ) :
if Punto.ORIGEN == None :
Punto.ORIGEN = Punto( 0 , 0 )
return Punto.ORIGEN
def __init__ ( self , x, y) :
"""Crea un nuevo punto, dadas las coordenadas.
:param x: Coordenada x del punto
:param y: Coordenada y del punto
"""
self .x = x
self .y = y
Punto.num_puntos += 1
def calcula_distancia( self , p2) :
"""Retorna la distancia entre este punto y otro
:param: p2 El otro punto.
:return: La distancia entre este punto y p2.
"""
distancia_x = self .x - p2.x
distancia_y = self .y - p2.y
return math .sqrt ( ( distancia_x ** 2 ) + ( distancia_y ** 2 ) )
def calcula_distancia_origen( self ) :
"""Retorna la distancia desde el origen de coordenadas
a este punto
:return: La distancia entre ambos puntos"""
return self .calcula_distancia ( Punto( 0 , 0 ) )
def __str__ ( self ) :
return str .format ( "({0}, {1})" , self .x , self .y )
if __name__ == "__main__" :
p0 = Punto.get_origen ( )
p1 = Punto( 3 , 4 )
p2 = Punto( 5 , 5 )
print ( "Punto 0: " + str ( p0) )
print ( "Punto 1: " + str ( p1) )
print ( "De" , str ( p0) , "a" , str ( p1) , ":" , p1.calcula_distancia ( p0) )
print ( "De" , str ( p0) , "a" , str ( p2) , ":" , p2.calcula_distancia_origen ( ) )
IyBQdW50bzogY3JlYSB1bmEgY2xhc2UgcXVlIHJlcHJlc2VudGEgcHVudG9zIDJELgojIFBvby4KCmltcG9ydCBtYXRoCgoKY2xhc3MgUHVudG86CiAgICAiIiJSZXByZXNlbnRhIHB1bnRvcyBmb3JtYWRvcyBwb3IgbGFzIGNvb3JkZW5hZGFzIHggZSB5IiIiCgogICAgT1JJR0VOID0gTm9uZQogICAgbnVtX3B1bnRvcyA9IDAKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZ2V0X29yaWdlbigpOgogICAgICAgIGlmIFB1bnRvLk9SSUdFTiA9PSBOb25lOgogICAgICAgICAgICBQdW50by5PUklHRU4gPSBQdW50bygwLCAwKQoKICAgICAgICByZXR1cm4gUHVudG8uT1JJR0VOCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgogICAgICAgICIiIkNyZWEgdW4gbnVldm8gcHVudG8sIGRhZGFzIGxhcyBjb29yZGVuYWRhcy4KCiAgICAgICAgICAgIDpwYXJhbSB4OiBDb29yZGVuYWRhIHggZGVsIHB1bnRvCiAgICAgICAgICAgIDpwYXJhbSB5OiBDb29yZGVuYWRhIHkgZGVsIHB1bnRvCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi54ID0geAogICAgICAgIHNlbGYueSA9IHkKICAgICAgICBQdW50by5udW1fcHVudG9zICs9IDEKCiAgICBkZWYgY2FsY3VsYV9kaXN0YW5jaWEoc2VsZiwgcDIpOgogICAgICAgICIiIlJldG9ybmEgbGEgZGlzdGFuY2lhIGVudHJlIGVzdGUgcHVudG8geSBvdHJvCiAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbTogcDIgRWwgb3RybyBwdW50by4KICAgICAgICAgICAgOnJldHVybjogTGEgZGlzdGFuY2lhIGVudHJlIGVzdGUgcHVudG8geSBwMi4KICAgICAgICAiIiIKICAgICAgICBkaXN0YW5jaWFfeCA9IHNlbGYueCAtIHAyLngKICAgICAgICBkaXN0YW5jaWFfeSA9IHNlbGYueSAtIHAyLnkKICAgICAgICByZXR1cm4gbWF0aC5zcXJ0KChkaXN0YW5jaWFfeCAqKiAyKSArIChkaXN0YW5jaWFfeSAqKiAyKSkKCiAgICBkZWYgY2FsY3VsYV9kaXN0YW5jaWFfb3JpZ2VuKHNlbGYpOgogICAgICAgICIiIlJldG9ybmEgbGEgZGlzdGFuY2lhIGRlc2RlIGVsIG9yaWdlbiBkZSBjb29yZGVuYWRhcwogICAgICAgICAgICBhIGVzdGUgcHVudG8KICAgICAgICAgICAgCiAgICAgICAgICAgIDpyZXR1cm46IExhIGRpc3RhbmNpYSBlbnRyZSBhbWJvcyBwdW50b3MiIiIKICAgICAgICByZXR1cm4gc2VsZi5jYWxjdWxhX2Rpc3RhbmNpYShQdW50bygwLCAwKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyLmZvcm1hdCgiKHswfSwgezF9KSIsIHNlbGYueCwgc2VsZi55KQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHAwID0gUHVudG8uZ2V0X29yaWdlbigpCiAgICBwMSA9IFB1bnRvKDMsIDQpCiAgICBwMiA9IFB1bnRvKDUsIDUpCgogICAgcHJpbnQoIlB1bnRvIDA6ICIgKyBzdHIocDApKQogICAgcHJpbnQoIlB1bnRvIDE6ICIgKyBzdHIocDEpKQoKICAgIHByaW50KCJEZSIsIHN0cihwMCksICJhIiwgc3RyKHAxKSwgIjoiLCBwMS5jYWxjdWxhX2Rpc3RhbmNpYShwMCkpCiAgICBwcmludCgiRGUiLCBzdHIocDApLCAiYSIsIHN0cihwMiksICI6IiwgcDIuY2FsY3VsYV9kaXN0YW5jaWFfb3JpZ2VuKCkpCg==