<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-8573900667626592024</atom:id><lastBuildDate>Sat, 06 Sep 2008 02:38:37 +0000</lastBuildDate><title>OnlyAngel.Net @ CINVESTAV.NET</title><description></description><link>http://cinvestav.onlyangel.net/</link><managingEditor>noreply@blogger.com (OnlyAngel.Net Place)</managingEditor><generator>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-8914212456025574816</guid><pubDate>Fri, 23 May 2008 06:06:00 +0000</pubDate><atom:updated>2008-05-22T23:10:19.745-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Notas</category><category domain='http://www.blogger.com/atom/ns#'>Ciencia</category><category domain='http://www.blogger.com/atom/ns#'>Estudios</category><title>Actualizaciones</title><description>Se que tiene mucho tiempo que no escribo nada pero e estado trabajando mucho en la escuela ya saben, les comento que ya voy por el tercer cuatrimestre y empezare a subir las tareas de el segundo cuatrimestre de todas las materias para que puedan descargarlas, independientemente de que esten bien todos los puntos de ellas. Como humano tube muchos errores en algunas pero en otras sali muy bien.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Asi que estamos en contacto y espero que lean que se hace por aqui en esta fantastico Instituto. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Por cierto ya se han publicado las fechas de el proceso de admicion del departamento de computacion, pueden verlo en el siguiente vinculo: &lt;a href="http://www.cs.cinvestav.mx/Posgrado/posgrado.html"&gt;http://www.cs.cinvestav.mx/Posgrado/posgrado.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Estamos en contacto...&lt;/div&gt;</description><link>http://cinvestav.onlyangel.net/2008/05/actualizaciones.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-2197815847831619775</guid><pubDate>Thu, 17 Jan 2008 08:45:00 +0000</pubDate><atom:updated>2008-01-17T01:28:29.204-08:00</atom:updated><title>"Software and the Concurrency Revolution" Lecture</title><description>The original document can be downloaded &lt;a href="http://research.microsoft.com/~larus/Papers/queue01.pdf"&gt;here&lt;/a&gt;.&lt;div&gt;As first homework of the class of concurrent proggraming we read these article, and these is a small sumary.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The computers are growing in these last days in a way that before were rare, these days the hardware is changing to a multicore processors but that the people didnt understand is tha it only benefit to a concurrent applications(that exist since 30 years). Today desktop applications will not run much faster than they do now. In fact they may run slightly slower on newer Chips, as individual cores become simper and run at lower clok speeds to reduco power consuption on dense multicore processors.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One of the conceptual problems in concurrent programing is that the concurrency requires programmers to think in a way humans find difficult, nevertheless, multicore machines are the future.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Consequences: a new era in software&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Semaphores and coroutines are the assembler of concurrency, and locks and threads are the slightly higher-level structured constructs of concurrency. What is needed is OO (Object Oriented) for concurrency.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you think that sequential programming is hard, concurrent programming is demostrably more difficult, becouse it requires synchronization analysis and other things.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Differences between client and sever applications&lt;/span&gt;&lt;/div&gt;&lt;div&gt;For many server-based programs, typically have an abundance of parallelism, as they simultaneously handle many independent request streams.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In client applications is not nearly as well structured and regular typically concurrency is found by dividing a computacion into finer pieces.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Programming models&lt;/span&gt;&lt;/div&gt;&lt;div&gt;parallel programming models differ significantly in two dimensions: granularity of the arallel operations and the degree of coupling between these tasks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Parallel instruction execution generrally requires hardware support, Multicore processors reduce communicacion and synchronization costs, as compared with conventional multiprocessors, witch can reduce the overhead burden on smaller pieces of code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The other dimension es he degree of coupling in the commuication and synchronization between the operations. The ideals is none: operations run entirely independently and produce distinct outputs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Independent parallelism&lt;/span&gt;&lt;/div&gt;&lt;div&gt;es the parallelism in wich one or more operatiosn are applied independently to each item in a data collection.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fine-granied data parallelism relies on the independence of the operations executed concurrently. They should no t share input data or results an dshould be executable without coordination.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Regular parallelism&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Thw next step is to apply the same operation to a collection of data when the computations are mutually dependent&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;The problem of shared state, and why locks aren't the answer&lt;/span&gt;&lt;/div&gt;&lt;div&gt;When two tasks try to access the same object, and one could modify its state, if we do no thing to coordinate the tasks, we have a data race. Races are bad because the concurrent tasks can read and write inconsistent or corrupted values.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are a rich variety of syncronization devices that can prevent races. The simplest of these is a lockk. Each task that wants to access a piece of shsred data must adquire the lock for that data, perform its computation, and then release the lock so other operations on the data can proceed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A fundamental problem with locks is that they are not composable. You can't take two correct lock-based pieces of code, combine them, and know that the result is still correct.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;in its simplest form deadlock happens when two locks might be adquired by two tasks in opposite order: task T1 takes lock L1, task T2 takes lock L2 and then T1 tries to take L2 thile T2 tries to take L1. Both block forever. There are some techniques for avoiding deadlocks, lock leveling and lock hierarchies..&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are at least three major problems with synchronized methods. First, they are no appropiate for types whose methods call virtual functions on other objets, synchronized methods can perform too much locking, by acquiring and releasing locks on all objects instances. Third, synchronized methods cna also perform too little locking, by no preservin atomicity when a program call multiple methods on a object ro on different objets.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Original document writed by Herb Sutter and James Larus can by downloaded from &lt;a href="http://research.microsoft.com/~larus/Papers/queue01.pdf"&gt;here&lt;/a&gt;.&lt;/div&gt;</description><link>http://cinvestav.onlyangel.net/2008/01/software-and-concurrency-revolution.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-2448441781320336559</guid><pubDate>Wed, 16 Jan 2008 08:18:00 +0000</pubDate><atom:updated>2008-01-17T00:35:55.311-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Notas</category><category domain='http://www.blogger.com/atom/ns#'>Bases de Datos</category><title>Notas puntuales de: Bases de Datos</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/172/470542089_e020f8f7e8.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px;" src="http://farm1.static.flickr.com/172/470542089_e020f8f7e8.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Fundamentos de bases de datos&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Transaction Database ACM&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Tecnologías de Bases de datos&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Data &amp;amp; Knoledge IEEE&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Softare &amp;amp; Practice.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Sistemas de Información&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Information System&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Teorías de Bases de Datos&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Teorías algebraicas (Algebras Universales)&lt;/li&gt;&lt;li&gt;Teorías de la Lógica (Lógicas)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Modelo de datos&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CODASYL Comité de Datos Sistemas y Lenguajes (Cobol, sistemas de bases de datos, principios de base de datos)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Modelo de datos de Red y Jerárquico (Base: Teoría de Conjuntos)&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Base de Datos&lt;/li&gt;&lt;li&gt;Sistema maneador de base de datos (DBMS)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Modelo de datos Relacional&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Contiene &lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Modelo de datos (Esquemas o Objetos de Relación)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Algebra de Relación Relación n’aria R=(A1,... , An)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Restricciones de Integridad&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Modelo matemático es M=&lt;r, i=""&gt; representa que el modelo esta representado por espacio de relación R el Algebra que lo representa A y las restricciones de integridad I.&lt;/r,&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Modelo Entity-Relationship&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Trato de unificar los modelos de Red, Jerárquico y Relacional&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Modelo Semántico de datos&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Redes Semánticas&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Modelo Funcional de datos&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Semántica de datos &amp;amp; Conocimiento&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Abstracción y Generalización&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Lógica y Bases de datos&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fundamentación de las BD desde la lógica.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Visión de las BD desde la Lógica.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Explicacion&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Modelo Relacional &lt;--&gt; Modelo de la lógica de primer orden&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Relaciones R - son predicados.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lenguaje relacional - lenguaje de la lógica&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;</description><link>http://cinvestav.onlyangel.net/2008/01/notas-puntuales-de-bases-de-datos_16.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-626589960432839107</guid><pubDate>Mon, 14 Jan 2008 08:10:00 +0000</pubDate><atom:updated>2008-01-17T00:36:38.877-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Notas</category><category domain='http://www.blogger.com/atom/ns#'>Bases de Datos</category><title>Notas puntuales de: Bases de datos</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm1.static.flickr.com/172/470542089_e020f8f7e8.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px;" src="http://farm1.static.flickr.com/172/470542089_e020f8f7e8.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Materia Bases de Datos Impartida por el Dr. Sergio Chapa.&lt;ul&gt;&lt;li&gt;Sistemas Biológicos es un área muy interesante para el futuro de las ciencias de la computación.&lt;br /&gt;Especialmente en el diseño de datos y modelos de datos&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Bases de Datos e Inteligencia Artificial Una buena bibliografía aunque es posible que ya no se siga editando.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Al inicio todo computo se basaba en cintas. Y una de las primeras metas era hacer que el computo se hiciera en memoria, para poder realizar búsquedas, haching, etc.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;El problema de la partida doble es un problema viejo y puede ser resuelto como un problema de optimizaron.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Una base de datos es un conjunto de datos, todos relacionados entre ellos.&lt;/li&gt;&lt;/ul&gt;</description><link>http://cinvestav.onlyangel.net/2008/01/notas-puntuales-de-bases-de-datos.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-6095789565504955650</guid><pubDate>Sat, 12 Jan 2008 07:16:00 +0000</pubDate><atom:updated>2008-01-12T00:10:01.618-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Notas</category><category domain='http://www.blogger.com/atom/ns#'>Sistemas Operativos</category><title>Vinculos, WatchDog, uptime</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.juntadeandalucia.es/innovacioncienciayempresa/hogardigital07/formacion/graf/I10.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px;" src="http://www.juntadeandalucia.es/innovacioncienciayempresa/hogardigital07/formacion/graf/I10.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Notas de la clase de Sistemas Operativos impartida por el &lt;a href="http://www.cs.cinvestav.mx/Gente/investigadores/Dominique/dominique.html"&gt;Dr. Dominique Decouchant&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Comandos&lt;/div&gt;&lt;div&gt;&lt;a href="http://linuxparadummies.blogspot.com/2007/10/comando-ln.html"&gt;$ln&lt;/a&gt;: crea una liga dura entre archivos ($ln &lt;originalfile&gt; &lt;linkfile&gt;)&lt;/linkfile&gt;&lt;/originalfile&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://linuxparadummies.blogspot.com/2007/10/comando-ln.html"&gt;$ln&lt;/a&gt; -s: crea una liga simbolica. &lt;/div&gt;&lt;div&gt;$ll : es como ls pero muestra la cantidad de referencias de los bloques de los archivos creados con ln.&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.velug.org.ve/archivo/l-linux-2000-December/022232.html"&gt;$uptime&lt;/a&gt;: dice estadísticamente la carga del sistema en diferentes lapsos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;WatchDog: es un proceso que que esta constituido por un solo ciclo infinito que mantiene a el procesador trabajando cuando no se esta siendo usado por el usuario por que el procesador no puede detenerse (si eso sucediera el sistema se detendría). Para que este proceso no interrumpa o estorbe a procesos importantes del sistema se le asigna el menor nivel de prioridad del sistema a ese proceso, así que dará en background en cuanto otro proceso requiera usar el procesador.&lt;/div&gt;</description><link>http://cinvestav.onlyangel.net/2008/01/vinculos-watchdog-uptime.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-7462076447459029531</guid><pubDate>Sat, 12 Jan 2008 06:43:00 +0000</pubDate><atom:updated>2008-01-11T23:11:26.984-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Estudios</category><title>Segundo cuatrimestre</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cs.cinvestav.mx/Gente/investigadores/matias/matias.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px;" src="http://www.cs.cinvestav.mx/Gente/investigadores/matias/matias.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cs.cinvestav.mx/Gente/investigadores/coello/coello.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px;" src="http://www.cs.cinvestav.mx/Gente/investigadores/coello/coello.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;En esta ocasión les comento que por un buen rato e estado pensando sobre que materias tomar y no repetir el error del cuatrimestre pasado de estresandome entrando a todas las materias para saber de que se tratan (para eso ya tuve un intensivo cuatrimestre pasado), ahora con el apoyo de el &lt;a href="http://delta.cs.cinvestav.mx/%7Ematias/"&gt;Doctor &lt;/a&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 26, 139); text-decoration: underline;"&gt;Matías&lt;/span&gt; pude definir mi evolución en este siguiente paso en la maestría. Mi intención era tomar Optimización, Inteligencia Artificial, Sistemas Operativos y Bases de Datos. Pero me invitaron a tomar una clase de programación concurrente (de la cual no sabia ni pio), y me di cuenta que es una muy buena herramienta que me puede servir, entonces entre en problemas por que solo podemos llevar cuatro materias y al hablar con el Dr. Matías resalto que quería tomar IA por que tenia la cosquilla de aprender a implementar inteligencia artificial y me comento que si llevaba optimización el &lt;a href="http://delta.cs.cinvestav.mx/%7Eccoello/"&gt;Dr. Carlos Coello&lt;/a&gt;, el la daba implementando Computación Evolutiva que es una área muy especifica de IA y que eso podría satisfacer mi curiosidad de saber sobre la materia y dejarme el espacio necesario para poder llevar programación concurrente, lo cual me agrado mucho. Ya que aprenderé mas con el mismo tiempo.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Entonces mi carga curricular para este cuatrimestre queda como Optimización, Programación Concurrente, Sistemas Operativos y Bases de Datos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Nota: Las imágenes son de los doctores Matías (Izquierda) y Carlos Coello (Derecha)&lt;/div&gt;</description><link>http://cinvestav.onlyangel.net/2008/01/segundo-cuatrimestre.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-3042463962238879308</guid><pubDate>Thu, 10 Jan 2008 20:58:00 +0000</pubDate><atom:updated>2008-01-10T14:05:27.416-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Ciencia</category><title>Recuento de los Daños.</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.cs.cinvestav.mx/cinvestav.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px;" src="http://www.cs.cinvestav.mx/cinvestav.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Hello fellows, comento que empezare una serie de posts denominada "Recuento de los daños" donde comentare las características de cada uno de los cursos que tome, impresiones de los maestros, y alumnos, tareas y cosas que hayan pasado (realmente me gustaría incluir todo esto pero no estoy muy seguro de realmente poner todos estos puntos en cada curso). &lt;div&gt;&lt;br /&gt;&lt;div&gt;Ahora solo compartiré parte de mis impresiones generales en este cuatrimestre.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Como siempre (según el &lt;a href="http://delta.cs.cinvestav.mx/%7Eccoello/"&gt;Dr. Coello&lt;/a&gt;, en una platica de bienvenida), los alumnos de nuevo ingreso tratando de cubrir nuestras dudas, necesidades de aprender y comprender que tipo de maestros hay además de los tipos de materias, siempre entramos a todos los cursos, disque para ver de que se trata y conocer a los maestros. Actividad que si de por si es desgastante en esta institución es mucho mas por el nivel de las clases. Así que imaginense tratando de entrar a todas las clases de la primera tabla en &lt;a href="http://www.cs.cinvestav.mx/Cursos/index.html"&gt;esta pagina&lt;/a&gt;. Y todas dejando tareas  o los doctores "espantando" a los alumnos. En esas primeras dos semanas fueron donde empezaron las primeras risas con los doctores o primeras impresiones dependiendo de cual sea el caso. De esta manera se empeso después de ver algunos temas interesantes y retadores y al hablar con mi asesor de maestria el &lt;a href="http://delta.cs.cinvestav.mx/%7Ematias/"&gt;Dr. Matias&lt;/a&gt; al respecto llegue a la conclusión de entrar a las materias de Matemáticas Discretas, Graficacion, Ingeniera de Software y ProgramaciónOrientada a Objetos, impartidas por los doctores &lt;a href="http://delta.cs.cinvestav.mx/%7Edebrup/"&gt;Debrup Chakraborti&lt;/a&gt;&lt;a href="http://delta.cs.cinvestav.mx/%7Efraga/"&gt;, Luis Gerardo de la Fraga&lt;/a&gt;, &lt;a href="http://delta.cs.cinvestav.mx/~pmejia/"&gt;Pedro Mejía Alvarez&lt;/a&gt; y &lt;a href="http://www.cs.cinvestav.mx/Gente/investigadores/Dominique/dominique.html"&gt;Dominique Decouchant&lt;/a&gt; con la &lt;a href="http://delta.cs.cinvestav.mx/%7Esmendoza/"&gt;Dra. Sonia Mendoza Chapa&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;Todos excelentes Doctores con una gran habilidad y lo que mas me gusto des sus clases es que dificilmente tenían un error y si era el caso, se corregían automáticamente, además de la gran cantidad de conocimiento que destilan en cada una de sus secciones de clase, en realidad te hacen sentir en la cima de algo que toda vía no se bien que es.&lt;/div&gt;&lt;div&gt;Al entrar tenia una fuerte inclinación a la computación evolutiva por que me e enterado que es algo muy complejo y eso a mi me encanta, pero en el transcurso de los cursos me latió mucho el tema de graficación. O específicamente de visualización por que e tenido experiencia en esa área y se me ocurren mas cosas que hacer, pero siguen siendo aplicaciones de tecnologías quizá no muy dignas de una tesis de maestría en ciencias, pero el tiempo lo dirá y esta cabeza igual.&lt;/div&gt;&lt;div&gt;No cabe duda que este tiempo aquí en el DF me a ayudado a madurar bastante en el sentido de mantenerme a mi mismo y vivir solo, me a quitado algunas dudas y miedos que tenia en la cabeza. Estas entre otras muchas cosas han sucedido en este cuatrimestre en esta carrera, pronto escribiré sobre el recuento de los daños para las materias que tome.&lt;/div&gt;&lt;/div&gt;</description><link>http://cinvestav.onlyangel.net/2008/01/recuento-de-los-daos.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-9177729706207533633</guid><pubDate>Thu, 10 Jan 2008 07:36:00 +0000</pubDate><atom:updated>2008-01-10T12:57:46.069-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Ingenieria de Software</category><category domain='http://www.blogger.com/atom/ns#'>Tarea</category><title>SDSCC</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-2-750415.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-2-750412.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Proyecto de documentación y desarrollo de un sistema web para administrar una conferencia científica, que se realizo en equipo con Rogelio un compañero de curso, en el trabajo se tubo serios problemas de comunicación independientemente que se trato de manejar buenos métodos de sincronización de información SVN, videoconferencias, remote descktops y aun así no pudimos cumplir con el realizar un trabajo con la calidad suficiente para poder tener una buena realización al final. Sin embargo fue suficiente para pasar la materia (aunque suene emotivo realmente es algo denigrante usar la palabra suficiente, pero así son las cosas, así que aguas con los problemas de comunicación con tus equipos, debes asegurarte que te van a entender para que hay mayor provecho).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Les dejo el documento del proyecto para que estén enterados de que se trata mas a profundo.&lt;/div&gt;&lt;a href="http://cinvestav.onlyangel.net/files/unido.pdf"&gt;Aqui&lt;/a&gt;</description><link>http://cinvestav.onlyangel.net/2008/01/sdscc.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-1228674987123085664</guid><pubDate>Sun, 16 Dec 2007 12:47:00 +0000</pubDate><atom:updated>2007-12-16T05:45:21.612-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Tarea</category><category domain='http://www.blogger.com/atom/ns#'>Graficación</category><title>Trazo de splines</title><description>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Trazo de splines&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;• Interpolar un conjunto de puntos usando los splines cubicos naturales.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;• Interpolar un conjunto de puntos de una curva cerrada usando los mismos splines cubicos naturales.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;• Interpolar el mismo conjunto de puntos del primer punto pero ahora usando los splines Catmull-Rom.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;• El trazo debe realizase con gnuplot&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Jose Angel Espinoza Portillo, onlyangel@onlyangel.net &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;December 16, 2007&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;a href="http://cinvestav.onlyangel.net/files/Tarea06.pdf"&gt;Archivo PDF&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;a href="http://cinvestav.onlyangel.net/files/Tarea06.tex"&gt;Archivo TEX&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;a href="http://cinvestav.onlyangel.net/files/tarea06.zip"&gt;Paquete Completo en ZIP&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style=" font-weight: bold; font-size:18px;"&gt;Splines Cubicas Naturales&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;1 Teorıa&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Fue una de las primeras curvas splines que se desarrollo para aplicaciones gr´aﬁcas es el spline cubico natural. Esta se forma imponiendo que dos partes adyacentes e la curva posean la mismas primera y segunda derivada parametrica en su limite comun. Por tanto, los splines cubicos naturales tienen continuidad C 2 .&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen2-718061.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen2-718058.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Si tenemos n + 1puntos de control, como en la Figura 1.1, entonces tenemos n partes de la curva con un total de 4n coeﬁcientes de polinomio que hay que determinar. En cada uno de los n − 1 punt&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;os de control interiores tenemos cuatro condiciones en el limite: las dos partes de la curva a cada lado de un punto de control deben tenerlas mismas primera y segunda derivadas parametricas en dicho punto de control, y cada curva debe pasar por ese punto de control. Esto nos proporciona 4n − 4 ecuaciones que hay que satisfacer con 4n coeﬁcientes de polinomio, obtenemos una ecuaci´on adicional a partir del primer punto de control p0 y pn en el valor 0. Otra t´ecnica es anadir dos puntos de control extra (llamados puntos ﬁcticios ), uno en cada extremo de la secuencia original de punt&lt;/span&gt;os de control. Es decir anadimos un punto de control etiquetado como p en el comienzo de la curva y un punto decontrol etiquetado como pn+1 en el ﬁnal. Entonces todos los puntos e control originales son puntos anteriores y tenemos las 4n condiciones necesarias en el limite.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;2 Base matematica del dibujo&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Si tenemos una secuencia de puntos P = {P0 , P1 , · · · , Pn } donde cada Pa es un punto en el espacio (xa , ya ). Se tiene que desarrollar la siguiente Multiplicaci´on de matrices.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-1-755261.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-1-755258.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;De esta manera se tienen todas las secciones de la curva a dibujar, la cual para ser rendereada por puntos se especiﬁcan segun la siguiente ecuaci´on basada en t.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-2-723672.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-2-723670.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;3 Interpolando un Conjunto de Puntos&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;3.1 Se propone el siguiente P.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-3-763335.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-3-763334.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;3.2 Se tendr´an unos M de: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-4-722861.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-4-722854.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;3.3 Con lo que nos queda. &lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-5-781262.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-5-781258.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;3.4 C´odigo de gluplot&lt;br /&gt;&lt;/span&gt;&lt;code&gt;&lt;br /&gt;X1(t) = 2*(1-t) + 4*t + (-30/6)*( (1-t)*(1-t)*(1-t) - (1-t) ) + (30/6)*( t*t*t - t )&lt;br /&gt;Y1(t) = 3*(1-t) + 8*t + (30/6)*( (1-t)*(1-t)*(1-t) - (1-t) ) + (-30/6)*( t*t*t - t )&lt;br /&gt;X2(t) = 4*(1-t) + 6*t + (-30/6)*( (1-t)*(1-t)*(1-t) - (1-t) ) + (30/6)*( t*t*t - t )&lt;br /&gt;Y2(t) = 8*(1-t) + 3*t + (-30/6)*( (1-t)*(1-t)*(1-t) - (1-t) ) + (30/6)*( t*t*t - t )&lt;br /&gt;X3(t) = 6*(1-t) + 8*t + (-30/6)*( (1-t)*(1-t)*(1-t)-(1-t) ) + (30/6)*( t*t*t - t)&lt;br /&gt;Y3(t) = 3*(1-t) + 8*t + (30/6)*( (1-t)*(1-t)*(1-t)-(1-t) ) + (-30/6)*( t*t*t - t)&lt;br /&gt;set xrange [0:10]&lt;br /&gt;set yrange [0:10]&lt;br /&gt;set multiplot&lt;br /&gt;plot ’puntosNaturales.txt’ w p ps 2&lt;br /&gt;set parametric&lt;br /&gt;set trange [0:1]&lt;br /&gt;plot X1(t),Y1(t), X2(t),Y2(t),X3(t),Y3(t)&lt;br /&gt;unset multiplot&lt;br /&gt;pause -1&lt;br /&gt;&lt;/code&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style=" ;font-family:Courier;font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;3.5 Resultado&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen3-707536.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen3-707534.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;4 El caso del la ﬁgura circular&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;4.1 Se propone el siguiente P.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-6-703575.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-6-703573.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;4.2 Se tendr´an unos M de:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-7-750011.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-7-750009.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-8-777913.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-8-777911.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;4.3 Con lo que nos queda.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-9-715606.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-9-715602.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;4.4 Codigo en GNUPLOT &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;X1(t) = 4*(1-t)+3*t + ((-11.81041)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((8.33644)/6)*(t*t*t-t)&lt;br /&gt;Y1(t) = 4*(1-t)+0*t + ((-12.21815)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((0.76353)/6)*(t*t*t-t)&lt;br /&gt;X2(t) = 3*(1-t)+4*t + ((8.33644)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((-9.53533)/6)*(t*t*t-t)&lt;br /&gt;Y2(t) = 0*(1-t)-4*t + ((0.76353)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((9.16403)/6)*(t*t*t-t)&lt;br /&gt;X3(t) = 4*(1-t)+0*t + ((-9.53533)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((-0.19511)/6)*(t*t*t-t)&lt;br /&gt;Y3(t) = -4*(1-t)-3*t + ((9.16403)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + (( -7.41963)/6)*(t*t*t-t)&lt;br /&gt;X4(t) = 0*(1-t)-4*t + ((-0.19511)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((10.31579)/6)*(t*t*t-t)&lt;br /&gt;Y4(t) = -3*(1-t)-4*t + (( -7.41963)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((8.51451)/6)*(t*t*t-t)&lt;br /&gt;X5(t) = -4*(1-t)-3*t + ((10.31579)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((-11.06804)/6)*(t*t*t-t)&lt;br /&gt;Y5(t) = -4*(1-t)+0*t + ((8.51451)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((3.36161)/6)*(t*t*t-t)&lt;br /&gt;X6(t) = -3*(1-t)-4*t + ((-11.06804)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((21.95635)/6)*(t*t*t-t)&lt;br /&gt;Y6(t) = 0*(1-t)+4*t + ((-3.36161)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((-21.96094)/6)*(t*t*t-t)&lt;br /&gt;X7(t) = -4*(1-t)+0*t + ((21.95635)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((-2.84467)/6)*(t*t*t-t)&lt;br /&gt;Y7(t) = 4*(1-t)+3*t + ((-21.96094)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((10.56027)/6)*(t*t*t-t)&lt;br /&gt;X8(t) = 0*(1-t)+4*t + ((-2.84467)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((10.57766)/6)*(t*t*t-t)&lt;br /&gt;Y8(t) = 3*(1-t)+4*t + ((10.56027)/6)*((1-t)*(1-t)*(1-t)-(1-t)) + ((-8.28013)/6)*(t*t*t-t)&lt;br /&gt;set xrange [-7:7]&lt;br /&gt;set yrange [-7:7]&lt;br /&gt;set multiplot&lt;br /&gt;plot ’puntosNaturalesCirculo.txt’ w p ps 2&lt;br /&gt;set parametric&lt;br /&gt;set trange [0:1]&lt;br /&gt;plot X1(t),Y1(t), X2(t),Y2(t),X3(t),Y3(t), X4(t),Y4(t),X5(t),Y5(t), X6(t),Y6(t),X7(t),Y7(t),X8(t),Y8(&lt;br /&gt;unset multiplot&lt;br /&gt;pause -1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;4.5 Resultado&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen4-744377.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen4-744374.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style=" font-weight: bold; font-size:24px;"&gt;Splines de Catmull-Rom&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;1 Teor´ıa y base matematica &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Al igual que los splines de Hermite, los splines Catmull-Rom son polinomio de interpolaci´on por &lt;/span&gt;tramos c´ubicos con tangentes especiﬁcas en los puntos extremos en los limites de cada secci´on de la curva. La diferencia es que no introducimos los valores de las tangentes en los puntos extremos. En un spline CR, la pendiente en en el punto de control se calcula a partir de las coordenadas de los dos puntos de control adyacentes.&lt;div&gt;&lt;br /&gt;Una secci´on de un spline queda completamente determinada con cuatro puntos de control consecutivos. Los puntos de control centrales son los puntos extremos de la secci´on, y otros dos los puntos se utilizan en el calculo de las pendientes en los puntos extremos. Si tomamos P(u) como la representaci´on de la funci´on de punto param´etrica cubica de la secci´on de curva entre los puntos de control Pk−1 hasta Pk+1 se utilizan para establecer las condiciones en los limites de la secci´on del spline de este modo:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-10-741868.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-10-741866.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por tanto, las pendientes en los puntos de control Pk y Pk+1 se toman proporcionales, respectivamente, a las cuerdas Pk&lt;br /&gt;−1 Pk+1 y Pk Pk+2 el par´ametro t se denomina par´ametro de tensi´on, ya que controla como de ﬂo jo o apretado se a justa el spline a los puntos de control de entrada.&lt;br /&gt;Utilizando m´etodos similares a los utilizados para los polinomios Hermite, podemos convertir las condiciones de (2.1) de los limites en su forma matricial,&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-11-714179.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-11-714176.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Donde la Matriz Catmun-Rom es:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-12-767498.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-12-767495.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;con s = (1 − t)/2.&lt;br /&gt;Desarrollando la Ecuacion matricial (2.2) en forma polinomica, tenemos:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-13-727067.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-13-727064.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;donde los polinomios C ARK (u) con K = 0, 1, 2, 3 son las funciones de combinacion de la matriz base de los splines Catmull-Rom.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;2 El caso del Curva Catmull-Rom&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;2.1 Se propone el siguiente P.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-14-783287.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-14-783286.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;2.2 Se tienen unos M’s de:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-15-730052.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-15-730045.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;De donde obtenemos la matriz base de Catmull-Rom multiplicandolas:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-16-776092.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-16-776090.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;2.3 Con lo que nos queda un P(u).&lt;br /&gt;&lt;/span&gt;Obtenemos C ARen conformidad con (2.2) para obtener (2.4) matricial(P (u)).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-17-730748.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-17-730722.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;2.4 El Codigo en GNUPLOT&lt;br /&gt;&lt;/span&gt;&lt;code&gt;&lt;br /&gt;P1(t) = (-0.5*t*t*t + 1*t*t - 0.5*t + 0)&lt;br /&gt;P2(t) = ( 1.5*t*t*t - 2.5*t*t + 0*t + 1)&lt;br /&gt;P3(t) = (-1.5*t*t*t + 2*t*t + 0.5*t + 0)&lt;br /&gt;P4(t) = ( 0.5*t*t*t - 0.5*t*t + 0*t + 0)&lt;br /&gt;x1(t) = 1*P1(t) + 2*P2(t) + 4*P3(t) + 6*P4(t)&lt;br /&gt;y1(t) = 8*P1(t) + 3*P2(t) + 8*P3(t) + 3*P4(t)&lt;br /&gt;x2(t) = 2*P1(t) + 4*P2(t) + 6*P3(t) + 8*P4(t)&lt;br /&gt;y2(t) = 3*P1(t) + 8*P2(t) + 3*P3(t) + 8*P4(t)&lt;br /&gt;x3(t) = 4*P1(t) + 6*P2(t) + 8*P3(t) + 10*P4(t)&lt;br /&gt;y3(t) = 8*P1(t) + 3*P2(t) + 8*P3(t) + 3*P4(t)&lt;br /&gt;x4(t) = 4*P1(t) + 6*P2(t) + 8*P3(t) + 20*P4(t)&lt;br /&gt;y4(t) = 8*P1(t) + 3*P2(t) + 8*P3(t) + 20*P4(t)&lt;br /&gt;set xrange [0:10]&lt;br /&gt;set yrange [0:10]&lt;br /&gt;set multiplot&lt;br /&gt;plot ’puntos.txt’ w p ps 2&lt;br /&gt;set parametric&lt;br /&gt;set trange [0:1]&lt;br /&gt;plot x1(t), y1(t), x2(t), y2(t), x3(t), y3(t) ,x4(t), y4(t)&lt;br /&gt;unset multiplot&lt;br /&gt;pause -1&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;2.5 Resultado&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen5-744740.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen5-744738.png" border="0" alt="" /&gt;&lt;/a&gt;</description><link>http://cinvestav.onlyangel.net/2007/12/trazo-de-splines.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-4961633510769245615</guid><pubDate>Wed, 12 Dec 2007 20:47:00 +0000</pubDate><atom:updated>2008-01-09T23:33:43.280-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Tarea</category><category domain='http://www.blogger.com/atom/ns#'>Graficación</category><title>Mi carro con PovRay</title><description>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Mi carro con PovRay&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Dibujado de un carro en OpenGL utilizando  ????&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Jose Angel Espinoza Portillo&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Graficacion • 14 Diciembre 2007&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://cinvestav.onlyangel.net/files/PovRay.pdf"&gt;PDF File&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano5-738315.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano5-738309.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Que es Pov-Ray?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Pov-Ray es una herramienta que sirve para generar ambientes en 3D, basada la técnica de trazo de rayo. La cual consiste en dividir el campo de visión en una maya de pixeles y evaluar simular un rayo que pasa por cada pixel y evalúa el objeto que choca y el rebote de la luz desde todos los objetos y las fuentes de luz en el. y así sucesivamente con cada pixel, un ejemplo de esta técnica se puede ver en en la siguiente figura.&lt;br /&gt;&lt;br /&gt;Implementación&lt;br /&gt;Como implementar y que pasos seguir para el dibujado.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;Base&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;De manera similar que en Open GL se programan muchas cosas dentro del código, el primer paso antes de empezar a implementar el carro es especificar las características básicas las cuales se especifican a continuación:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano1-793896.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano1-793892.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include "colors.inc"&lt;br /&gt;#include "shapes.inc"&lt;br /&gt;#include "textures.inc"&lt;br /&gt;&lt;br /&gt;camera {&lt;br /&gt;location &lt;2,5,&gt;&lt;br /&gt;look_at &lt;0,&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;background { color SkyBlue }&lt;br /&gt;light_source { &lt;20,&gt; color rgb&lt;1,&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Esto posesionara la cámara en el punto &lt;15,&gt; mirando hacia &lt;0,&gt;, define el fondo en color azul cielo y posiciona una fuente de luz blanca en las coordenadas &lt;20,&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Plano&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Ahora se procede a agregar el siguiente código para integrar un plano infinito dentro de la vista:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano2-702480.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano2-702450.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;plane { y, 1&lt;br /&gt;pigment { checker Green, White }&lt;br /&gt;finish { ambient .3 diffuse .7 }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;El valor de pigment le dice que va a ser una maya de cuadros a continuación de los colores de los cuadros.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano3-795599.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano3-795575.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Cielo&lt;/span&gt;&lt;br /&gt;Para simular el cielo, se agrega una esfera, la cual es magnificada para abarcar el espacio del cielo. Esta esfera es creada de la siguiente manera:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#declare Sky = sky_sphere {&lt;br /&gt;pigment {&lt;br /&gt;gradient y&lt;br /&gt;color_map {&lt;br /&gt;[0.75  color CornflowerBlue]&lt;br /&gt;[1.00  color MidnightBlue]&lt;br /&gt;}                                            &lt;br /&gt;scale 2&lt;br /&gt;translate &lt;-1, -1, -1&gt;&lt;br /&gt;}&lt;br /&gt;pigment {&lt;br /&gt;bozo&lt;br /&gt;turbulence 0.6&lt;br /&gt;octaves 7&lt;br /&gt;omega .49876&lt;br /&gt;lambda 2.5432&lt;br /&gt;color_map {&lt;br /&gt;[0.0 color rgbf&lt;.75, .75, .75, 0.1&gt;]&lt;br /&gt;[0.4 color rgbf&lt;.9, .9, .9, .9&gt;]&lt;br /&gt;[0.7 color rgbf&lt;1,&gt;]&lt;br /&gt;}&lt;br /&gt;scale 6/10&lt;br /&gt;scale &lt;1,&gt;&lt;br /&gt;}&lt;br /&gt;pigment {&lt;br /&gt;bozo&lt;br /&gt;turbulence 0.6&lt;br /&gt;octaves 8&lt;br /&gt;omega .5123&lt;br /&gt;lambda 2.56578&lt;br /&gt;color_map {&lt;br /&gt;[0.0 color rgbf&lt;.375, .375, .375, 0.2&gt;]&lt;br /&gt;[0.4 color rgbf&lt;.45, .45, .45, .9&gt;]&lt;br /&gt;[0.6 color rgbf&lt;0.5,&gt;]&lt;br /&gt;}&lt;br /&gt;scale 6/10&lt;br /&gt;scale &lt;1,&gt;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;sky_sphere { Sky }&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:18px;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;El carrito&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Los colores&lt;/span&gt;&lt;/div&gt;Para hacer el carro primero se especificaron las 6 texturas del objeto pertenecientes a cada lado del mismo especificandole un grado de refleccion y el material del mismo(metal) de la siguiente manera:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#declare TRed = texture {&lt;br /&gt;pigment { color rgb&lt;0.8,&gt; }&lt;br /&gt;finish {&lt;br /&gt;reflection {0.5 metallic}&lt;br /&gt;diffuse 0.4&lt;br /&gt;&lt;br /&gt;brilliance 2&lt;br /&gt;specular 1 roughness 0.01&lt;br /&gt;metallic&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;#declare TGreen = texture {&lt;br /&gt;pigment { color rgb&lt;0.2,&gt; }&lt;br /&gt;finish {&lt;br /&gt;reflection {0.5 metallic}&lt;br /&gt;diffuse 0.4&lt;br /&gt;&lt;br /&gt;brilliance 2&lt;br /&gt;specular 1 roughness 0.01&lt;br /&gt;metallic&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;#declare TBlue = texture {&lt;br /&gt;pigment { color rgb&lt;0.2,&gt; }&lt;br /&gt;finish {&lt;br /&gt;reflection {0.5 metallic}&lt;br /&gt;diffuse 0.4&lt;br /&gt;&lt;br /&gt;brilliance 2&lt;br /&gt;specular 1 roughness 0.01&lt;br /&gt;metallic&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#declare TWhite = texture {&lt;br /&gt;pigment { color rgb&lt;0.8,&gt; }&lt;br /&gt;finish {&lt;br /&gt;reflection {0.5 metallic}&lt;br /&gt;diffuse 0.4&lt;br /&gt;&lt;br /&gt;brilliance 2&lt;br /&gt;specular 1 roughness 0.01&lt;br /&gt;metallic&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;#declare TViolet = texture {&lt;br /&gt;pigment { color rgb&lt;0.8,&gt; }&lt;br /&gt;finish {&lt;br /&gt;reflection {0.5 metallic}&lt;br /&gt;diffuse 0.4&lt;br /&gt;&lt;br /&gt;brilliance 2&lt;br /&gt;specular 1 roughness 0.01&lt;br /&gt;metallic&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#declare TPurple = texture {&lt;br /&gt;pigment { color rgb&lt;0.8,&gt; }&lt;br /&gt;finish {&lt;br /&gt;reflection {0.5 metallic}&lt;br /&gt;diffuse 0.4&lt;br /&gt;&lt;br /&gt;brilliance 2&lt;br /&gt;specular 1 roughness 0.01&lt;br /&gt;metallic&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;La figura&lt;br /&gt;&lt;/span&gt;Basado en la figura diseñada para el mismo proyecto en OpenGL se implemento un objeto mesh basado en mayas de triángulos especificando que textura tiene cada triángulo esto se dibuja de la siguiente manera:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano4-740314.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano4-740307.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mesh {&lt;br /&gt;&lt;br /&gt;triangle {&lt;br /&gt;&lt;0,&gt;, &lt;5,&gt;, &lt;5,&gt;&lt;br /&gt;texture { TRed }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;0,&gt;, &lt;5,&gt;, &lt;0,&gt;&lt;br /&gt;texture { TRed }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;1.25,&gt;, &lt;3.75,&gt;, &lt;3.75,&gt;&lt;br /&gt;texture { TRed }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;1.25,&gt;, &lt;3.75,&gt;, &lt;1.25,&gt;&lt;br /&gt;texture { TRed }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;triangle {&lt;br /&gt;&lt;0,&gt;, &lt;5,&gt;, &lt;5,&gt;&lt;br /&gt;texture { TGreen }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;0,&gt;, &lt;5,&gt;, &lt;0,&gt;&lt;br /&gt;texture { TGreen }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;triangle {&lt;br /&gt;&lt;0,&gt;, &lt;0,&gt;, &lt;0,&gt;&lt;br /&gt;texture { TWhite }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;0,&gt;, &lt;0,&gt;, &lt;0,&gt;&lt;br /&gt;texture { TWhite }   &lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;1.25,&gt;, &lt;1,&gt;, &lt;1,&gt;&lt;br /&gt;texture { TWhite }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;1.25,&gt;, &lt;1,&gt;, &lt;1.25,&gt;&lt;br /&gt;texture { TWhite }   &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;triangle {&lt;br /&gt;&lt;0,&gt;, &lt;5,&gt;, &lt;5,&gt;&lt;br /&gt;texture { TViolet }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;0,&gt;, &lt;5,&gt; &lt;0,&gt;&lt;br /&gt;texture { TViolet }   &lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;1,&gt;, &lt;4,&gt;, &lt;3.75,&gt;&lt;br /&gt;texture { TViolet }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;1,&gt;, &lt;3.75,&gt;, &lt;1.25,&gt;&lt;br /&gt;texture { TViolet }   &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;triangle {&lt;br /&gt;&lt;5,&gt;, &lt;5,&gt;, &lt;5,&gt;&lt;br /&gt;texture { TBlue }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;5,&gt;, &lt;5,&gt;,  &lt;5,&gt;&lt;br /&gt;texture { TBlue }   &lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;4,&gt;, &lt;4,&gt;, &lt;3.75,&gt;&lt;br /&gt;texture { TBlue }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;4,&gt;, &lt;3.75,&gt;, &lt;3.75,&gt;&lt;br /&gt;texture { TBlue }   &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;triangle {&lt;br /&gt;&lt;5,&gt;, &lt;0,&gt;, &lt;0,&gt;&lt;br /&gt;texture { TPurple }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;5,&gt;, &lt;0,&gt;,  &lt;5,&gt;&lt;br /&gt;texture { TPurple }   &lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;3.75,&gt;, &lt;1.25,&gt;, &lt;1,&gt;&lt;br /&gt;texture { TPurple }&lt;br /&gt;}&lt;br /&gt;triangle {&lt;br /&gt;&lt;3.75,&gt;, &lt;1,&gt;, &lt;4,&gt;&lt;br /&gt;texture { TPurple }   &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;rotate x*-90&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Cámara&lt;br /&gt;Para efectos de presentación se moverá la cámara a otro punto para poder notar mejor la sombra y el efecto de reflejo de el piso en el objeto, reemplazando la cámara por lo siguiente.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano5-742839.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/fondoyplano5-742835.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;camera {&lt;br /&gt;location &lt;15,&gt;&lt;br /&gt;look_at &lt;0,&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description><link>http://cinvestav.onlyangel.net/2007/12/mi-carro-con-povray.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-3121992190257305853</guid><pubDate>Wed, 12 Dec 2007 20:06:00 +0000</pubDate><atom:updated>2007-12-12T12:47:11.834-08:00</atom:updated><title>BRAZO ARTICULADO CON ILUMINACIÓN</title><description>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;BRAZO ARTICULADO CON ILUMINACIÓN&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Implementando la estructura de un brazo articulado con movimiento en 4 grados de libertad  e iluminación artificial&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Jose Angel Espinoza Portillo&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Otoño 2007&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://cinvestav.onlyangel.net/files/brazoArticulado.pdf"&gt;Versión PDF&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/image001-776033.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/image001-776027.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Definiendo el problema&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;Dibujar un brazo articulado en 3D que pueda moverse con las pulsaciones de teclas e implementar un sistema de iluminación que permita ver un reflejo de la luz en la estructura del brazo.&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Primer paso - Colocar la cámara&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Como en la analogía del camarógrafo explicado en clase, el primero paso es colocar la cámara apuntando hacia donde esta lo que se desea visualizar, para esto cargamos la matriz de proyección y especificamos el punto de vista basado en la elevación de la cámara y el ángulo de visión (rotado en el eje y) y llamamos gluLookAt para ser ejecutado con esas coordenadas mirando al origen, con el siguiente código:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;glMatrixMode (GL_PROJECTION);&lt;br /&gt;glLoadIdentity ();&lt;br /&gt;&lt;br /&gt;gluPerspective(30,1,0.01,100);&lt;br /&gt;&lt;br /&gt;glMatrixMode(GL_MODELVIEW);&lt;br /&gt;glLoadIdentity ();             /* clear the matrix */&lt;br /&gt;eye[0] =  zoom *sin(azi*3.1416/180) * cos(ele*3.1416/180);&lt;br /&gt;eye[1] =  zoom *sin(ele*3.1416/180) ;&lt;br /&gt;eye[2] =  zoom *cos(azi*3.1416/180) * cos(ele*3.1416/180);&lt;br /&gt;&lt;br /&gt;gluLookAt(eye[0],eye[1],eye[2],0,0,0,0,1,0);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Iluminación&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/image004-754509.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/image004-754507.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;Lo que se quiere lograr con la iluminación es tener un efecto de reflejo de la luz blanca en las superficies de as figuras, con respecto a la cámara y la fuente de luz (que se colocara en el punto (1,1,1)),  y que el material del objeto permanezca del color que se le da a el objeto esto se hace habilitando el GL_COLOR_MATERIAL, esto se realiza con el siguiente código:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// Define el punto de origen de luz y su brillo&lt;br /&gt;GLfloat light0_pos[]={1.0,1.0,1.0,1.0};&lt;br /&gt;GLfloat shininess[]={5.0}; // Mientras mas pequeño da la apariencia de mas brillo.&lt;br /&gt;&lt;br /&gt;glEnable(GL_LIGHTING);// habilita la iluminación&lt;br /&gt;glEnable(GL_LIGHT0);&lt;br /&gt;&lt;br /&gt;Color_white[0]=1.0;     Color_white[1]=1.0;   Color_white[2]=1.0;   Color_white[3]=1.0;&lt;br /&gt;Color_blue[0]=0.0;    Color_white[1]=0.0;   Color_white[2]=1.0;   Color_white[3]=1.0;&lt;br /&gt;&lt;br /&gt;// Configura los puntos de luz&lt;br /&gt;glLightfv(GL_LIGHT0,GL_POSITION,light0_pos);&lt;br /&gt;glLightfv(GL_LIGHT0,GL_AMBIENT,Color_white);&lt;br /&gt;glLightfv(GL_LIGHT0,GL_DIFFUSE,Color_white);&lt;br /&gt;glLightfv(GL_LIGHT0,GL_SPECULAR,Color_white);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mat[0][0]=1.0;   mat[0][1]=1.0; mat[0][2]=1.0; mat[0][3]=1.0;&lt;br /&gt;&lt;br /&gt;glEnable(GL_COLOR_MATERIAL);// Se habilita que respete el color de la forma como&lt;br /&gt;glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); // el color del material&lt;br /&gt;&lt;br /&gt;glMaterialfv(GL_FRONT,GL_SPECULAR,&amp;amp;mat[0][0]); // Se especifica la luz especular.&lt;br /&gt;glMaterialfv(GL_FRONT,GL_SHININESS,shininess);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/image014-779871.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/image014-779867.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/image012-748233.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/image012-748230.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/image010-799197.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/image010-799190.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/image008-766871.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/image008-766864.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/image006-740458.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://cinvestav.onlyangel.net/uploaded_images/image006-740453.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;El brazo articulado.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;C&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;omo se comento al inicio del reporte se desea dibujar un brazo articulado el cual esta constituido por tres piezas movibles y una base rotatoria y la transformación que se le haga a cada uno de los elementos desde la base debe afectar a todos los demás elementos hasta la punta, para esto se baso en ir aplicando las transformaciones entre dibujado y dibujado de cada parte del brazo, así las nuevas partes dibujadas heredaran las transformaciones anteriores. Para hacer esto se utilizo el siguiente código:&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;float h0=2,h1=5,h2=4,h3=4;&lt;br /&gt;&lt;br /&gt;glMatrixMode (GL_MODELVIEW);&lt;br /&gt;glPushMatrix();&lt;br /&gt;&lt;br /&gt;RotaX(-90);&lt;br /&gt;&lt;br /&gt;RotaZ(angulo1);&lt;br /&gt;DibujaCilindro(2,2,h0,20,Color_blue);&lt;br /&gt;&lt;br /&gt;RotaY(angulo2);&lt;br /&gt;DibujaCilindro(.5,.2,h1,20,Color_blue);&lt;br /&gt;&lt;br /&gt;RotaY(angulo3);&lt;br /&gt;DibujaCilindro(.4,.2,h2,20, Color_blue);&lt;br /&gt;&lt;br /&gt;RotaY(angulo4);&lt;br /&gt;DibujaCilindro(.4,.2,h3,20, Color_blue);&lt;br /&gt;&lt;br /&gt;glPopMatrix();&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Donde Rotax, RotaX y RotaZ son funciones donde están implementadas las matrices de transformación de cada una de estas rotaciones.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Modificación desde el teclado.&lt;br /&gt;&lt;/span&gt;En el código anterior se a mostrado como iluminar y dibujar un objeto en 3D, pero no se a explicado la manera en que se modifican las variables de donde se toman los valores para guiarse en el dibujado.&lt;br /&gt;&lt;br /&gt;Estas instrucciones se hacen directamente desde el teclado modificando las variables de los parámetros usados anteriormente.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;float step = 10;&lt;br /&gt;switch (event-&gt;key()) {&lt;br /&gt;case Qt::Key_Plus:&lt;br /&gt;       signo = 1;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_Minus:&lt;br /&gt;       signo = -1;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_Left:&lt;br /&gt;       azi += step;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_Right:&lt;br /&gt;azi -= step;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_PageDown:&lt;br /&gt;zoom += 1;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_PageUp:&lt;br /&gt;zoom -= 1;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_Up:&lt;br /&gt;ele += step;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_Down:&lt;br /&gt;ele -= step;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_T:&lt;br /&gt;angulo1 += 10;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_G:&lt;br /&gt;angulo1 -= 10;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_Y:&lt;br /&gt;angulo2 += 10;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_H:&lt;br /&gt;angulo2 -= 10;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_U:&lt;br /&gt;angulo3 += 10;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_J:&lt;br /&gt;angulo3 -= 10;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_I:&lt;br /&gt;angulo4 += 10;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_K:&lt;br /&gt;angulo4 -= 10;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_D:&lt;br /&gt;lightXYZ[0] += .1;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_A:&lt;br /&gt;lightXYZ[0] -= .1;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_W:&lt;br /&gt;lightXYZ[1] += .1;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_S:&lt;br /&gt;lightXYZ[1] -= .1;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_X:&lt;br /&gt;lightXYZ[2] += .1;&lt;br /&gt;break;&lt;br /&gt;case Qt::Key_Z:&lt;br /&gt;lightXYZ[2] -= .1;&lt;br /&gt;break;&lt;br /&gt;default:&lt;br /&gt;        QWidget::keyPressEvent(event);&lt;br /&gt;}&lt;br /&gt;updateGL();&lt;br /&gt;&lt;/code&gt;</description><link>http://cinvestav.onlyangel.net/2007/12/brazo-articulado-con-iluminacin.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-424765417252945200</guid><pubDate>Wed, 28 Nov 2007 05:20:00 +0000</pubDate><atom:updated>2007-11-27T22:01:05.098-08:00</atom:updated><title>Mi carro con Degradados de colores</title><description>&lt;div style="text-align: center;"&gt;Mi carro con Degradados de colores&lt;br /&gt;Dibujado de un carro en OpenGL utilizando  ????&lt;br /&gt;&lt;a href="http://cinvestav.onlyangel.net/Tarea07.pdf"&gt;PDF File&lt;/a&gt;&lt;br /&gt;Jose Angel Espinoza Portillo&lt;br /&gt;Tarea 7 • Graficacion • 31 Octubre 2007&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Captura-2007-11-27-21-42-11-790753.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Captura-2007-11-27-21-42-11-790749.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Bases&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Se utilizara el mismo proyecto de la tarea 6 con la modificación que se le agregara el código necesario para que pueda ser mostrado con colores degradados.&lt;br /&gt;OpenGL para dibujar una figura, necesita que se le proporcionen los vértices de la misma, y si quieres que la superficie de esta figura tenga algún color antes de escribir el primer vértice se debe especificar el color que tendrá con la función glColor3f especificando los valores de Rojo, Verde y Azul en niveles del 0 al 1.&lt;br /&gt;Pero si se quiere hacer un degradado es tan fácil como asignarle u color diferente a cada nodo  antes de cada glVertex3fv poner un glColor3f especificando el color del nodo y al momento de renderizar la aplicación el OpenGL automáticamente dibuja el degradado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Captura-2007-11-27-21-40-49-735876.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Captura-2007-11-27-21-40-49-735874.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Captura-2007-11-27-21-38-57-700837.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Captura-2007-11-27-21-38-57-700835.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Implementación&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Optimizaciones para dar un buen aspecto&lt;br /&gt;￼&lt;br /&gt;Cada nodo es miembro de mas de una sola figura, así que para fines de presentación cada que se dibuje una figura que utilice un nodo compartido, este nodo tendrá el mismo color que tiene en las demás figuras a las que pertenece. Y para que no haya confusiones se hace esto con una matriz, en la cual se le asigna el color del nodo en sus valores de RVA (RGB en ingles) y mandando a dibujar. Esta matriz esta representada en el código de la siguiente manera.&lt;br /&gt;&lt;code&gt;&lt;br /&gt; v2[0][0] = 0.0; v2[0][1] = 0.0; v2[0][2] = 0.0;&lt;br /&gt; v2[1][0] = 0.0; v2[1][1] = 0.0; v2[1][2] = 1.0;&lt;br /&gt; v2[2][0] = 0.0; v2[2][1] = 1.0; v2[2][2] = 1.0;&lt;br /&gt; v2[3][0] = 1.0; v2[3][1] = 0.0; v2[3][2] = 0.0;&lt;br /&gt; &lt;br /&gt; v2[4][0] = 1.0; v2[4][1] = 0.0; v2[4][2] = 1.0;&lt;br /&gt; v2[5][0] = 1.0; v2[5][1] = 1.0; v2[5][2] = 0.0;&lt;br /&gt; v2[6][0] = 1.0; v2[6][1] = 1.0; v2[6][2] = 1.0;&lt;br /&gt; v2[7][0] = 0.0; v2[7][1] = 0.0; v2[7][2] = 0.5;&lt;br /&gt; &lt;br /&gt; v2[8][0] = 0.0; v2[8][1] = 0.5; v2[8][2] = 0.0;&lt;br /&gt; v2[9][0] = 0.0; v2[9][1] = 0.5; v2[9][2] = 0.5;&lt;br /&gt; v2[10][0] = 0.5; v2[10][1] = 0.0; v2[10][2] = 0.0;&lt;br /&gt; v2[11][0] = 0.5; v2[11][1] = 0.0; v2[11][2] = 0.5;&lt;br /&gt;&lt;br /&gt; v2[12][0] = 0.5; v2[12][1] = 0.5; v2[12][2] = 0.0;&lt;br /&gt; v2[13][0] = 0.5; v2[13][1] = 0.5; v2[13][2] = 0.5;&lt;br /&gt; v2[14][0] = 0.3; v2[14][1] = 1.0; v2[14][2] = 0.8;&lt;br /&gt; v2[15][0] = 0.0; v2[15][1] = 0.0; v2[15][2] = 1.0;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Así se asigna para v2[n][0] el valore de rojo y para v2[n][1] y v2[n][2] los valores de Verde y Azul respectivamente. Este código se ingresa en el el constructor de la clase junto a v1.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Dibujado&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;A la hora del dibujado se implementa la explicacion dada en area de Bases, pero referenciando el numero de el nodo que se esta dibujando, como lo veremos a continuacion:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;glBegin(GL_QUADS);   &lt;br /&gt;        glColor3fv( &amp;amp;v1[0][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[0][0] );&lt;br /&gt;        glColor3fv(  &amp;amp;v1[1][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[1][0] );&lt;br /&gt;        glColor3fv(&amp;amp;v1[2][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[2][0] );&lt;br /&gt;        glColor3fv(  &amp;amp;v1[3][0]);&lt;br /&gt;        glVertex3fv( &amp;amp;v1[3][0] );&lt;br /&gt;&lt;br /&gt;        glColor3fv( &amp;amp;v1[8][0]  );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[8][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[9][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[9][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[10][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[10][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[11][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[11][0] );&lt;br /&gt;&lt;br /&gt;        glColor3fv( &amp;amp;v1[12][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[12][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[13][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[13][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[14][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[14][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[15][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[15][0] );&lt;br /&gt;&lt;br /&gt;        glColor3fv( &amp;amp;v1[0][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[0][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[3][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[3][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[15][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[15][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[12][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[12][0] );&lt;br /&gt;       &lt;br /&gt;        glColor3fv( &amp;amp;v1[8][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[8][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[4][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[4][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[7][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[7][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[11][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[11][0] );&lt;br /&gt;&lt;br /&gt;        glColor3fv( &amp;amp;v1[0][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[0][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[1][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[1][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[13][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[13][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[12][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[12][0] );&lt;br /&gt;       &lt;br /&gt;        glColor3fv( &amp;amp;v1[4][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[4][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[5][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[5][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[9][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[9][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[8][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[8][0] );&lt;br /&gt;&lt;br /&gt;        glColor3fv( &amp;amp;v1[1][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[1][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[2][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[2][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[14][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[14][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[13][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[13][0] );&lt;br /&gt;       &lt;br /&gt;        glColor3fv( &amp;amp;v1[5][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[5][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[6][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[6][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[10][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[10][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[9][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[9][0] );&lt;br /&gt;       &lt;br /&gt;        glColor3fv( &amp;amp;v1[2][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[2][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[3][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[3][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[15][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[15][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[14][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[14][0] );&lt;br /&gt;       &lt;br /&gt;        glColor3fv( &amp;amp;v1[10][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[10][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[11][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[11][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[7][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[7][0] );&lt;br /&gt;        glColor3fv( &amp;amp;v1[6][0] );&lt;br /&gt;        glVertex3fv( &amp;amp;v1[6][0] );&lt;br /&gt;    glEnd();&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description><link>http://cinvestav.onlyangel.net/2007/11/mi-carro-con-degradados-de-colores.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-4873890047396163776</guid><pubDate>Wed, 28 Nov 2007 04:45:00 +0000</pubDate><atom:updated>2007-11-27T21:20:01.340-08:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Tarea</category><category domain='http://www.blogger.com/atom/ns#'>Graficación</category><title>Mi carro en Perspectiva</title><description>&lt;div style="text-align: center;"&gt;&lt;span style="font-size:180%;"&gt;Mi carro en Perspectiva&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:100%;"&gt;Dibujado de un carro en OpenGL y su proyección en Perspectiva&lt;/span&gt;&lt;br /&gt;&lt;a href="http://cinvestav.onlyangel.net/files/Tarea05.pdf"&gt;PDF File&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Jose Angel Espinoza Portillo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Tarea 5 • Graficacion • 31 Octubre 2007&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Captura-2007-11-27-21-38-57-734493.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Captura-2007-11-27-21-38-57-734490.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Trabajo realizado&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Se utilizaron unos códigos implementados en una tarea anterior donde ya esa declarada la estructura de datos para los nodos que dan la forma del carro y de las caras del mismo, ademas de un conjunto de funciones ya implementadas donde podemos modificar el código para utilizarlo para nuestros fines en este reporte.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Archivos los archivos importantes para este reporte son&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; painter.cpp&lt;/span&gt;: Donde se encuentra la interfaz de la ventana de visualización.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; quad.cpp&lt;/span&gt;: Es en este archivo donde se visualiza el modelo y también donde se dibujan y modifican las matrices de transformación implementadas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Trabajo a realizar&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Para que un objeto pueda tener una proyección en perspectiva hay que generar el efecto de que una cámara lo esta rodeando. Esta es una transformación que se puede efectuar en la matriz del objeto o en la matriz de proyección. Pero se elige hacer la modificación directamente en el modelo, ya que es preferible modificar el modelo que la proyección ya que tiene mas espacio en su pila de matrices y hay menos posibilidades de errores.&lt;br /&gt;Para eso se utilizara un método de entrada no utilizado antes en este curso. Que es el teclado para dar comandos, se designan algunas teclas para que se mueva hacia arriba, abajo y ambos lados al igual que un zoom para determinar el acercamiento o alejamiento del objeto desde el punto de vista.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;El código&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Modificaciones que se tienen que hacer a el código anterior.&lt;br /&gt;&lt;/div&gt;Para poder implementar una vista en perspectiva, se tienen que eliminar a toda relación con la visualización ortográfica empezando por las funciones glOrtho que están ubicadas por todo el archivo quad.cpp.&lt;br /&gt;Se declaran algunas variables las cuales definen la altura del punto de visión y el ángulo de rotación del mismo, ademas de una variable step la cual define la cantidad de moviendo que hay entre un estado y otro.&lt;br /&gt;Se modifica la función  keyPressEvent, la cual es la que responde a las entradas de comandos quedando como se muestra a continuación:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void Quad::keyPressEvent ( QKeyEvent * e )&lt;br /&gt;{&lt;br /&gt;float step = 10;&lt;br /&gt;switch ( tolower(e-&gt;key()) ) {&lt;br /&gt; case '+':&lt;br /&gt;     signo = 1;&lt;br /&gt;     break;&lt;br /&gt; case '-':&lt;br /&gt;     signo = -1;&lt;br /&gt;     break;&lt;br /&gt; case 'a':&lt;br /&gt;     azi -= step;&lt;br /&gt;     break;&lt;br /&gt; case 's':&lt;br /&gt;     ele -= step;&lt;br /&gt;     break;&lt;br /&gt; case 'd':&lt;br /&gt;     azi += step;&lt;br /&gt;     break;&lt;br /&gt; case 'w':&lt;br /&gt;     ele += step;&lt;br /&gt;     break;&lt;br /&gt; case 'z':&lt;br /&gt;     zoom += 1;&lt;br /&gt;     break;&lt;br /&gt; case 'x':&lt;br /&gt;     zoom -= 1;&lt;br /&gt;     break;&lt;br /&gt;}&lt;br /&gt;repaint();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;paintGL&lt;/span&gt;&lt;br /&gt;En esta función se debe de hacer la transformación de el ángulo de visión y dibujar el objeto al final para que la transformación de perspectiva surja efecto. Para esto primero hay que hacer:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;glMatrixMode (GL_PROJECTION);&lt;br /&gt;glLoadIdentity ();&lt;br /&gt;&lt;br /&gt;gluPerspective(30,1,0.01,100);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;que carga la matriz defaul a GL_PROJECTION la carga y la asigna una perspectiva.&lt;br /&gt;Luego se hacen los cálculos de el punto donde estará el ojo de visión y aplicarle la transformación a el GL_MODEL con el gluLookAt de la siguiente manera.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;glMatrixMode(GL_MODELVIEW);&lt;br /&gt;glLoadIdentity ();             /* clear the matrix */&lt;br /&gt;eye[0] =  zoom *sin(azi*PI/180) * cos(ele*PI/180);&lt;br /&gt;eye[1] =  zoom *sin(ele*PI/180) ;&lt;br /&gt;eye[2] =  zoom *cos(azi*PI/180) * cos(ele*PI/180);&lt;br /&gt;printf("%f %f %f\n",eye[0],eye[1],eye[2]);&lt;br /&gt;gluLookAt(eye[0],eye[1],eye[2],0,0,0,0,1,0);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;recordando que zoom, azi y ele están controlados por las teclas presionadas.&lt;br /&gt;Esto debe de estar antes de dibujar el objeto ya que esto definirá la posición en que se dibujara el objeto en el espacio y en la pantalla.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Captura-2007-11-27-21-42-11-710185.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Captura-2007-11-27-21-42-11-710183.jpg" alt="" border="0" /&gt;&lt;/a&gt;</description><link>http://cinvestav.onlyangel.net/2007/11/mi-carro-en-perspectiva.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-6778427527633960708</guid><pubDate>Sat, 27 Oct 2007 02:00:00 +0000</pubDate><atom:updated>2007-10-26T19:02:49.511-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Graficación</category><category domain='http://www.blogger.com/atom/ns#'>Notas</category><title>Curbas cubicas paramétricas</title><description>Las curvas cubicas paramétricas son las de menor grado que no son planas en 3D. Los tres coeficientes de un polinomio de segundo grado pueden estar completamente especificados por tres puntos y tres puntos definen a un plano.&lt;br /&gt;&lt;br /&gt;Los polinomios cúbicos que definen un segmento de cuva Q(t)=[x(t) y(t) z(t)] sonde la forma:&lt;br /&gt;&lt;br /&gt;figura 01&lt;br /&gt;&lt;br /&gt;Cada polinomio cubico tiene cuatro coeficientes, por lo que se requieren cuatro restricciones, que nos permitan formular cuatro ecuaciones en las cuatro incognitas y poder resolver el sistema de ecuaciones.&lt;br /&gt;&lt;br /&gt;Las curbas que se discutiran son:&lt;br /&gt;- Hermite&lt;br /&gt;- Bezier&lt;br /&gt;- Otros splines&lt;br /&gt;&lt;br /&gt;* Hermite usa los punots terminales y los rectores tengente enlos puntos terminales&lt;br /&gt;&lt;br /&gt;figura 02&lt;br /&gt;&lt;br /&gt;* Bezier, esta definido por los dos puntos temrinales y otros dos puntos de control que controlan a los vecotes gtangente en lospuntos terminales&lt;br /&gt;&lt;br /&gt;figura 03&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para ver como os coeficientes de la ec (1) pueden depender de cuatro restricciones, se escribe la matriz de coeficientes como&lt;br /&gt;&lt;br /&gt;C = M.G&lt;br /&gt;Donde M es la matriz base y G es un vector columna de cuatro elementos de las condiciones, tales como los puntos termianles y los vectores tangente , que definen a la curva.&lt;br /&gt;Se usara G. para referirse al vector columna de solo los componentes x del vector de geometria.&lt;br /&gt;&lt;br /&gt;Q(t) = T.C&lt;br /&gt;    4x3&lt;br /&gt;&lt;br /&gt;C = M.G&lt;br /&gt;&lt;br /&gt;Los elementos de M y G son constantes, de forma qeu el produto T.M.G es justo los tres polinomios cubicos en t&lt;br /&gt;Q(t) = [x(t) y(t) z(t)]&lt;br /&gt;&lt;br /&gt;figura 04&lt;br /&gt;&lt;br /&gt;esta ecuacion enfatiza que la curva es una suma ponderada de los elementos de la matriz de geometria&lt;br /&gt;&lt;br /&gt;B = T.M funciones mezcla (blending functions)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Splines Hermite&lt;br /&gt;La curva esta determinada por los puntos terminales P1 y P4  y los vectores tangente R1 y R4 a los puntos teminales.&lt;br /&gt;Tenemso que halar la matriz base Mh&lt;br /&gt;&lt;br /&gt;Q(t) = T.Mh.Gh&lt;br /&gt;&lt;br /&gt;Gh es el vector de geometria Hermite tomando su componente en x:&lt;br /&gt;&lt;br /&gt;figura 05 (1)&lt;br /&gt;&lt;br /&gt;figura 06 (2)&lt;br /&gt;&lt;br /&gt;Las restricciones sobre x(0) y x(1) pueden encontrarse por sustitucion directa en la ec. (2).&lt;br /&gt;&lt;br /&gt;figura 07</description><link>http://cinvestav.onlyangel.net/2007/10/curbas-cubicas-paramtricas.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-7314467440052448682</guid><pubDate>Fri, 26 Oct 2007 22:48:00 +0000</pubDate><atom:updated>2007-10-26T16:04:32.850-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Graficación</category><category domain='http://www.blogger.com/atom/ns#'>Notas</category><title>Pila de matrices</title><description>NOTA: Port falta de medios no puedo subir algunas figuras que se explican en el pizarron por eso solo pongo lo copiado en la computadora, lo siento.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;void glPushMatrix(void)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mete en la pila todas las matrices actuales. La pila usada esta determinada por gl &lt;span style="font-weight: bold;"&gt;MatrixMode()&lt;/span&gt;. Se copia la matriz en el tope de la pila de forma que su contenido se duplica  tanto en el tope y la segunda matriz de la pila. Si se meten muchas matrices, se genera un error.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;void glPopMatrix(void)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Saca la matrix tope de la pila, destruyendo el contenido de la matriz. la pila viada esta determinada por &lt;span style="font-weight: bold;"&gt;glMatrixMode&lt;/span&gt;(). Si la pila solo contiene una matriz, llamar esta función genera un error.&lt;br /&gt;&lt;br /&gt;En el modo &lt;span style="font-weight: bold;"&gt;MODELVIEW&lt;/span&gt; tenemos al menos una pila de 32 matrices&lt;br /&gt;En el modo &lt;span style="font-weight: bold;"&gt;PROJECTION&lt;/span&gt; tenemos al menos una pila de 2 matrices&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Figura 01&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Realmente la cámara no existe en OpenGL. Dentro del modo &lt;span style="font-weight: bold;"&gt;PROJECTION&lt;/span&gt; solo debe llamarse a &lt;span style="font-weight: bold;"&gt;LoadIdentity&lt;/span&gt;() para limpiar la matrix y a &lt;span style="font-weight: bold;"&gt;Ortho&lt;/span&gt;() o &lt;span style="font-weight: bold;"&gt;Frustrum&lt;/span&gt;(), (o a &lt;span style="font-weight: bold;"&gt;glePerspective())&lt;/span&gt;&lt;br /&gt;Las transformaciones de la cámara realmente devén de realizarse en el modo &lt;span style="font-weight: bold;"&gt;MODELVIEW&lt;/span&gt;. Si no se hace así habrá problemas el calcular la iluminación y la niebla.&lt;br /&gt;La transformacion para crear la proyección oblicua si debe de crearse en el modo &lt;span style="font-weight: bold;"&gt;PROJECTION&lt;/span&gt;.</description><link>http://cinvestav.onlyangel.net/2007/10/pila-de-matrices.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-6035874919017055880</guid><pubDate>Sat, 20 Oct 2007 08:08:00 +0000</pubDate><atom:updated>2007-10-20T01:53:34.422-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Tarea</category><category domain='http://www.blogger.com/atom/ns#'>Graficación</category><title>Mi carro en OpenGL</title><description>&lt;div style="text-align: center;"&gt;&lt;a href="http://cinvestav.onlyangel.net/files/Tarea04-Mi%20carro%20en%20OpenGL.pdf"&gt;Vercion en PDF&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Mi carro en OpenGL&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Dibujado de un carro en OpenGL y su proyección Ortogonal&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Jose Angel Espinoza Portillo&lt;br /&gt;Tarea 4 • Graficacion • 24 Octubre 2007&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-4-763057.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-4-763055.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;&lt;span style="font-size:180%;"&gt;El FrameWork&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Se utilizo un conjunto de códigos pre-configurados y listos para cargar una entidad de &lt;a href="http://opengl.org/"&gt;OpenGL&lt;/a&gt; en un widget de Qt, estos códigos fueron entregados por el Dr. Luis Gerardo de la Fraga y pude ser encontrado en el siguiente sitio: &lt;a href="http://delta.cs.cinvestav.mx/%7Efraga/Cursos/Graficacion/2007/"&gt;http://delta.cs.cinvestav.mx/~fraga/Cursos/Graficacion/2007/&lt;/a&gt;.&lt;br /&gt;Algunas de las funciones ya implementadas son la rotación al dar click en el QGLWidget y arrastrar hacia alguna dirección.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Archivos&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Utilizando el fr&lt;span style="font-size:100%;"&gt;amework original de trabajo llamado “quad”. El cual contiene los archivos de código siguientes:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt; &lt;span style="font-weight: bold;"&gt;painter.cpp &lt;/span&gt;y&lt;span style="font-weight: bold;"&gt; painter.h&lt;/span&gt;:  Implementación del QWidget es la ventana principal del sistema, aquí se implementan los botones, geometría, eventos y elementos que se observan en la ventana de la aplicación.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt; &lt;span style="font-weight: bold;"&gt;quad.cpp &lt;/span&gt;y&lt;span style="font-weight: bold;"&gt; quad.h&lt;/span&gt;: Implementa del QGLWidget que representa a el área en la cual se va a dibujar. Incluye funciones de trazado de inicialización de estados y de modos de renderización de el área de trazado.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt; &lt;span style="font-weight: bold;"&gt;main.cpp&lt;/span&gt;: Es el código que iniciativa la aplicación y le da la ejecución a el Qt para que interprete las instrucciones especificadas en canvas.cpp.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Diseño de el Carro&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Especificación de las características de el carro y sus vértices.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/estructuras-752934.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/estructuras-752932.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Antes de empezar a programar hay que desarrollar una estructura de hilos para identificar la forma de el vehículo vista desde varios ángulos, y para especificar la dimensión de sus puntos (vértices).&lt;br /&gt;&lt;br /&gt;De las estructuras anteriores se tomara la distancia de sus puntos desde un origen imaginario para definir un arreglo de vectores v1.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Definiendo el arreglo “v1”&lt;/span&gt;&lt;br /&gt;Este arreglo se define en el archivo quad.h, para que pueda usarse en la clase, es inicializada en el constructor junto a su especificación con los puntos que en ella se representan de la siguiente manera.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Quad::Quad( QWidget *parent, const char *name )&lt;br /&gt;...;&lt;br /&gt;v1[0][0] = 0.0; v1[0][1] = 0.0; v1[0][2] = 4.0;&lt;br /&gt;v1[1][0] = 5.0; v1[1][1] = 0.0; v1[1][2] = 4.0;&lt;br /&gt;v1[2][0] = 5.0; v1[2][1] = 8.0; v1[2][2] = 4.0;&lt;br /&gt;v1[3][0] = 0.0; v1[3][1] = 8.0; v1[3][2] = 4.0;&lt;br /&gt;&lt;br /&gt;v1[4][0] = 1.0; v1[4][1] = 2.0; v1[4][2] = 4.0;&lt;br /&gt;v1[5][0] = 4.0; v1[5][1] = 2.0; v1[5][2] = 4.0;&lt;br /&gt;v1[6][0] = 4.0; v1[6][1] = 7.0; v1[6][2] = 4.0;&lt;br /&gt;v1[7][0] = 1.0; v1[7][1] = 7.0; v1[7][2] = 4.0;&lt;br /&gt;&lt;br /&gt;v1[8][0] = 1.25; v1[8][1] = 2.75; v1[8][2] = 5.25;&lt;br /&gt;v1[9][0] = 3.75; v1[9][1] = 2.75; v1[9][2] = 5.25;&lt;br /&gt;v1[10][0] = 3.75; v1[10][1] = 6.1; v1[10][2] = 5.25;&lt;br /&gt;v1[11][0] = 1.25; v1[11][1] = 6.1; v1[11][2] = 5.25;&lt;br /&gt;&lt;br /&gt;v1[12][0] = 0.0; v1[12][1] = 0.0; v1[12][2] = 1.0;&lt;br /&gt;v1[13][0] = 5.0; v1[13][1] = 0.0; v1[13][2] = 1.0;&lt;br /&gt;v1[14][0] = 5.0; v1[14][1] = 8.0; v1[14][2] = 1.0;&lt;br /&gt;v1[15][0] = 0.0; v1[15][1] = 8.0; v1[15][2] = 1.0;&lt;br /&gt;...;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Definiendo los valores en v1[n][o], v1[n][1] y v1[n][2] en los planos ‘x’, ‘y’ y ‘z’ respectivamente.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Dibujando el Carro&lt;/span&gt;&lt;br /&gt;El arreglo anterior no es suficiente para que una figura sea dibujada en el espacio tridimensional, hay que indicarle a el OpenGL como debe unir los puntos anteriores y esto se hace como a continuación:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void Quad::paintGL(void){&lt;br /&gt;...;&lt;br /&gt;glBegin(GL_QUADS);&lt;br /&gt;glColor3f( 1.0, 0.0, 0.0 );&lt;br /&gt;glVertex3fv( &amp;amp;v1[0][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[1][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[2][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[3][0] );&lt;br /&gt;&lt;br /&gt;glVertex3fv( &amp;amp;v1[8][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[9][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[10][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[11][0] );&lt;br /&gt;&lt;br /&gt;glColor3f( 0.0, 1.0, 0.0 );&lt;br /&gt;glVertex3fv( &amp;amp;v1[12][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[13][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[14][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[15][0] );&lt;br /&gt;&lt;br /&gt;glColor3f( 1.0, 1.0, 1.0 );&lt;br /&gt;glVertex3fv( &amp;amp;v1[0][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[3][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[15][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[12][0] );&lt;br /&gt;&lt;br /&gt;glVertex3fv( &amp;amp;v1[8][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[4][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[7][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[11][0] );&lt;br /&gt;&lt;br /&gt;glColor3f( 0.0, 0.0, 1.0 );&lt;br /&gt;glVertex3fv( &amp;amp;v1[0][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[1][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[13][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[12][0] );&lt;br /&gt;&lt;br /&gt;glVertex3fv( &amp;amp;v1[4][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[5][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[9][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[8][0] );&lt;br /&gt;&lt;br /&gt;glColor3f( 1.0, 1.0, 0.0 );&lt;br /&gt;glVertex3fv( &amp;amp;v1[1][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[2][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[14][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[13][0] );&lt;br /&gt;&lt;br /&gt;glVertex3fv( &amp;amp;v1[5][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[6][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[10][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[9][0] );&lt;br /&gt;&lt;br /&gt;glColor3f( 1.0, 0.0, 1.0 );&lt;br /&gt;glVertex3fv( &amp;amp;v1[2][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[3][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[15][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[14][0] );&lt;br /&gt;&lt;br /&gt;glVertex3fv( &amp;amp;v1[10][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[11][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[7][0] );&lt;br /&gt;glVertex3fv( &amp;amp;v1[6][0] );&lt;br /&gt;glEnd();&lt;br /&gt;...;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Problemas&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-3-726938.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-3-726935.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Al implementar el código anterior se detecto un problema con el eje de rotación y  la orientación de los puntos, el dibujo se dibujaba como en esta figura:&lt;br /&gt;Para solucionar estos problemas se le resto a todos los puntos la mitad del punto con mayor unidad de cada vértice y se intercambiaron los puntos de ‘z’ y ‘y’ con el siguiente código:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;for (n=0;n&lt;16;n++){ n="0;n&lt;16;n++){" u =" v1[n][1];"&gt;&lt;br /&gt;&lt;/code&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;&lt;br /&gt;Calculando la proyección&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Utilizando  una matriz de transformación.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Principios matemáticos&lt;/span&gt;&lt;br /&gt;Como fue visto en clase para hacer una proyección ortogonal es necesario un valor l para indicar la “Profundidad” visible del objeto y un ángulo a para designar la inclinación de la proyección y asignarlo a una matriz para especificar que transformación, la cual esta expresada en la Tabla (matriz) 01.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-5-729225.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-5-729218.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Tabla (matriz) 01&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;La cual multiplicada por la matriz de el objeto se dará el efecto deseado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Implementación&lt;/span&gt;&lt;br /&gt;Para la implementación de matrices en OpenGL se debe utilizar matrices tipo cuaternion que se implementa como un vector de 16 elementos de algún tipo en este caso GLfloat (que es una implementación de OpenGL que garantiza la potabilidad del tipo float en diferentes arquitecturas ) y se declara:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;GLfloat  matriz2[16];&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Como básicamente es una matriz con ceros, se asignaron estos (los ceros) a todos los elementos y luego basandonos las posiciones de los indices señalados en la Tabla 02.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-6-723256.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-6-723255.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;Tabla 02&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Se escribió la matriz de la siguiente manera:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;matriz2[0]=1;&lt;br /&gt;matriz2[2]=-l*cos((angle*PI)/180);&lt;br /&gt;matriz2[5]=1;&lt;br /&gt;matriz2[6]=-l*sin((angle*PI)/180);&lt;br /&gt;matriz2[15]=1;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Y luego antes de escribir el código de la representación de la figura escribir:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;glMultMatrixf(matriz2);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Problema&lt;/span&gt;&lt;br /&gt;Pero al implementar este código tal cual con las bases antes mencionadas encontrábamos otro problema, que era básicamente que no parecía dibujar nada en la pantalla, después de algunas comprobaciones matemáticas y con otros objetos nos percatamos de un patrón del error, el cual era básicamente la inversión de los indices de la matriz y fue en ese momento donde se descubrió que OpenGL no interpretaba los indices del cuaternion de la manera que inducimos sino como en la Tabla 03, y al final queda como a continuación:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-7-742189.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-7-742187.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;matriz2[0]=1;&lt;br /&gt;matriz2[8]=-l*cos((angle*PI)/180);&lt;br /&gt;matriz2[5]=1;&lt;br /&gt;matriz2[9]=-l*sin((angle*PI)/180);&lt;br /&gt;matriz2[10] = 0.00001; /* Arregla un depth bug */&lt;br /&gt;matriz2[15]=1;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Donde se usan l y angle que explicare a continuación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;       Tabla 03&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;El painter&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Dibujado de los componentes a utilizar&lt;br /&gt;&lt;/div&gt;Se implementan por primera vez los objetos QSlider, para dar mas inter actividad a el sistema y conectandolo a unos SLOTS’s en el quad que modifican el valor de &lt;span style="font-style: italic;"&gt;a (angulo)&lt;/span&gt; o&lt;span style="font-style: italic;"&gt; l &lt;/span&gt;que se usan en el proceso de dibujado de el objeto en la ventana OpenGL.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-1-739199.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-1-739196.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;Forma final de el Ejecutable&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;El cual tiene un switch entre la manipulación (Rotación) de el objeto que el Dr. de la Fraga tenia implementado originalmente con el nuevo objeto y la vista de la proyección del cuerpo. Los slides que modifican los valores de &lt;span style="font-style: italic;"&gt;l &lt;/span&gt;y &lt;span style="font-style: italic;"&gt;a (angulo)&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Conclución&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Es relativamente sencillo crear objetos 3D en OpenGL, pero lo que es complicado es la estructura que devén de tener los datos para su apropiado manejo.&lt;/li&gt;&lt;li&gt;Nunca seré un diseñador de autos.&lt;/li&gt;&lt;/ul&gt;</description><link>http://cinvestav.onlyangel.net/2007/10/mi-carro-en-opengl.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-2326559455087280133</guid><pubDate>Fri, 19 Oct 2007 21:25:00 +0000</pubDate><atom:updated>2007-10-20T01:57:11.044-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Ciencia</category><category domain='http://www.blogger.com/atom/ns#'>Libros</category><title>En Defensa de la Ciencia</title><description>&lt;div style="text-align: justify;"&gt;Ultima mente el estilo de vida y mi capacidad económica me a obligado a asomarme a unas "excelentes" librerías que existen en esta gran ciudad donde agrupan una gran cantidad de libros usados. Y después de no encontrar mucho en el área de sistemas me moví a la estantería y encontré un espécimen que me llamo la atención e inmediatamente lo tome con migo y me retire con el por la tremenda suma de $30.00 MN con un ejemplar escrito por el &lt;a href="http://www.congresotam.gob.mx/galardo/2006/galardonado06.asp"&gt;Doctor Rui Pérez Tamayo.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Dr.Ruy-Perez-Tamayo-793466.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Dr.Ruy-Perez-Tamayo-793463.JPG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Dr. Ruiz Perez Tamayo&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;El Doctor Pérez Tamayo ha sido miembro de diferentes Sociedades Científicas, dentro de las que destacan el ser miembro extranjero del American College of Physicians; Fundador de la Asociación Mexicana de Patólogos; Sociedad de Becarios e Internos del Instituto Nacional de Cardiología; Sociedad Médica del Hospital General entre muchas otras, pero lo que me interesa de este personaje es que gano el premio nacional de ciencias, hace varios años (unos 20 mas o menos). Este libro es solo una de sus aportaciones a la cultura de el pais tratando de hacer una critica del estado de las ciencias en el momento en que fue publicado (1976).&lt;br /&gt;&lt;br /&gt;Esta es una lectura que e empesado a leer en estos ultimos dias y espero si la escuela me lo permite terminarlo en un par mas para poder comentarlo extensivamente.&lt;br /&gt;&lt;/div&gt;</description><link>http://cinvestav.onlyangel.net/2007/10/en-defensa-de-la-ciencia.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-6159896307684441755</guid><pubDate>Tue, 02 Oct 2007 04:32:00 +0000</pubDate><atom:updated>2007-10-11T09:20:47.675-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Tarea</category><category domain='http://www.blogger.com/atom/ns#'>Graficación</category><title>Dibujando un Reguilete</title><description>&lt;div style="text-align: center;"&gt;&lt;a href="http://cinvestav.onlyangel.net/files/DibujoDeReguilete.pdf"&gt;Vercion en PDF&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Con QT y C++&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Jose Angel Espinoza Portillo&lt;br /&gt;Graficación&lt;br /&gt;Septiembre - Octubre 2007&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Preámbulo&lt;/span&gt;&lt;br /&gt;Utilizando el framework original de trabajo llamado “linetest”. El cual contiene los archivos de código siguientes:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt; painter.cpp y painter.h&lt;/span&gt;:  Implementación del QWidget es la ventana principal del sistema, aquí se implementan los botones, geometría, eventos y elementos que se observan en la ventana de la aplicación.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;canvas.cpp y canvas.h&lt;/span&gt;: Implementa del QWidget que representa a el área en la cual se va a dibujar. Incluye funciones de trazado de lineas las cuales son la función en la que me base para dibujar el REGUILETE.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;main.cpp: &lt;/span&gt;Es el código que iniciativa la aplicación y le da la ejecución a el Qt para que interprete las instrucciones especificadas en canvas.cpp.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cinvestav.onlyangel.net/uploaded_images/Imagen-3-773256.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://cinvestav.onlyangel.net/uploaded_images/Imagen-3-773254.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-style: italic;"&gt;Figura 1.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Insertar Botones a el FrameWork proporcionado&lt;/span&gt;&lt;br /&gt;Se agrego el inicio del constructor de Painter::Painter() en painter.cpp&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;QPushButton *boton1 = new QPushButton("Direccion");&lt;br /&gt;boton1-&gt;setFont( QFont( "Times", 18, QFont::Bold ) );&lt;br /&gt;connect( boton1, SIGNAL(clicked()), canvas, SLOT(changeDirection()) );&lt;br /&gt;&lt;br /&gt;QPushButton *boton2 = new QPushButton("Start/Stop");&lt;br /&gt;boton2-&gt;setFont( QFont( "Times", 18, QFont::Bold ) );&lt;br /&gt;connect( boton2, SIGNAL(clicked()), canvas, SLOT(switchMotioin()) );&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Para crear la instancia en memoria de los botones con nombres boton1 y boton2.&lt;br /&gt;Al final de la misma función se agrego:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;leftBox-&gt;addWidget( boton1 );&lt;br /&gt;leftBox-&gt;addWidget( boton2 );&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Justo antes del “setLayout(grid);”, al compilar se vera una pantalla como en la Figura 1.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Comunicación entre el Canvas y el Painter&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Este proceso a sido documentado anteriormente, así que me limito a agregar solo las modificaciones realizadas para este proyecto.&lt;br /&gt;Se agregaron los Slots changeDirection y switchMotioin, para que puedan se accesados desde los botones del painter como se explico en el punto anterior y timeDone para se acezado desde un objeto QTimer, que se explicara a continuación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Solucionando el Problema&lt;/span&gt;&lt;br /&gt;Como un requisito de este problema es hacer que los reguiletes roten, se necesitó planear 3 partes:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Desarrollar una función drawReguilete&lt;/span&gt; a la cual le pasan por parámetros el numero de astas del reguilete y su centro y lo dibuja.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Agregar un QTimer&lt;/span&gt; para determinar el lapso para cambio de coordenadas rotación.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Programar las funciones que administren los estados&lt;/span&gt; de los últimos dos, puntos.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Desarrollando la función drawReguilete()&lt;/span&gt;&lt;br /&gt;Basado en la implementación ya dada por el profesor para dibujar un destello la función de reguilete se implemento como sigue:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void Canvas::drawReguilete(int cx, int cy, int lados, QPainter *p){&lt;br /&gt;int incrang = 360/lados; // Incremento del angulo para saber el angulo medio de cada hoja del reguilete&lt;br /&gt;int l = 50; // Se define un largo l de las lineas de las hojas&lt;br /&gt;&lt;br /&gt;int n = 360/incrang; //Se define el numero de repeticiones del algoritmo&lt;br /&gt;&lt;br /&gt;for ( int i=0; i&lt;n; ang="i*incrang;" float="" px="Round(" py="Round(" px2="Round(" int="" py2="Round(" val="l*cos(ang+10)"&gt;setPen(QColor("Blue"));&lt;br /&gt;   MidPointLine( cx, cy, px, py, p ); // Se dibuja la linea superior&lt;br /&gt;   MidPointLine( cx, cy, px2, py2, p );// Se dibuja la linea inferior&lt;br /&gt;   MidPointLine( px2, py2, px, py, p );// Se dibuja la linea que une las anteriores para cerrarla&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/n;&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Agregando el QTimer&lt;/span&gt;&lt;br /&gt;Esta es un objeto que te llama una función cada determinado tiempo que el programador le especifique, para implementarla en el código, se agrego la siguiente librería en canvas.cpp:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &lt;qtimer.h&gt;&lt;br /&gt;&lt;/qtimer.h&gt;&lt;/code&gt;&lt;br /&gt;y dentro del constructor Canvas::Canvas() se agrego el siguiente codigo:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;tiempo = new QTimer(this);&lt;br /&gt;connect( tiempo, SIGNAL(timeout()), this, SLOT(timeDone()));&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;El cual instancia en memoria el el objeto QTimer, en la variable tiempo, y la conecta en su SIGNAL timeout() al objeto canvas en su SLOT timeDone(), el cual se describe a continuación:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void Canvas::timeDone(){&lt;br /&gt;angulo += (10 * direccion);&lt;br /&gt;repaint();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;En este código se puede ver que se presenta la variable dirección, esta es manejada por las funciones de administración de estados y define la dirección de rotación de los reguiletes, también se observa la variable ángulo que se usa en el dibujado de el reguilete, como el ángulo acumulado de rotación del sistema.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Funciones de administración de estados.&lt;/span&gt;&lt;br /&gt;Las siguientes funciones son las que responden a los SLOTS changeDirection y switchMotioin las cuales administran el cambio de estados de el reguilete por medio de la variables globales dirección y tiempo.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;void Canvas::changeDirection(){&lt;br /&gt; direccion *= -1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void Canvas::switchMotioin(){&lt;br /&gt; if (tiempo-&gt;isActive()){&lt;br /&gt;     tiempo-&gt;stop();&lt;br /&gt; }else{&lt;br /&gt;     tiempo-&gt;start(400);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;En changeDirection solo se multiplica su contenido por -1 haciendo que a todo lo que sea multiplicado esta variable tendrá una dirección contraria a la original.&lt;br /&gt;Y en switchMotioin se pregunta a tiempo si esta activo (si se esta ejecutando algún tonteo de lapsos), si es así lo detiene de lo contrario lo inicia.</description><link>http://cinvestav.onlyangel.net/2007/10/dibujando-un-reguilete.html</link><author>noreply@blogger.com (OnlyAngel.Net Place)</author></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-8573900667626592024.post-5615159749060287156</guid><pubDate>Fri, 21 Sep 2007 08:46:00 +0000</pubDate><atom:updated>2007-10-10T19:25:20.641-07:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Tarea</category><category domain='http://www.blogger.com/atom/ns#'>Graficación</category><title>Dibujar Fractales.</title><description>&lt;a href="http://cinvestav.onlyangel.net/files/Graficacion%20-%20Tarea02%20-%20documento.pdf"&gt;Vercion en PDF&lt;/a&gt;&lt;br /&gt;&lt;style&gt;&lt;br /&gt;&lt;!--&lt;br /&gt; /* Font Definitions */&lt;br /&gt;@font-face&lt;br /&gt; {font-family:"Times New Roman";&lt;br /&gt; panose-1:0 2 2 6 3 5 4 5 2 3;&lt;br /&gt; mso-font-charset:0;&lt;br /&gt; mso-generic-font-family:auto;&lt;br /&gt; mso-font-pitch:variable;&lt;br /&gt; mso-font-signature:50331648 0 0 0 1 0;}&lt;br /&gt;@font-face&lt;br /&gt; {font-family:\BC14\D0D5;&lt;br /&gt; panose-1:0 0 0 0 0 0 0 0 0 0;&lt;br /&gt; mso-font-charset:129;&lt;br /&gt; mso-generic-font-family:auto;&lt;br /&gt; mso-font-format:other;&lt;br /&gt; mso-font-pitch:fixed;&lt;br /&gt; mso-font-signature:16777216 0 103022593 0 524288 0;}&lt;br /&gt;@font-face&lt;br /&gt; {font-family:"Hoefler Text";&lt;br /&gt; panose-1:0 2 3 6 2 5 5 6 2 2;&lt;br /&gt; mso-font-charset:0;&lt;br /&gt; mso-generic-font-family:auto;&lt;br /&gt; mso-font-pitch:variable;&lt;br /&gt; mso-font-signature:50331648 0 0 0 1 0;}&lt;br /&gt;@font-face&lt;br /&gt; {font-family:"\30D2\30E9\30AE\30CE\660E\671D Pro W6";&lt;br /&gt; mso-font-charset:0;&lt;br /&gt; mso-generic-font-family:roman;&lt;br /&gt; mso-font-pitch:auto;&lt;br /&gt; mso-font-signature:0 0 0 0 0 0;}&lt;br /&gt;@font-face&lt;br /&gt; {font-family:"Euphemia UCAS Bold";&lt;br /&gt; panose-1:0 2 11 8 3 4 1 2 2 1;&lt;br /&gt; mso-font-charset:0;&lt;br /&gt; mso-generic-font-family:auto;&lt;br /&gt; mso-font-pitch:variable;&lt;br /&gt; mso-font-signature:50331648 0 0 0 1 0;}&lt;br /&gt;@font-face&lt;br /&gt; {font-family:Monaco;&lt;br /&gt; panose-1:0 2 0 5 0 0 0 0 0 0;&lt;br /&gt; mso-font-charset:0;&lt;br /&gt; mso-generic-font-family:auto;&lt;br /&gt; mso-font-pitch:variable;&lt;br /&gt; mso-font-signature:50331648 0 0 0 1 0;}&lt;br /&gt; /* Style Definitions */&lt;br /&gt;p.MsoNormal, li.MsoNormal, div.MsoNormal&lt;br /&gt; {mso-style-parent:"";&lt;br /&gt; margin:0cm;&lt;br /&gt; margin-bottom:.0001pt;&lt;br /&gt; line-height:120%;&lt;br /&gt; mso-pagination:widow-orphan;&lt;br /&gt; font-size:12.0pt;&lt;br /&gt; font-family:"Hoefler Text";&lt;br /&gt; color:black;&lt;br /&gt; mso-ansi-language:ES-TRAD;&lt;br /&gt; text-underline:black;}&lt;br /&gt;p.MsoToc1, li.MsoToc1, div.MsoToc1&lt;br /&gt; {mso-style-parent:"";&lt;br /&gt; margin-top:12.0pt;&lt;br /&gt; margin-right:0cm;&lt;br /&gt; margin-bottom:0cm;&lt;br /&gt; margin-left:54.0pt;&lt;br /&gt; margin-bottom:.0001pt;&lt;br /&gt; mso-pagination:widow-orphan;&lt;br /&gt; tab-stops:right 446.0pt;&lt;br /&gt; font-size:9.0pt;&lt;br /&gt; font-family:"Hoefler Text";&lt;br /&gt; color:black;&lt;br /&gt; mso-ansi-language:ES-TRAD;&lt;br /&gt; text-underline:black;}&lt;br /&gt;p.MsoToc2, li.MsoToc2, div.MsoToc2&lt;br /&gt; {mso-style-parent:"";&lt;br /&gt; margin-top:12.0pt;&lt;br /&gt; margin-right:0cm;&lt;br /&gt; margin-bottom:3.0pt;&lt;br /&gt; margin-left:18.0pt;&lt;br /&gt; mso-pagination:widow-orphan;&lt;br /&gt; tab-stops:right 446.0pt;&lt;br /&gt; font-size:14.0pt;&lt;br /&gt; font-family:"Hoefler Text";&lt;br /&gt; color:black;&lt;br /&gt; mso-ansi-language:ES-TRAD;&lt;br /&gt; text-underline:black;&lt;br /&gt; font-style:italic;}&lt;br /&gt;p.MsoToc3, li.MsoToc3, div.MsoToc3&lt;br /&gt; {mso-style-parent:"";&lt;br /&gt; margin-top:12.0pt;&lt;br /&gt; margin-right:0cm;&lt;br /&gt; margin-bottom:3.0pt;&lt;br /&gt; margin-left:0cm;&lt;br /&gt; mso-pagination:widow-orphan;&lt;br /&gt; tab-stops:right 446.0pt;&lt;br /&gt; font-size:18.0pt;&lt;br /&gt; font-family:"Hoefler Text";&lt;br /&gt; color:black;&lt;br /&gt; mso-ansi-language:ES-TRAD;&lt;br /&gt; text-underline:black;&lt;br /&gt; font-style:italic;}&lt;br /&gt;table.MsoNormalTable&lt;br /&gt; {mso-style-parent:"";&lt;br /&gt; font-size:10.0pt;&lt;br /&gt; font-family:"Times New Roman";}&lt;br /&gt;p.Piedepgina, li.Piedepgina, div.Piedepgina&lt;br /&gt; {mso-style-name:"Pie de página";&lt;br /&gt; mso-style-parent:"";&lt;br /&gt; margin:0cm;&lt;br /&gt; margin-bottom:.0001pt;&lt;br /&gt; line-height:120%;&lt;br /&gt; mso-pagination:widow-orphan;&lt;br /&gt; tab-stops:right 453.25pt;&lt;br /&gt; font-size:12.0pt;&lt;br /&gt; font-family:"Hoefler Text";&lt;br /&gt; color:black;&lt;br /&gt; mso-ansi-language:ES-TRAD;&lt;br /&gt; text-underline:black;&lt;br /&gt; font-style:italic;}&lt;br /&gt;p.Ttulo, li.Ttulo, div.Ttulo&lt;br /&gt; {mso-style-name:Título;&lt;br /&gt; mso-style-parent:"";&lt;br /&gt; mso-style-next:"Título secundario";&lt;br /&gt; margin:0cm;&lt;br /&gt; margin-bottom:.0001pt;&lt;br /&gt; text-align:center;&lt;br /&gt; line-height:120%;&lt;br /&gt; mso-pagination:widow-orphan;&lt;br /&gt; page-break-after:avoid;&lt;br /&gt; font-size:22.0pt;&lt;br /&gt; font-family:"Hoefler Text";&lt;br /&gt; color:#50813D;&lt;br /&gt; text-transform:uppercase;&lt;br /&gt; letter-spacing:2.2pt;&lt;br /&gt; mso-ansi-language:ES-TRAD;&lt;br /&gt; text-underline:#50813D;}&lt;br /&gt;p.Ttulosecundario, li.Ttulosecundario, div.Ttulosecundario&lt;br /&gt; {mso-style-name:"Título secundario";&lt;br /&gt; mso-style-parent:"";&lt;br /&gt; mso-style-next:"Líneas de autoría";&lt;br /&gt; margin-top:0cm;&lt;br /&gt; margin-right:0cm;&lt;br /&gt; margin-bottom:18.0pt;&lt;br /&gt; margin-left:0cm;&lt;br /&gt; text-align:center;&lt;br /&gt; line-height:120%;&lt;br /&gt; mso-pagination:widow-orphan;&lt;br /&gt; font-size:16.0pt;&lt;br /&gt; font-family:"Hoefler Text";&lt;br /&gt; color:black;&lt;br /&gt; mso-ansi-language:ES-TRAD;&lt;br /&gt; text-underline:black;&lt;br /&gt; font-style:italic;}&lt;br /&gt;p.Lneasdeautora, li.Lneasdeautora, div.Lneasdeautora&lt;br /&gt; {mso-style-name:"Líneas de autoría";&lt;br /&gt; mso-style-parent:"";&lt;br /&gt; margin:0cm;&lt;br /&gt; margin-bottom:.0001pt;&lt;br /&gt; text-align:center;&lt;br /&gt; line-height:120%;&lt;br /&gt; mso-pagination:widow-orphan;&lt;br /&gt; font-size:12.0pt;&lt;br /&gt; font-family:"Hoefler Text";&lt;br /&gt; color:black;&lt;br /&gt; mso-ansi-language:ES-TRAD;&lt;br /&