# -*- coding: utf-8 -*-
"""
Created on Sun Oct 04 08:50:43 2015
@author: Josue
"""
#Programa creado por Carlo Josue Hernandez
#Notas iniciales:
#Estoy consciente que muchas de las lineas en este codigo podrian ser sustituidas y se notaria mayor eficacia en la programacion.
#Pero aun no me siento seguro con funciones mas audaces, por lo que fui a lo seguro y trabajoso, ya pronto espero usar fuicniones mas vanzadas por mi bien y el de mi tiempo.
#Aunque no fue pedido, en muchas opciones se exige al usuario ingresar cierto tipo de datos para la comodidad de todos.
#Aunque muchos raw_input parecen inutiles, sirven para darle cierta pausa al programa.
import math as m #Importacion de la biblioteca math, que debido a que no uso todas las funciones math, preferí darle el prefijo "m."
print'Programa de calculo para vectores, Presiona enter para continuar...' #presentacion o saludo de bienvenida al usuario
raw_input()
print'Las instrucciones se daran para cada caso.Presiona enter para continuar...' #Tan solo es necesario que usuario lea las intruscciones para que todo quede mas claro.
raw_input() # este y los muchos "raw_input" que pululan en mi codigo, son ingresados con el fin de que los resultados y pantallas tengan la duración que usuario desee.
print'Para que este programa funcione de forma correcta, es necesario que digites numeros enteros,.. Presiona enter para continuar.'
raw_input() #pues muchas veces los resultados se ven amontonados y resulta poco practico trabajar con ellos
print'Cabe mencionar, que para que pueda calcular los valores requeridos, cada vector me lo debes dar eje por eje... Presiona enter para continuar.'
raw_input()#Por esa razon, le hago ver al usuario que pra continuar debe presionar enter.
print'Es decir, que para que tome como valido tu vector, debes darme el valor de x,pulsar enter; luego el de y,pulsar enter; y luego el de z y pulsar enter... Presiona enter para continuar.'
raw_input()
print'Se te informara cuando el valor halla sido aceptado mostrando un"valor guardado". Presiona enter para continuar... '
raw_input()
print'Y así, con los dos vectores... Presiona enter para continuar.'
raw_input()
print'Es importante advertirte, que si no ingresas valores correctos, no podremos lograr nada. Aun asi, te avisare cuando algo este mal :) ... Presiona enter para continuar.'
raw_input()
print'Despues de obteneer tu resultado,presiona enter y podras seleccionar otras opciones. Presiona enter para continuar...'
raw_input()
print'Muy bien, ahora si, listos!! :D ... Presiona enter para continuar.'
raw_input()
print'Dame los valores de vector 1, entrada por entrada. Despues de cada valor, presiona enter para guardarlo.'#Hasta aqui acaba el saludo-instruccion
print'Digita el primer vector'
while True:#Este while me permite hacer regresar al usuario a este sitio cuantas veces desee, mietras entre sus opciones no invoque algun "break" que lo rescate del ciclo infinito
x1=raw_input()#el primer valor y todos son pedidos en enteros y evitan algunos errores posteriores.
if x1.isdigit(): #Aqui se da la condicionde verificar que sea un digito y si no, se pasa a las siguientes condiciones.
print'valor guardado'#Mensaje que indica al usario que puede continuar ingresando valores como loco.
break#con este "break" termina el posible ciclo infinito y se pasa al siguiente valor.
elif x1.startswith ('-') and x1[1:].isdigit():#esto permite ingresar valores negativos, pues si al inicio posee un "-" pero a continuacion encuentra un digito, lo tomara como bueno.
print'valor guardado'
break
#de aqui hasta que se pide el ingreso de la tercer entrada del segundo vector, las cosas no cambian mucho, por ello no veo necesario especificar de nuevo cada funcion.
else:
print'dame un valor numerico!'
while True:
y1=raw_input()
if y1.isdigit():
print'valor guardado'
break
elif y1.startswith ('-') and y1[1:].isdigit():
print'valor guardado'
break
else:
print'dame un valor numerico!'
while True:
z1=raw_input()
if z1.isdigit():
print'valor guardado'
break
elif z1.startswith ('-') and z1[1:].isdigit():
print'valor guardado'
break
else:
print'dame un valor numerico!' #si el valor ingresado no cumple con ninguna de las opciones anteriores se imprime el mensaje de rechazo y aquí no hay "break" que salve al usario de salir del bucle infinito:)
print'Ahora dame los valores de vector 2 entrada por entrada.Despues de cada valor, presiona enter para guardarlo.'#Mensaje para indicar al usario que podemos seguir con el vector 2.
print'Digita el segundo vector'
while True:
x2=raw_input()
if x2.isdigit():
print'valor guardado'
break
elif x2.startswith ('-') and x2[1:].isdigit():
print'valor guardado'
break
else:
print'dame un valor numerico!'
while True:
y2=raw_input()
if y2.isdigit():
print'valor guardado'
break
elif y2.startswith ('-') and y2[1:].isdigit():
print'valor guardado'
break
else:
print'dame un valor numerico!'
while True:
z2=raw_input()
if z2.isdigit():
print'valor guardado'
break
elif z2.startswith ('-') and z2[1:].isdigit():
print'valor guardado'
break
else:
print'dame un valor numerico!'
# a partir de aqui se podria decir que comienza lo bueno, pues ya que se comprobo que los datos son validos para trabajar, se comienza a trabajar
ax1=int(x1)#
ay1=int(y1)#
az1=int(z1)#Los valores antes ingrsados en cada entrada en fomra de cadena, ahora son convertidos
ax2=int(x2)#en enteros para poder operar numericamente con ellos
ay2=int(y2)#
az2=int(z2)#
a1='a.'#
a2='b.'#
a3='c.'#
a4='d.'#Ahora se declaran las cadenas a las que debera ser igual la opcion que posteriormente el usario ingrese
a5='e.'#
a6='f.'#
a7='f.1'#
a8='f.2'#
a9='0'#
#Si, un "while True:" de nuevo. Disculpa si lo uso tantas veces, pero hasta ahora es la panacea para mis dilemas, en este punto de mi vida "while True:" es algo casi magico para mi.
while True:#"while True:" haciendo de las suyas de nuevo. Ahora nos permite forzar al usuario a ingresar opciones correctas y tambien será el punto de reunion de las opciones elegidas, para así permitir que pueda elegir todo lo que quiera el usuario.
print'Te presento el menu de opciones:'####################################
print'OP a. Quiero Calcular la suma'#####Todo esto es el menu de opciones##
print'OP b. Quiero Calcular la resta'#####Cabe destacar que las opciones,##
print'OP c. Quiero Calcular el producto escalar'##Deben ser ingresadas#####
print'OP d. Quiero Calcular el producto vectorial'######### 'tal cual'#####
print'OP e. Quiero Calcular el angulo(en grados) entre ellos'##############
print'OP f. Quiero calcular la longitud del vector'########################
print'0 Salir'
#"while True:" nos arrojara el menu de opciones un sinfin de veces.
nor1=float(m.sqrt((ax1**2)+(ay1**2)+(az1**2)))####Estas son las normas del vector que de una vez son
nor2=float(m.sqrt((ax2**2)+(ay2**2)+(az2**2)))####calculadas para poder usarse después.
op=raw_input('Que quieres calcular?')#aqui el usario elgie y los "elif's" posteriores evaluaran si su ellecion es correcta y le daran resultados distintos
if (op==a1): #Esto evalua si "op" es igual a la cadena "a1" que arriba declare, y pasa lo mismo con cada uno de los sguientes "elif's"
s1= ax1 + ax2###
s2= ay1 + ay2#####Asi se realiza la suma.
s3= az1 + az2###
print'LA suma de los vectores es (',s1,',',s2,',',s3,')'#arroja el resultado de la suma pero orndenado y con formato dado por el programador, Yo.
raw_input()
elif (op==a2):
r1= ax1 - ax2
r2= ay1 - ay2#LA resta
r3= az1 - az2
print'LA resta de los vectores es (',r1,',',r2,',',r3,')'
raw_input()
elif (op==a3):#La opcion "c.", quien nos lleva al producto punto.
e1= float(ax1 * ax2)#
e2= float(ay1 * ay2)#Los valores necesarios para el producto punto
e3= float(az1 * az2)#
print'El producto escalar es:' ,e1+e2+e3 #el producto punto organizado
raw_input()
elif (op==a4):#Se muy bien que "numpy" pudo ahorrarme bastante trabajo en este punto,
#pero debido a que aun no me siento muy familiarizado con su sintaxis y fuinciones, decidí ir a lo seguro y hacer las cosas un poco mas manuales.
i=(ay1 * az2)-(az1 * ay2)# asi es como se resuelven los determiantes y de la forma "sucia" y sin recurrir a numpy.
j=(ax1 * az2)-(az1 * ax2)# como explique, aun no maejo fielmente las funciones de numpy.
k=(ax1 * ay2)-(ay1 * az2)#
print'El producto vectorial es: i',i,'+ j',j,'+ k',k #el resultado organizado.
raw_input()
elif(op==a5):
ang=m.degrees(m.acos((e1+e2+e3)/(nor1*nor2)))#el uso de la biblioteca math en su maxima expresion en mi programa.
#.degrees funciona pra convertir los radianes (que es con lo que python trabaja de primera mano)a grados; acos() fuacniona para calcular la inversa del coseno y asi obtener el angulo, que como dije, python arroja en radianes.
print'El angulo entre los vectores es de:',ang,'grados.'#el resultado ordenado
raw_input()
elif (op==a6):#Submenu de la nomra del ctor, que es lo mismo que la longitud.
print'OPCION F ELEGIDA:'
while True:#"while True:" nos permite volver aquí si no da un opcion valida
print'Ingresa el valor al cual calcular su longitud'
print'OP f.1 VECTOR 1'
print'OP f.2 VECTOR 2'
opf=raw_input()
if (opf==a7):
print'LA longitud del vector 1 es:',nor1
raw_input()
break# debido a que el programa no explica si aqui se debe dar algun bucle y dar opciones al usaurio para terminarlo, decidi que usuario solo conozca la norma de un vector,
#pero si quiera los dos, deberia de volver a digitar la opción "f." en el menu principal.
elif (opf==a8):
print'La longitud del vector 2 es:',nor2
raw_input()
break#cabe destacar que tanto este "break" como elanterior, ahora aparecen para cortar el while interno y asi llevarnos al menu principal despues de ver el resultado.
else:
print'elige una opcion valida.' #si el suario no ingresa un valor valido, de nuevo gracias al "while True:" volvera al inicio de este submenu, no sin antes ser regañado.
elif (op==a9):#si el usario ya calculo todo o lo necesario o no quiere calcular nada, la opcion 9 o "0" le permite salir sin ningun remordimiento.
break
else:
print'elige una opcion valida!' #si el suario no ingresa un valor valido, de nuevo gracias al "while True:" volvera al inicio del menu, no sin antes ser regañado.
print'Hasta la proxima' #finalmente el mensaje de despedida.
raw_input() #con este raw_input() se cerrara la ventana cuando el usuario presione enter.