
Generación de curvas
S1 – Semicircunferencia 1
-------------------------- DATOS S1 ---------------------------
S1: SEMICIRCUNFERENCIA 1
PUNTO INICIAL: (0,R)
CENTRO: (0,R/2)
ANGULO DE ROTACIÓN: (-3.14) // ES DECIR -180 GRADOS EN RADIANES
----------------------------------------------------------------
Para generar la curva escogemos una cantidad de puntos:
int puntos = 200;
Partimos el angulo total en la cantidad de puntos:
double ang_paso = -3.14 / puntos // -3.14 es el ángulo de rotación de S1
FÓRMULA:
x' = (x - x0) * cos(ang) + (y-y0) * sin(ang)
y' = -1 * (x - x0) * sin(ang) + (y-y0) * cos(ang)
con esto ya podemos generar las coordenadas de todos los puntos, por ejemplo el punto1 y punto2 serían:
glm::vec3 punto1;
punto1.x = (0-0) * cos(ang_paso) + (R-R/2) * sin(ang_paso);
punto1.z = -1 *(0-0) * sin(ang_paso) + (R-R/2) * cos(ang_paso);
punto1.z = 1; // no importa esta coordenada
glm::vec3 punto2;
punto1.x = (0-0) * cos(ang_paso*2) + (R-R/2) * sin(ang_paso*2);
punto1.z = -1 *(0-0) * sin(ang_paso*2) + (R-R/2) * cos(ang_paso*2);
punto1.z = 1; // no importa esta coordenada
....
Ahora podemos automatizar esto para todos los puntos:
float vertices[puntos * 3], x, y, z;
for(int i=0; i<puntos; i++){
x = (0-0) * cos(ang_paso*i) + (R-R/2) * sin(ang_paso*i);
y = -1 *(0-0) * sin(ang_paso*i) + (R-R/2) * cos(ang_paso*i);
z = 1; // no importa esta coordenada en este ejercicio
vertices[i*3] = x;
vertices[i*3+1] = y;
vertices[i*3+2] = z;
}
Esto nos generara las coordenadas de nuestra curva deseada (S1) pero el centro estará en (0,0), para corregir esto solo aplicamos una traslación a todos los puntos hacia el centro que deseamos (0,R/2,0):
(*) Tener en cuenta que la coordenada del z no importa a lo largo de este ejercicio.
glm::mat4 tras = glm::translate(glm::mat4(1.0), glm::vec3(0,R/2,0))
for (int i=0; i<puntos*3; i++){
glm::vec4 p(vertices[i], vertices[i+1], vertices[i+2], 1);
p = tras * p;
vertices[i] = p.x;
vertices[i+1] = p.y;
vertices[i+2] = p.z;
}
Luego de eso tendremos S1 en su lugar correcto.
Análogamente se generan todas las demás semicircunferencias S2 y S3 obteniendo así la forma final.
Si encuentra algún error puede colocarlo en los comentarios para contribuir a mejorar esta web.
Puede escribir al autor en rogrp6@gmail.com
¡Gracias por visitar este post!
