<html>
<head>
<style><!--
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Tahoma
}
--></style></head>
<body class='hmmessage'><div dir='ltr'>
ayudemen a realizar este programa en c++ programa que permita el ingreso de varios numeros enteros y deternime el mas cercano y el mas lejano a un valor de referencia previamente ingresado <br><br><div><div id="SkyDrivePlaceholder"></div><hr id="stopSpelling">Date: Thu, 12 Apr 2012 20:32:31 -0700<br>From: tute16@yahoo.com.mx<br>To: cconclase@listas.conclase.net<br>Subject: Re: [C con Clase] [Windows API] Transformación Afín<br><br><div style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); font-family: times new roman,new york,times,serif; font-size: 12pt;"><div style="font-family: 'times new roman','new york',times,serif;"><span>Muchas gracias Steven, pero tal vez no me di a entender, trataré de detallar más mi pregunta:</span></div><div style="font-family: 'times new roman','new york',times,serif;"><span><br></span></div><div><span><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; text-align: left; direction: ltr; margin-bottom: 3px; white-space: pre-wrap; word-wrap: break-word;">Creo que lo de checar si hay pixel ahí, si no para pintar negro, el programa ya lo hace porque sí estamos manejando coordenadas y tenemos una imagen que estamos repintando cada vez que se mueve, por tanto con los pixeles no tenemos problemas.</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; text-align: left; direction: ltr; margin-bottom: 3px; white-space: pre-wrap; word-wrap: break-word;"><br></div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; text-align: left; direction: ltr; margin-bottom: 3px; white-space: pre-wrap; word-wrap: break-word;">Entonces especificamente queremos saber el orden de la multiplicacion de las matrices de transformación para que la imagen se pueda trasladar arriba-abajo-izquierda-derecha pero tambien pueda rotar con respecto a un punto fuera de la imagen sin que éste se desplace al realizar la traslacion.</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; text-align: left; direction: ltr; margin-bottom: 3px; white-space: pre-wrap; word-wrap: break-word;"><br></div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; text-align: left; direction: ltr; margin-bottom: 3px; white-space: pre-wrap; word-wrap: break-word;">Nuestro problema es el siguiente: </div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; text-align: left; direction: ltr; margin-bottom: 3px; white-space: pre-wrap; word-wrap: break-word;">
<div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="direction: ltr; margin-bottom: 3px; word-wrap: break-word;">Siendo:</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="direction: ltr; margin-bottom: 3px; word-wrap: break-word;">T: Traslación de la imagen fuente</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="direction: ltr; margin-bottom: 3px; word-wrap: break-word;">S: Escalación de la imagen fuente</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="direction: ltr; margin-bottom: 3px; word-wrap: break-word;">R: Rotación de la imagen fuente</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="direction: ltr; margin-bottom: 3px; word-wrap: break-word;">Tc: Traslación al centro de la imagen fuente</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="direction: ltr; margin-bottom: 3px; word-wrap: break-word;">Tic: Traslación inversa de la anterior</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="direction: ltr; margin-bottom: 3px; word-wrap: break-word;">Tcd: Traslación de la imagen fuente al centro de la imagen destino</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="direction: ltr; margin-bottom: 3px; word-wrap: break-word;">Ticd: Traslación inversa de la anterior</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="direction: ltr; margin-bottom: 3px; word-wrap: break-word;">Rd: Rotación de la imagen fuente respecto al centro de la imagen destino</div><br class="ecxApple-interchange-newline">
</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; text-align: left; direction: ltr; margin-bottom: 3px; white-space: pre-wrap; word-wrap: break-word;">Tenemos:</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; text-align: left; direction: ltr; margin-bottom: 3px; white-space: pre-wrap; word-wrap: break-word;">
CMatrix3D T,R,Tc,Tic,Tcdest,Ticdest,Rdest,S,Sdest;
                CMatrix3D::Rotation(Rd, g_Thetadest);
                CMatrix3D::Rotation(R, g_Theta);
                CMatrix3D::Traslation(T,(int)g_Tx,(int)g_Ty);
                CMatrix3D::Traslation(Tc,-(int)g_pImagenSource->SizeX()/2,-(int)g_pImagenSource->SizeY()/2);
                CMatrix3D::Traslation(Tic,g_pImagenSource->SizeX()/2,g_pImagenSource->SizeY()/2);
                CMatrix3D::Traslation(Tcd,-(int)g_pImagen->SizeX()/2,-(int)g_pImagen->SizeY()/2);
                CMatrix3D::Traslation(Ticd,g_pImagen->SizeX()/2,g_pImagen->SizeY()/2);
                CMatrix3D::Scalation(S,g_Zoom,g_Zoom);
