23/8/10

Ecuación paramétrica de la circunferencia

Por el tipo de aplicaciones que desarrollo es común requerir dibujar circunferencias, algo que es muy sencillo en los lenguajes en que lo he hecho, ya sea la instrucción “Circle” o “Ellipse” ya sea que reciba de parámetros el alto y ancho de la circunferencia, o ya sea que solicite el centro y el radio pero no es más que eso.

Sin embargo, también he tenido la necesidad de dibujar segmentos de circunferencias o tener que obtener N puntos que pertenezcan a la circunferencia algo que los lenguajes ya no proporcionan.

En al menos 4 ocasiones he programado la ecuación paramétrica de la circunferencia para obtener los puntos de una circunferencia o para agregarlos como lista de puntos. El proyecto en el que actualmente estoy trabajando lo vuelve a necesitar y aprovecharé para redactarlo aquí.

Empecemos imaginando que deseamos una circunferencia con centro en el punto (a,b) y radio r.
Esto se puede expresar en funciones trigonométricas de la siguiente forma:
x = a + r * cos (u)
y = b + r *sen (u)
“x” y “y” son las coordenada que deseamos obtener.
“a” es la coordenada x del centro de la circunferencia.
“b” es la coordenada y del centro de la circunferencia.
“r” es el radio.
“u” es el ángulo y va de [0,2PI] ; Es decir la circunferencia completa son 2 PI entonces dividimos 2PI para obtener algún punto en específico



Ahora que esto quedó claro vayamos al lenguaje de programación.
En esta ocasión utilizaré Silverlight y C# con Visual Studio 2010.

1. Creamos un proyecto nuevo
2. Dentro del Grid “LayoutRoot” vamos a agreagar un Grid llamado gridCirc y que tiene 80 de alto y 80 ancho.
3. Ahora agregamos un botón que mandará pintar nuestro semicírculo y le ponemos de nombre btnCirc con el texto Semicírculo
Va a quedar el MainPage.xaml así:


<     Grid x:Name="LayoutRoot" Background="White"      >
        <      Grid Height="80" HorizontalAlignment="Left" Margin="12,12,0,0" Name="gridCirc" VerticalAlignment="Top" Width="80" /         >
        <    Button Content="Pinta semicírculo" Height="24" HorizontalAlignment="Left" Margin="98,12,0,0" Name="btnCirc" VerticalAlignment="Top" Width="117" Click="btnCirc_Click" /       >
    <        /          Grid           >

4. Le damos doble clic al botón para que nos cree el método btnCirc_Click(object sender, RoutedEventArgs e) y podamos agregar nuestro código.
5. Agregamos un Polygon que contendrá los puntos de nuestra circunferencia y definimos el color y el color del contorno quedando así:


Polygon ptosCirc = new Polygon(); // El polígono que contendrá los puntos de la circunferencia
ptosCirc.Fill = new SolidColorBrush(Colors.Red); //el color de relleno
ptosCirc.Stroke = new SolidColorBrush(Colors.Black); // el color del contorno


6. Ahora necesitamos un PointCollection para almacenar los puntos que después le pasaremos al Polígono.


PointCollection ptosColeccion = new PointCollection(); 


7. Definimos cuantos puntos vamos a querer que tenga nuestra circunferencia, en este ejemplo 20.


int numPtos = 20;


8. Ahora necesitamos saber cada cuántos grados queremos un punto, es decir una circunferencia son 2 Pi, entonces tendremos que dividir los 2Pi entre el número de puntos, pero esto es para crear una circunferencia completa, en nuestro caso únicamente queremos media circunferencia entonces dividiremos Pi entre el número de puntos.


double siguiente = Math.PI / numPtos;

9. Definimos el centro de nuestra circunferencia:


System.Windows.Point centro = new System.Windows.Point(gridCirc.Width / 2, gridCirc.Height / 2);


10. Luego definimos donde queremos que inicie nuestra semicircunferencia, esto lo hacemos de nuevo dividiendo Pi.


double u = Math.PI + (Math.PI / 2); // esto iniciará como a las 12:00 es decir un la parte superior de la circunferencia.


11. Ahora vamos a recorrer los 20 puntos para calcular las x´s y las y´s de todos los puntos.


for (int i = 0; i <= numPtos; i++, u += siguiente)
{
System.Windows.Point Punto = new System.Windows.Point(centro.X + (gridCirc.Width / 2) * Math.Cos(u), centro.Y + (gridCirc.Height / 2) * Math.Sin(u));
ptosColeccion.Add(Punto);
}


12. Finalmente agregamos los puntos al polígono.


ptosCirc.Points = ptosColeccion;
gridCirc.Children.Add(ptosCirc);


13. Compilamos.

Ahora para el que lo quiere todo junto para copiar y pegar ahí les va como quedó el método:


