Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
numbers:graphics [2010/04/03 19:16] alfred |
numbers:graphics [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 2: | Línea 2: | ||
| ===== Geometría ===== | ===== Geometría ===== | ||
| + | |||
| + | |||
| + | |||
| ==== Problemas geométricos comunes ==== | ==== Problemas geométricos comunes ==== | ||
| + | * [[http://www.devmag.org.za/articles/245-BASIC-VECTOR-RECIPES/#topall]] | ||
| Ampliaremos la siguiente clase en [[highlevel:processing|Processing]]: | Ampliaremos la siguiente clase en [[highlevel:processing|Processing]]: | ||
| <code java> | <code java> | ||
| Línea 38: | Línea 42: | ||
| } | } | ||
| </code> | </code> | ||
| - | * **Distancia entre un punto y una línea** | + | * **Distancia entre un punto y una línea**, el siguiente código devuelve la distancia entre un punto P a la lína que pasa entre A y B: |
| <code java> | <code java> | ||
| + | public double pointToLineDistance(Point A, Point B, Point P) | ||
| + | { | ||
| + | double normalLength = Math.sqrt((B.x - A.x) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y)); | ||
| + | return Math.abs((P.x - A.x) * (B.y - A.y) - (P.y - A.y) * (B.x - A.x)) / normalLength; | ||
| + | } | ||
| </code> | </code> | ||
| **Saber si dos líneas son paralelas** | **Saber si dos líneas son paralelas** | ||
| Línea 47: | Línea 55: | ||
| **Está la línea sobre dos puntos?** \\ | **Está la línea sobre dos puntos?** \\ | ||
| **Un punto está en el ángulo de visión?** \\ | **Un punto está en el ángulo de visión?** \\ | ||
| - | |||
| - | ===== Transformaciones ===== | ||
| + | ===== Transformaciones ===== | ||
| + | ==== Traslación ==== | ||
| + | {{numbers:graf:translacion.png?300|}} | ||
| + | === Por suma === | ||
| + | Trasladaremos la posición (20, 30) unas (50, -100) posiciones: \\ | ||
| + | {{numbers:graf:translacion_por_suma.png|}} | ||
| + | === Por multiplicación === | ||
| + | Trasladaremos la posición (20, 30) unas (50, -100) veces: \\ | ||
| + | {{numbers:graf:translacion_por_multiplicacion.png|}} | ||
| Línea 57: | Línea 72: | ||
| + | ==== Rotación ==== | ||
| + | === Rotación 2d === | ||
| + | La multiplicación de un vector 2d por la siguiente matriz: \\ | ||
| + | <m> | ||
| + | delim{[} { matrix{2}{2}{{cos(alpha)} {-sen(alpha)} {sen(alpha)} {cos(alpha)} } } {]} | ||
| + | </m> \\ | ||
| + | devolverá otro vector 2d que será el equivalente al primero pero rotado //alpha// radianes. | ||
| + | === Rotación 3d (X, Y, Z) === | ||
| + | Se utilizarán vectores de 3 dimensiones (o de cuatro con el último término a 0). \\ | ||
| + | :?: No tengo claro cual es cual: \\ | ||
| + | <m> | ||
| + | delim{[} { matrix{4}{4}{ 1 0 0 0 0 {cos(alpha)} {-sen(alpha)} 0 0 {sen(alpha)} {cos(alpha)} 0 0 0 0 1 } } {]} | ||
| + | </m> \\ | ||
| + | <m> | ||
| + | delim{[} { matrix{4}{4}{ {cos(alpha)} 0 {sen(alpha)} 0 0 1 0 0 {-sen(alpha)} 0 {cos(alpha)} 0 0 0 0 1 } } {]} | ||
| + | </m> \\ | ||
| + | <m> | ||
| + | delim{[} { matrix{4}{4}{ {cos(alpha)} {-sen(alpha)} 0 0 {sen(alpha)} {cos(alpha)} 0 0 0 0 0 1 } } {]} | ||
| + | </m> | ||
| + | ==== Escalado ==== | ||
| ===== Animaciones ===== | ===== Animaciones ===== | ||
| Línea 248: | Línea 283: | ||
| * [[http://freespace.virgin.net/hugo.elias/models/m_perlin.htm]] | * [[http://freespace.virgin.net/hugo.elias/models/m_perlin.htm]] | ||
| * [[http://devmag.org.za/articles/48-HOW-TO-USE-PERLIN-NOISE-IN-YOUR-GAMES/2/#top1]] | * [[http://devmag.org.za/articles/48-HOW-TO-USE-PERLIN-NOISE-IN-YOUR-GAMES/2/#top1]] | ||
| + | |||
| + | ===== Ecuaciones de formas ===== | ||
| + | ==== Elipse ==== | ||
| + | <code python> | ||
| + | import pygame | ||
| + | from pygame.locals import * | ||
| + | import sys | ||
| + | import math | ||
| + | w = 640 | ||
| + | h = 489 | ||
| + | screen = pygame.display.set_mode((w,h)) | ||
| + | |||
| + | sampling = 50 | ||
| + | r1 = 100 | ||
| + | r2 = 160 | ||
| + | |||
| + | def drawPoint (x,y, c=(255,0,0)): | ||
| + | centX = w/2 | ||
| + | centY = h/2 | ||
| + | nx = centX + x | ||
| + | ny = centY + y | ||
| + | pygame.draw.circle(screen, c, (int(nx), int(ny)), 1) | ||
| + | |||
| + | for i in range(sampling): | ||
| + | theta = i * (2. * 3.1421)/sampling | ||
| + | cosTheta = math.cos(theta) | ||
| + | sinTheta = math.sin(theta) | ||
| + | tmp1 = (cosTheta*cosTheta)/(r2*r2) | ||
| + | tmp2 = (sinTheta * sinTheta)/(r1*r1) | ||
| + | tmp = math.sqrt(tmp1+tmp2) | ||
| + | drawPoint(cosTheta/tmp, sinTheta/tmp) | ||
| + | |||
| + | pygame.display.flip() | ||
| + | |||
| + | while True: | ||
| + | for event in pygame.event.get(): | ||
| + | if event.type == QUIT: | ||
| + | sys.exit() | ||
| + | pygame.display.update() | ||
| + | </code> | ||