</div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; text-align: left; direction: ltr; margin-bottom: 3px; white-space: pre-wrap; word-wrap: break-word;"><br></div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; text-align: left; direction: ltr; margin-bottom: 3px; white-space: pre-wrap; word-wrap: break-word;">M=T*Tcd*Rd*Ticd*Tc*S*R*Tic  //se desplaza el punto de rotacion </div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="text-align: left; direction: ltr; margin-bottom: 3px; word-wrap: break-word;"><br class="ecxApple-interchange-newline"></div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="text-align: left; direction: ltr; margin-bottom: 3px; word-wrap: break-word;"><font color="#333333" face="'lucida grande', tahoma, verdana, arial, sans-serif"><span style="line-height: 14px; white-space: pre-wrap;">y si tenemos:</span></font></div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="text-align: left; direction: ltr; margin-bottom: 3px; word-wrap: break-word;"><span style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; white-space: pre-wrap;"> M=Tcd*Rd*Ticd*T*Tc*S*R*Tic</span>  <span style="font-size: 18px;">//</span><span style="color: rgb(51, 51, 51); font-family: 'lucida grande',tahoma,verdana,arial,sans-serif; line-height: 14px; white-space: pre-wrap;">se giran los ejes y la traslacion que genera T, al rotar la imagen por ejemplo 45°, se giran los ejes 45° y la traslacion se hace en ese sentido de los ejes</span></div><div class="ecxfbChatMessage ecxfsm ecxdirection_ltr" style="text-align: left; direction: ltr; margin-bottom: 3px; word-wrap: break-word;"><div style="font-size: 12pt;"><br></div><div style="font-size: 12pt;">Espero me haya dado a entender mejor :)</div><div style="font-size: 12pt;"><br></div><div style="font-size: 12pt;">De antemano gracias!</div><div style="font-size: 12pt;"><br></div><div style="font-size: 12pt;">Lourdes </div><div style="font-size: 12pt;"><br></div></div></span></div>  <div style="font-size: 12pt; font-family: 'times new roman','new york',times,serif;"> <div style="font-size: 12pt; font-family: 'times new roman','new york',times,serif;"> <div dir="ltr"> <font face="Arial" size="2"> <hr size="1">  <b><span style="font-weight: bold;">De:</span></b> Steven Davidson
 <srd4121@njit.edu><br> <b><span style="font-weight: bold;">Para:</span></b> Lista de correo sobre C y C++ <cconclase@listas.conclase.net> <br> <b><span style="font-weight: bold;">Enviado:</span></b> Jueves, 12 de abril, 2012 21:23:36<br> <b><span style="font-weight: bold;">Asunto:</span></b> Re: [C con Clase] [Windows API] Transformación Afín<br> </font> </div> <br>Hola Lourdes,<br><br>On 4/12/2012 7:37 PM, Lourdes Celene Haros Becerra wrote:<br>> Qué tal, buen día!!<br>> <br>> Revisé las pagina que me sugeriste<br>> <a href="http://graficos.conclase.net/curso/index.php?cap=006c#Transformaciones_Afines" target="_blank">http://graficos.conclase.net/curso/index.php?cap=006c#Transformaciones_Afines</a><br>> y sí me sirvió mucho, pero sigo con dudas para implementar que la<br>> imagen fuente gire con respecto a imagen destino... encontré aqui<br>> <a href="http://es.scribd.com/doc/63650237/54/Coordenadas-homogeneas-y-representacion-matricial" target="_blank">http://es.scribd.com/doc/63650237/54/Coordenadas-homogeneas-y-representacion-matricial</a><br>> en la pagina 99 información al respecto, pero nosé cómo<br>> implementarla, no sé si podrían ayudarme. Porq ahi habla de hacer la<br>> rotación respecto a un punto de pivote cualquiera, creo que es lo que<br>> necesito. Mi pregunta es ¿El vector por el que tengo que multiplicar<br>> cambia? ¿Cómo sería?... porq la ecuación de rotación con pivote en el<br>> origen es x'=xcos(theta) -ysin(theta) y'=xsin(theta)+ycos(theta)<br>> <br><br>Bueno, en primer lugar, ten cuidado con los términos que usas. Dudo que estés usando vectores, sino más bien parejas ordenadas para representar puntos o como dices posteriormente píxeles de una imagen.<br><br>En una imagen, guardamos las intensidades en cada píxel; y un píxel requiere
 una pareja ordenada para referirnos a un píxel. Analíticamente, podemos representar una imagen como una función de intensidades: f(x,y). Esto significa que por cada pareja de coordenadas (x,y) podemos conocer la intensidad, f, en tal píxel.<br><br>Las fórmulas explicadas tanto en el capítulo 6 de nuestro curso de programación como en el libro del enlace sirven para puntos, que seguramente describen vértices de un polígono, de un modelo analítico de una figura en dos dimensiones. Por ejemplo, los vértices de un rectángulo, de un triángulo, o de cualquier otro tipo de polígono en general, al igual que un segmento, o incluso coordenadas para describir curvas.<br><br>En tu caso, necesitas una variación de estas fórmulas para que funcionen con píxeles de una imagen. Como todas las coordenadas en una imagen (de píxeles) son válidas, tenemos que aplicar cualquier transformación a TODOS los píxeles y por tanto tenemos que recorrer TODAS las
 coordenadas. El algoritmo entonces podría ser el siguiente:<br><br>Imagen Rotar_Imagen( Imagen f, Dimensión M, Dimensión N, Ángulo a )<br><br>1.  Crear Imagen: g de M x N<br>2.  Inicializar 0 intensidad a todos los píxeles de "g"  // 0 => Negro<br>3.  Para: x = 0 hasta M-1<br>4.     Para: y = 0 hasta N-1<br>5.        u <- x * cos(a) - y * sen(a)<br>6.        v <- x * cos(a) + y * sen(a)<br>7.        g(u,v) <- f(x,y)<br>8.  Terminar( g )<br><br>(Nota: uso <- para indicar "copiar" o "asignar"). Podemos asignar otro valor incialmente a todos los píxeles de la imagen resultante, pero creo que 0 tiene más sentido. También date cuenta que estamos creando una nueva imagen en este algoritmo y además la rotación es alrededor del origen (0,0). Si quieres otro "centro" para la rotación, entonces aplica una traslación en la rotación.<br><br>El
 problema de implementar este algoritmo es que los cálculos de las coordenadas de (u,v) pueden resultar en las mismas más de una vez y por tanto estaríamos copiando diferentes intensidades al mismo píxel. También puede darse el caso de que no todos los píxeles de la imagen resultante son asignados, excepto por el valor inicial.<br><br>Una solución alternativa es aplicar la transformación inversa. Esto significa que analizamos cada píxel de la imagen resultante usando sus coordenadas en la transformación inversa para generar las coordenadas de la imagen original y así consultar sus intensidades. Como se trata de una rotación, su inversa es una rotación del ángulo negativo. El algoritmo ahora sería,<br><br>Imagen Rotar_Imagen( Imagen f, Dimensión M, Dimensión N, Ángulo a )<br><br>1.  Crear Imagen: g de M x N<br>2.  Para: u = 0 hasta M-1<br>3.     Para: v = 0 hasta N-1<br>4.        x <- u * cos(a)
 + u * sen(a)<br>5.        y <- v * cos(a) - v * sen(a)<br>6.        g(u,v) <- f(x,y)<br>7.  Terminar( g )<br><br>El paso #6 no es tan directo, porque tenemos que comprobar que las coordenadas calculadas para (x,y) realmente existen; si no, entonces hay que asignar algún valor como por ejemplo 0 (negro).<br><br>Como posiblemente obtendremos una imagen rotada con algunos píxeles negros (intesidad cero), podemos aplicar una mejor solución para aproximar la intensidad de esos píxeles sin intensidad, como es una interpolación lineal de los píxeles cercanos o vecinos, interpolación bilineal, o interpolación bicúbica.<br><br><br>Espero que todo esto te sirva.<br><br>Steven<br><br><br>_______________________________________________<br>Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br><a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br><br><br> </div> </div>  </div><br>_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ</div>                                         </div></body>
</html>