private void btnCirc_Click(object sender, RoutedEventArgs e)
{
Polygon ptosCirc = new Polygon();
ptosCirc.Fill = new SolidColorBrush(Colors.Red);
ptosCirc.Stroke = new SolidColorBrush(Colors.Black);
PointCollection ptosColeccion = new PointCollection();
int numPtos = 20;
double siguiente = Math.PI / numPtos
System.Windows.Point centro = new System.Windows.Point(gridCirc.Width / 2, gridCirc.Height / 2);
double u = Math.PI + (Math.PI / 2
for (int i = 0; i <= numPtos; i++, u += siguiente)
{
System.Windows.Point Punto = new System.Windows.Point(centro.X + (gridCirc.Width / 2) * Math.Cos(u), centro.Y + (gridCirc.Height / 2) * Math.Sin(u));
ptosColeccion.Add(Punto);
}
ptosCirc.Points = ptosColeccion;
gridCirc.Children.Add(ptosCirc);
}

Al compilar y darle clic al botón les debe de pintar algo así:






FIN.

10/8/10

Envíar múltiples correos personalizados

Cada día utilizo menos el e-mail como medio de comunicación, sin embargo, a pesar del poco uso que le doy estoy consciente que algunas ocasiones es la única manera de comunicarme con ciertas personas. Mi primer cuenta de correo la obtuve hace casi 12 o 13 años, gracias al proveedor de Internet que contraté en ese entonces, luego obtuve una cuenta gratuita de Correoweb ahora desaparecido, y después obtuve mi primer cuenta de Hotmail que me quitaron por hacer mal uso de ella. Hace 7 años obtuve otra cuenta de Hotmail que es la que actualmente, pero nunca tuve la necesidad de enviar correos a más de 300 personas, que los correos salieran de una cuenta de Hotmail y que además estuvieran personalizados.

Hoy surgió ese reto que yo pensé sería más complicado pero no, en realidad es sencillísimo y únicamente necesité mi cuenta de Hotmail, Word 2007 y Outlook 2007.

NOTA: No sé si funcione con versiones anteriores ya que nunca había tenido la necesidad de hacer esto, además el office que tengo instalado está en Español por lo que no sé en otros idiomas como vengan las opciones.

Reto: Mandar cartas a 300 destinatarios desde una cuenta de Hotmail y que cada carta tuviera el nombre de la persona y una clave única entre otros datos personales. La carta debe tener un contenido que sea el mismo para todos exceptuando los datos citados anteriormente. Evitar tener que escribir 300 veces la misma carta y colocar el nombre de la persona.

Solución:
Antes de empezar a dar la solución debo advertir que la lista de destinatarios estaba en una hoja de Excel. En la primer columna contenía el nombre del destinatario, en la segunda columna tenía el correo electrónico, en la tercer columna tenía su clave única y en la cuarta columna tenía el nombre del lugar de exposiciones en el que conocí a la persona.

Así tenía el archivo de Excel


Paso 1. Abrir Outlook (si ya has abierto Outlook puedes saltarte este paso Ja ja ja)

Paso 2. Dar clic en la opción Outlook Connector y seleccionar la opción Agregar una cuenta nueva

Paso 3. Escribir la dirección de Hotmail y la contraseña, así como el nombre que quieras que aparezca al destinatario cada que recibe un correo tuyo y dar clic en Aceptar

Paso 4. En el menú Herramientas dar clic en Opciones y después en la pestaña Configuración de correo. Encontrarás un botón con la leyenda Cuentas de correo electrónico

Paso 5. Ahora la nueva cuenta que agregaste debe quedar hasta arriba en la lista para que sea la predeterminada y cuando se envíen los correos salgan por la cuenta de Hotmail.

Paso 6. Hasta aquí quedó configurado Outlook para que puedas enviar y recibir correo desde Hotmail. Ahora abrimos Word y buscamos la pestaña Correspondencia que en lo personal nunca había visto y no había tenido tiempo si quiera de picarle ni por error.
Paso 7. Damos clic en Iniciar combinación de correspondencia y seleccionamos Mensajes de correo electrónico

Paso 8. En la opción Seleccionar destinatarios debemos dar clic en Usar lista existente y seleccionamos el archivo de Excel que tiene las claves de los destinatarios
Paso 9. Nos solicitará que seleccionemos la hoja que contiene los correos, en mi caso fue la hoja 1

Paso 10. Damos clic en Insertar línea de saludo y la configuramos diciéndole que la primer columna contiene el nombre de la persona.
Paso 11. Redactar el mensaje que es común para todos y en caso de desear agregar algún dato en particular que está contenido en la hoja de Excel únicamente damos clic en Insertar campo combinado y seleccionamos el dato que deseamos agregar. En mi caso seleccione clave única que es un dato particular para cada destinatario.
Paso 12. Finalmente después de terminar el contenido del mensaje damos clic en Finalizar y combinar y seleccionamos Enviar mensajes de correo electrónico.
Paso 13. en la ventana que se abre seleccionamos la columna que contiene el correo, el asunto del correo y damos clic en Aceptar.
Ya puedes dejar de leer, reto terminado. FIN

8/8/10

Empezando la memoria

Este blog se crea con el propósito de servirme de memoria sobre temas que me entretienen, no pretendo escribir cosas que le sirva a la gente, únicamente escribir sobre mis pasatiempos que con el tiempo van cambiando por lo cual me interesa tener un baúl donde guarde todas esas locuras.
 
Algunas veces tambien escribiré pequeños programas en diferentes lenguajes de programación ya que es otro de mis pasatiempos. Esto lo hago principalmente porque desde hace años desarrollo programitas que se pierden con el tiempo y son irrecuperables.