Compare commits
12
Commits
klein
...
experimental
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ad4f5cb077
|
||
|
|
a08b17e975
|
||
|
|
d97a35b898
|
||
|
|
b2f6707efc
|
||
|
|
7344c6bfcb
|
||
|
|
b928dcd82d
|
||
|
|
f687117fed
|
||
|
|
6d1223d79e | ||
|
|
3e3c6e676e | ||
|
|
f33b8f67b5 | ||
|
|
eb59f5346a
|
||
|
|
ee144f2286
|
No files matched your search
@@ -1,92 +1,58 @@
|
|||||||
# Manigraph: Graficadora de variedades
|
# Manigraph
|
||||||
Diaz Camacho Pedro Emilio
|
Manigraph is a cutting-edge tool for multidimentional surface visualization,
|
||||||
|
capable of handling over a hundred dimensions. It allows users to interactively
|
||||||
|
explore each dimension in an intuitive and dynamic way.
|
||||||
|
Import your .klein files, which represents multidimentional surface.
|
||||||
|
|
||||||
# Resumen
|
# Building
|
||||||
manigraph es un graficador interactiva de variedades que lee archivos binarios, con la información de
|
Manigraph is written in C99, and uses OpenGL 2.0 for the rendering. So you just
|
||||||
una variedad multidimensional y grafica esta variedad en una proyección tridimensional.
|
need a C compiler to build this project.
|
||||||
|
|
||||||
# Dependencias
|
## Source code
|
||||||
Para poder compilar el proyecto hace falta lo siguiente.
|
|
||||||
## Programas
|
|
||||||
- `cc`: Cualquier compilador de C.
|
|
||||||
- `git`: Gestor de dependencias. (Opcional)
|
|
||||||
- `make`: Herramienta para compilar automáticamente. (Opcional)
|
|
||||||
|
|
||||||
## Librerías
|
|
||||||
- `openGL`: A cross-platform API for rendering 2D and 3D graphics. (no incluida)
|
|
||||||
- `glew`: The OpenGL Extension Wrangler Library (no incluida)
|
|
||||||
- `glfw`: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input.
|
|
||||||
- `cglm`: Highly Optimized 2D / 3D Graphics Math (glm) for C.
|
|
||||||
### Linux
|
|
||||||
Para compilar `glfw` en linux hacen falta las siguientes librerías. (no incluidas)
|
|
||||||
- `x11`: libXcursor-devel libXi-devel libXinerama-devel libXrandr-devel
|
|
||||||
- `wayland`: libwayland-dev libxkbcommon-dev wayland-protocols
|
|
||||||
|
|
||||||
# Descargas
|
|
||||||
- [git](https://git-scm.com/downloads/win)
|
|
||||||
- [MinGW](https://github.com/niXman/mingw-builds-binaries/releases)
|
|
||||||
- [glew](https://glew.sourceforge.net/)
|
|
||||||
|
|
||||||
# Clonar el código fuente
|
|
||||||
```
|
```
|
||||||
git clone https://gitea.adles.top/software/manigraph.git
|
git clone https://gitea.axiolutions.top/software/manigraph.git
|
||||||
cd manigraph
|
cd manigraph
|
||||||
git submodule update --init --recursive
|
git submodule update --init --recursive
|
||||||
```
|
```
|
||||||
|
|
||||||
# Compilación
|
## Dependecies
|
||||||
Para compilar manualmente el proyecto se puede usar `make` o ejecutar los comandos manualmente
|
You may need system specific dependecies to build *Manigraph*.
|
||||||
en el código fuente de `manigraph`.
|
[Reference](https://www.glfw.org/docs/3.3/compile.html#compile_deps)
|
||||||
|
|
||||||
## Make
|
### Linux
|
||||||
Los siguientes comandos sirven para compilar `manigraph` deacuerdo al sistema operativo.
|
- `x11`: libXcursor-devel libXi-devel libXinerama-devel libXrandr-devel
|
||||||
|
- `wayland`: libwayland-dev libxkbcommon-dev wayland-protocols
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
A C compiler is needed for building *Manigraph*. and any of those commands
|
||||||
|
|
||||||
```
|
```
|
||||||
make windows
|
make windows
|
||||||
|
./compile.bat
|
||||||
make linux-x11
|
make linux-x11
|
||||||
make linux-wayland
|
make linux-wayland
|
||||||
make cocoa
|
make cocoa
|
||||||
|
make CC=emcc wasm
|
||||||
```
|
```
|
||||||
|
|
||||||
## Manualmente
|
# Design
|
||||||
se pueden compilar el proyecto manualmente sin necesidad del programa `make`.
|
Manigraph is a program designed with sustainability in mind. It is built to be
|
||||||
|
portable, resource-efficient, and easy to maintain and scale. The program
|
||||||
|
follows a Data-Oriented Programming (DOP) paradigm, where each file is
|
||||||
|
responsible for a specific data type and manages its own dependencies. Each
|
||||||
|
function is named after the file it resides in, ensuring a clear organization
|
||||||
|
and structure.
|
||||||
|
|
||||||
### GLFW
|
The independence of data types allows for efficient scaling and maintenance.
|
||||||
Si tienes problemas compilando `GLFW` puedes checar su página web oficial
|
The main file is a special case in this design: it is responsible for combining
|
||||||
explicando el tema: [Compiling GLFW](https://www.glfw.org/docs/3.3/compile.html).
|
all the data types in a comprehensive manner, actng as the workflow of the program.
|
||||||
|
|
||||||
#### Windows
|
# Contributing
|
||||||
```
|
Before commiting use `clang-format`, for coding style consistency. Your
|
||||||
cc -fPIC -shared -D_GLFW_WIN32 -D_GLFW_BUILD_DLL ./ext/glfw/src/*.c -o glfw.dll -lgdi32
|
contribution must be whitin the design principles and the concept of Manigraph.
|
||||||
```
|
|
||||||
|
|
||||||
#### Linux
|
The following diagram illustrates the relationships between files, showing how
|
||||||
```
|
they are connected through dependencies. It also highlights the scenarios where
|
||||||
cc -fPIC -shared -D_GLFW_X11 -D_GLFW_BUILD_DLL ./ext/glfw/src/*.c -o libglfw.so
|
files are not independent of one another,
|
||||||
cc -fPIC -shared -D_GLFW_WAYLAND -D_GLFW_BUILD_DLL ./ext/glfw/src/*.c -o libglfw.so
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Mac
|

|
||||||
```
|
|
||||||
cc -fPIC -shared -D_GLFW_COCOA -D_GLFW_BUILD_DLL ./ext/glfw/src/*.c -o libglfw.so
|
|
||||||
```
|
|
||||||
|
|
||||||
### Manigraph
|
|
||||||
#### Windows
|
|
||||||
```
|
|
||||||
cc -I ext/cglm/include/ -I ext/glfw/include/ src/*.c -o manigraph -L. -lglfw -lopengl32 -lglew32
|
|
||||||
```
|
|
||||||
#### Linux
|
|
||||||
```
|
|
||||||
cc -I ext/cglm/include/ -I ext/glfw/include/ src/*.c -o manigraph -L. -lglfw -lGL -lGLEW
|
|
||||||
```
|
|
||||||
#### Mac
|
|
||||||
```
|
|
||||||
cc -framework GL -I ext/cglm/include/ -I ext/glfw/include/ src/*.c -o manigraph -L. -lglfw -lGLEW
|
|
||||||
```
|
|
||||||
|
|
||||||
# Ejecutar
|
|
||||||
En linux se puede ejecutar el programa sin instalar la libreria de glfw usando:
|
|
||||||
```
|
|
||||||
LD_LIBRARY_PATH=. ./manigraph
|
|
||||||
```
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
# Estructura de archivos
|
|
||||||
Díaz Camacho Pedro Emilio
|
|
||||||
|
|
||||||
# Headers
|
|
||||||
## main.h
|
|
||||||
Este archivo incluye los prototipos internos, que va a usar el programa
|
|
||||||
funge como api interna para los desarrolladores y debe estar bien documentada.
|
|
||||||
|
|
||||||
# codigo fuente
|
|
||||||
|
|
||||||
## main.c
|
|
||||||
Este archivo debe configurar el programa antes de iniciarse, avisar de los problemas
|
|
||||||
que eviten que el programa se ejecute correctamente, iniciar y terminar los objetos que use el
|
|
||||||
programa, así como ejecutar la función principal
|
|
||||||
### Depende de
|
|
||||||
- <GL/gl.h>
|
|
||||||
|
|
||||||
## context.c
|
|
||||||
En este archivo se escoge un color para limpiar la pantalla y tiene una función para limpiar
|
|
||||||
tanto lo dibujado en pantalla, como distintos buffers gráficos.
|
|
||||||
### Depende de
|
|
||||||
- <GL/gl.h>
|
|
||||||
|
|
||||||
## input.c
|
|
||||||
Incluye la función `poll_input`, que se ejecuta en cada ciclo del programa y devuelve un
|
|
||||||
cuaternion de tipo `float *` que representa la rotación total del cubo, después de interactuar
|
|
||||||
con el programa.
|
|
||||||
### Depende de
|
|
||||||
- <GLFW/glfw3.h>
|
|
||||||
- <cglm/quat.h>
|
|
||||||
|
|
||||||
## matrix.c
|
|
||||||
Incluye las funciónes para configurar y cargar en la GPU las 3 matrices principales.
|
|
||||||
- `fix_matrix` esta matriz no cambia y se usa para configurar la perspectiva y la vista que
|
|
||||||
va a usar el programa en todo momento.
|
|
||||||
- `mdl_matrix` esta matriz depende de cada mesh y describe la rotación única de cada objeto,
|
|
||||||
se usa para rotar los ejes ortogonamente con un indice.
|
|
||||||
- `rot_matrix` esta matriz describe la rotación total de todos los objetos y se configura con
|
|
||||||
un cuaternio
|
|
||||||
### Depende de
|
|
||||||
- <cglm/mat4.h>
|
|
||||||
- <cglm/cam.h>
|
|
||||||
- <cglm/quat.h>
|
|
||||||
|
|
||||||
## mesh.c
|
|
||||||
Este archivo se usa para crear, destruir y dibujar objetos de tipo `mesh`, un `mesh` es una
|
|
||||||
colección de triángulos que describen un objeto multidimensional.
|
|
||||||
### Depende de
|
|
||||||
- <GL/gl.h>
|
|
||||||
- <stdlib.h>
|
|
||||||
|
|
||||||
## shader.c
|
|
||||||
Debe crear, destruir y usar los shaders, estos shaders son programas para la gpu escritos en glsl para
|
|
||||||
además aquí se carga memoria en gpu con las funciónes `gload_`
|
|
||||||
### Depende de
|
|
||||||
- <GL/gl.h>
|
|
||||||
|
|
||||||
## texture.c
|
|
||||||
Debe cargar, usar y destruir las texturas, que va a usar la gpu, también crea una textura
|
|
||||||
para una paleta de colores definida, esto para manipular fácilmente los colores que usará el programa.
|
|
||||||
### Depende de
|
|
||||||
- <GL/gl.h>
|
|
||||||
|
|
||||||
## window.c
|
|
||||||
Crea, usa, limpie y cierra una ventana, una ventana tiene un contexto de OpenGL asociado para poder
|
|
||||||
dibujar objetos en ella, tiene una función especial para avisar si la ventana está abierta para
|
|
||||||
dibujar.
|
|
||||||
### Depende de
|
|
||||||
- <GLFW/glfw3.h>
|
|
||||||
|
|
||||||
# Datos
|
|
||||||
## data/cube.h
|
|
||||||
Aquí esta la información del mesh de un cubo, este se va a borrar cuando podamos
|
|
||||||
importar meshes para graficarlos.
|
|
||||||
|
|
||||||
## data/axis.h
|
|
||||||
Aquí está el mesh de un solo eje, este se va a rotar para hacer los otros 2 ejes.
|
|
||||||
|
|
||||||
## data/shaders.h
|
|
||||||
Aquí estan los shaders en glsl para dibujar en pantalla
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
# Tipos de datos del proyecto
|
|
||||||
Díaz Camacho Pedro Emilio
|
|
||||||
|
|
||||||
# Introducción
|
|
||||||
En este archivo vamos a detallar los tipos de datos únicos del programa, estos
|
|
||||||
tipos de datos son estructuras que representan objetos computacionales y son
|
|
||||||
necesarios para integrar las distintas partes del programa.
|
|
||||||
|
|
||||||
## window_t
|
|
||||||
En `window.c` tenemos una estructura que es la ventana y esta se representa por `window_t`,
|
|
||||||
este tipo de dato es un pointer que es manejado por `glfw`.
|
|
||||||
|
|
||||||
## id_t
|
|
||||||
`id_t` es un tipo de dato que representa objetos de `OpenGL`, estos datos
|
|
||||||
normalmente vienen enumerados, y en `manigraph` se usan para representar `shaders`,
|
|
||||||
`programs` y `texture`.
|
|
||||||
|
|
||||||
## mesh_t
|
|
||||||
Este es un tipo de dato usado para interactuar con `mesh.c`, este representa la triangulación de un
|
|
||||||
objeto gráfico y funciona ocultando las variables que `OpenGL` necesita en un `void *`.
|
|
||||||
|
|
||||||
## mat4_t
|
|
||||||
`mat4_t` se usará para representar las matrices, se usará este tipo de dato exclusivamente
|
|
||||||
en `matrix.c` y funcionará con el tipo de dato `mat4` de `cglm`.
|
|
||||||
|
|
||||||
## quat_t
|
|
||||||
Este tipo de dato sirve para representar un quaternio, este quaternio representa la rotación
|
|
||||||
del objeto gráficado en la proyección tridimensional, y se usará para crear una matriz que
|
|
||||||
pueda entender `glsl`.
|
|
||||||
|
|
||||||
## narray
|
|
||||||
`narray` es un tipo de dato que funciona como un `array` enumerado, esto significa que el primer
|
|
||||||
elemento del `array` dice cuantos elementos tiene este, sin contar el primer elemento, y los demas elementos
|
|
||||||
funcionan como un `array` normal.
|
|
||||||
|
|
||||||
esta estructura nos ayuda a trabajar con arrays de tamaños arbitrario de forma óptima y sin tener que marcar el
|
|
||||||
último elemento de forma especial.
|
|
||||||
|
|
||||||
### narray_u8_t
|
|
||||||
es un `narray` para `char` y `unsigned char`.
|
|
||||||
### narray_float_t
|
|
||||||
es un `narray` para `float`.
|
|
||||||
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
# Manual de Diseño
|
|
||||||
Diaz Camacho Pedro Emilio
|
|
||||||
|
|
||||||
# Objetivos
|
|
||||||
## Prioridad alta
|
|
||||||
- [ ] El programa debe actualizarse cuando interactuan con el.
|
|
||||||
- [ ] El usuario quiere:
|
|
||||||
- [X] Ver 3 ejes en todo momento.
|
|
||||||
- [ ] Ver que ejes esta viendo.
|
|
||||||
- [ ] Ver cuantos ejes hay.
|
|
||||||
- [X] El usuario quiere:
|
|
||||||
- [X] Rotar estos ejes,
|
|
||||||
- [X] Ver donde quedan los ejes despues de la rotados.
|
|
||||||
- [ ] El usuario experimentado quiere ejecutar el programa y pasar la variedad:
|
|
||||||
- [ ] Como argumento del programa.
|
|
||||||
- [ ] Desde la entrada estandar del programa.
|
|
||||||
|
|
||||||
## Prioridad media
|
|
||||||
|
|
||||||
- [ ] El usuario quiere:
|
|
||||||
- [ ] Cambiar los ejes que se ven por pares.
|
|
||||||
- [ ] Cambiar los ejes donde esta la informacion de los ejes.
|
|
||||||
- [ ] El usuario quiere interactuar con el programa:
|
|
||||||
- [ ] Usando solo el mouse.
|
|
||||||
- [ ] Usando solo el teclado.
|
|
||||||
|
|
||||||
## Prioridad baja
|
|
||||||
- [ ] El usuario quiere guardar las transformaciones como un archivo GIF.
|
|
||||||
|
|
||||||
# Camino
|
|
||||||
|
|
||||||
0. Graficadora de un cubo.
|
|
||||||
1. Se hace un programa que muestre un cubo.
|
|
||||||
1. Se muestran los 3 ejes del cubo
|
|
||||||
1. Se rota el cubo en sus 3 ejes usando el teclado.
|
|
||||||
1. Se rota el cubo en sus 3 ejes usando el mouse.
|
|
||||||
1. Se muestran la etiqueta de los ejes.
|
|
||||||
1. Se hace el formato de objetos multidimensionales.
|
|
||||||
0. Programa ejemplo
|
|
||||||
1. Se hace un programa que divida un cuadrado en triangulos.
|
|
||||||
1. Se mapea cada vertice del triangulo en un punto de la cinta de
|
|
||||||
mobius usando una parametrizacion
|
|
||||||
1. Se mapea cada vertice del triangulo en un punto de la botella de
|
|
||||||
klein usando una parametrizacion
|
|
||||||
1. Se divide cada lado de un cubo de n dimensiones, en triangulos.
|
|
||||||
|
|
||||||
0. Graficadora de variedades
|
|
||||||
1. Se generaliza el programa para usar este formato.
|
|
||||||
1. Se muestran la informacion de los ejes mostrados y cuantos hay.
|
|
||||||
1. Se pueden cambiar los ejes por pares
|
|
||||||
1. Usando el mouse.
|
|
||||||
1. Usando el teclado.
|
|
||||||
0. Detalles.
|
|
||||||
1. Se anima el cambio de eje.
|
|
||||||
1. Se hace el generador de GIF.
|
|
||||||
1. Se puede cambiar el shader
|
|
||||||
1. Documentacion
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
# Problemas esperados al desarrollar
|
|
||||||
Diaz Camacho Pedro Emilio
|
|
||||||
|
|
||||||
## OpenGL esperan objetos tridimensionales, no de n dimensiones.
|
|
||||||
|
|
||||||
Usando glVertexAttribPointer podemos pasar las coordenadas que
|
|
||||||
queramos de los puntos de las variedades, y con ello usar objetos 3D en
|
|
||||||
el shader.
|
|
||||||
|
|
||||||
## Rotar ejes por pares en una animacion continua.
|
|
||||||
- Con glVertexAttribPointer podemos pasar las coordenadas del eje
|
|
||||||
seleccionado, al shader.
|
|
||||||
- Con la funcion mix del shader y bloqueando el input, podemos hacer
|
|
||||||
una animacion pasando una variable con la cpu.
|
|
||||||
- Cuando la animacion termine intercambiar los indices del layout,
|
|
||||||
usando glVertexAttribPointer otra vez.
|
|
||||||
|
|
||||||
## Volumen de la variedad.
|
|
||||||
Dado que la funcion parametrizadora es continua, mandamos la frontera
|
|
||||||
de un n-cubo a la frontera de una variedad, por lo que solo basta
|
|
||||||
graficar la frontera de la variedad.
|
|
||||||
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# Manual de usario para Manigraph
|
|
||||||
Manigraph es un graficador interactivo de variedades que lee archivos
|
|
||||||
binarios de una variedad multidimensional y los proyecta a 3 dimensiones.
|
|
||||||
|
|
||||||
# Glosario
|
|
||||||
Llamaremos a los 3 ejes de la proyección tridimensional `X`, `Y` y `Z`,
|
|
||||||
este sistema de coordenadas es derecho con el eje `Z` apuntando afuera de la pantalla
|
|
||||||
|
|
||||||
# Controles
|
|
||||||
## Teclado
|
|
||||||
- `Q` Rota el eje `X` de forma horaria.
|
|
||||||
- `W` Rota el eje `X` de forma antihoraria.
|
|
||||||
- `A` Rota el eje `Y` de forma horaria.
|
|
||||||
- `S` Rota el eje `Y` de forma antihoraria.
|
|
||||||
- `Z` Rota el eje `Z` de forma horaria.
|
|
||||||
- `X` Rota el eje `Z` de forma antihoraria.
|
|
||||||
## Mouse
|
|
||||||
- Hacer `click` en un eje lo selecciona.
|
|
||||||
- El `scroll` del mouse hace girar al eje seleccionado.
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024.1997862712624 780.4323630001875" width="2048.3995725425248" height="1560.864726000375" filter="invert(93%) hue-rotate(180deg)">
|
||||||
|
<!-- svg-source:excalidraw -->
|
||||||
|
|
||||||
|
<defs>
|
||||||
|
<style class="style-fonts">
|
||||||
|
@font-face { font-family: Excalifont; src: url(data:font/woff2;base64,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 truncated
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</defs>
|
||||||
|
<rect x="0" y="0" width="1024.1997862712624" height="780.4323630001875" fill="#ffffff"></rect><g stroke-linecap="round" transform="translate(851.1997862712624 354.71618150009374) rotate(0 81.5 35.5)"><path d="M17.75 0 C49.51 1.43, 85.67 -0.41, 145.25 0 C159.08 0.81, 160.78 5.85, 163 17.75 C162.63 23.54, 166.27 34.26, 163 53.25 C166.58 66.67, 153.59 67.99, 145.25 71 C107.15 67.76, 73.81 70.82, 17.75 71 C8.55 72.47, -2.15 63.47, 0 53.25 C1.24 39.07, -0.05 22.89, 0 17.75 C2.11 2.57, 3.08 3.01, 17.75 0" stroke="none" stroke-width="0" fill="#ffffff"></path><path d="M17.75 0 C49.22 1.7, 83.5 -0.37, 145.25 0 M17.75 0 C54.18 0.04, 91.42 -0.76, 145.25 0 M145.25 0 C157.12 0.2, 161.01 5.48, 163 17.75 M145.25 0 C156.48 0.96, 164.2 6.91, 163 17.75 M163 17.75 C164 29.04, 163.85 36.77, 163 53.25 M163 17.75 C163.54 26, 162.8 35.19, 163 53.25 M163 53.25 C162.69 65.27, 155.39 71, 145.25 71 M163 53.25 C163.03 66.53, 158.99 70.56, 145.25 71 M145.25 71 C116.76 70.51, 85.82 68.97, 17.75 71 M145.25 71 C101.35 71.52, 56.26 70.4, 17.75 71 M17.75 71 C6.29 70.71, -0.25 64.65, 0 53.25 M17.75 71 C8.13 72.54, 2.15 66.81, 0 53.25 M0 53.25 C-1.01 42.76, -0.36 35.76, 0 17.75 M0 53.25 C0.37 40.1, -0.06 27, 0 17.75 M0 17.75 C0.89 5.79, 5.76 -0.31, 17.75 0 M0 17.75 C-0.77 6.86, 4.23 -1.64, 17.75 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(896.0997862712625 377.71618150009374) rotate(0 36.60000000000002 12.5)"><text x="36.6" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">example</text></g><g stroke-linecap="round" transform="translate(481.08350232307953 354.71618150009374) rotate(0 81.5 35.5)"><path d="M17.75 0 C56.58 2.76, 97.59 1.04, 145.25 0 C153.95 0.88, 163.61 5.02, 163 17.75 C160.41 28.34, 164.42 32.48, 163 53.25 C159.99 63.69, 155.86 70.32, 145.25 71 C114.79 71.92, 92.44 70.77, 17.75 71 C3.41 72.84, -2.11 63.25, 0 53.25 C1.88 43.01, -1.31 34.17, 0 17.75 C-1.62 6.74, 7.44 -0.85, 17.75 0" stroke="none" stroke-width="0" fill="#ffffff"></path><path d="M17.75 0 C46.23 0.38, 71.83 -0.86, 145.25 0 M17.75 0 C62.89 0.55, 108 0.12, 145.25 0 M145.25 0 C158.02 1.95, 162.01 6.82, 163 17.75 M145.25 0 C159.22 0.93, 161.15 5.65, 163 17.75 M163 17.75 C163.16 28.37, 163.55 38.32, 163 53.25 M163 17.75 C163.32 31.15, 162.83 46.58, 163 53.25 M163 53.25 C161.99 64.94, 155.64 72.94, 145.25 71 M163 53.25 C164.28 66.34, 157.55 70.54, 145.25 71 M145.25 71 C114.62 69.8, 87.29 72.13, 17.75 71 M145.25 71 C101.71 70.18, 59.13 68.95, 17.75 71 M17.75 71 C7.76 72.64, -1.95 65.56, 0 53.25 M17.75 71 C4.1 71.64, -0.58 63.2, 0 53.25 M0 53.25 C2.09 43.15, -0.39 32.18, 0 17.75 M0 53.25 C-0.91 45.47, 0.17 37.32, 0 17.75 M0 17.75 C-0.21 4.5, 4.03 -1.53, 17.75 0 M0 17.75 C-1.49 8.05, 4.66 1.61, 17.75 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(534.2501689897463 377.71618150009374) rotate(0 28.33333333333337 12.5)"><text x="28.333333333333332" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">main.c</text></g><g mask="url(#mask-rhsh--Nqw0UhZ4cChM8e3)" stroke-linecap="round"><g transform="translate(848.5039775457833 393.07535597041465) rotate(0 -98.92848442705531 -2.8591744703209088)"><path d="M-1.06 0.86 C-33.93 -0.09, -165.18 -3.82, -198.12 -4.97 M0.58 0.26 C-32.38 -1.08, -166.4 -5.84, -199.21 -6.7" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(848.5039775457833 393.07535597041465) rotate(0 -98.92848442705531 -2.8591744703209088)"><path d="M-175.46 -14.5 C-179.26 -13.42, -184.73 -12.64, -199.21 -6.7 M-175.46 -14.5 C-181.5 -12.75, -188.18 -9.51, -199.21 -6.7" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(848.5039775457833 393.07535597041465) rotate(0 -98.92848442705531 -2.8591744703209088)"><path d="M-176 2.59 C-179.78 -0.12, -185.13 -3.14, -199.21 -6.7 M-176 2.59 C-182.06 -0.32, -188.6 -1.76, -199.21 -6.7" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask id="mask-rhsh--Nqw0UhZ4cChM8e3"><rect x="0" y="0" fill="#fff" width="1146.360946399894" height="498.79370491105647"></rect><rect x="698.242159785395" y="377.7161815000936" fill="#000" width="102.66666666666667" height="25" opacity="1"></rect></mask><g transform="translate(698.2421597853945 377.71618150009374) rotate(0 50.948908750995315 12.438354021268879)"><text x="51.333333333333336" y="17.619999999999997" font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">figure.klein</text></g><g stroke-opacity="0.3" fill-opacity="0.3" stroke-linecap="round" transform="translate(10 10) rotate(0 221.5 117.92569168297996)"><path d="M1.26 1.69 L442.36 1.8 L4Line truncated
|
||||||
|
After Width: | Height: | Size: 39 KiB |
@@ -0,0 +1,54 @@
|
|||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define KLEIN_IMPLEMENT
|
||||||
|
#include <klein/klein.h>
|
||||||
|
#include <klein/norm.h>
|
||||||
|
#include <klein/parm.h>
|
||||||
|
|
||||||
|
int p = 37;
|
||||||
|
int q = 1;
|
||||||
|
|
||||||
|
void lens(float *d_surface, int *coord, unsigned char * grid)
|
||||||
|
{
|
||||||
|
|
||||||
|
float norm = 0;
|
||||||
|
float sphere[4];
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
sphere[i] = ((float)coord[i] / grid[i]) - 0.5;
|
||||||
|
|
||||||
|
for(int i = 0; i < 4; i++)
|
||||||
|
norm += sphere[i] * sphere[i];
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++)
|
||||||
|
sphere[i] = sphere[i] / sqrt(norm);
|
||||||
|
|
||||||
|
d_surface[0] = (sphere[0] * cos(2 * M_PI / p)) - (sphere[1] * sin(2 * M_PI / p));
|
||||||
|
d_surface[1] = (sphere[0] * sin(2 * M_PI / p)) + (sphere[1] * cos(2 * M_PI / p));
|
||||||
|
d_surface[2] = (sphere[2] * cos(2 * M_PI * q / p)) - (sphere[3] * sin(2 * M_PI * q / p));
|
||||||
|
d_surface[3] = (sphere[2] * sin(2 * M_PI * q / p)) + (sphere[3] * cos(2 * M_PI * q / p));
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
char file_name[0xff];
|
||||||
|
struct klein klein;
|
||||||
|
struct parm parametrization = {
|
||||||
|
.grid = (unsigned char[]){8, 8,8,8},
|
||||||
|
.m = 4,
|
||||||
|
.n = 4,
|
||||||
|
.f = lens,
|
||||||
|
};
|
||||||
|
|
||||||
|
snprintf(file_name, 0xff, "%03d-%03d-cube.klein", p, q);
|
||||||
|
printf("writing %s\n", file_name);
|
||||||
|
|
||||||
|
klein_parametrize(&klein, parametrization);
|
||||||
|
klein_normalize(&klein);
|
||||||
|
klein_export_file(klein, file_name);
|
||||||
|
|
||||||
|
free(klein.vertex);
|
||||||
|
free(klein.normals);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,3 +1,16 @@
|
|||||||
|
#ifdef KLEIN_NORM_H
|
||||||
|
#error file included twice
|
||||||
|
#endif
|
||||||
|
#define KLEIN_NORM_H
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef KLEIN_H
|
||||||
|
#warning Please include klein/klein.h
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void klein_normalize(struct klein * klein);
|
||||||
|
|
||||||
|
#ifdef KLEIN_IMPLEMENT
|
||||||
static inline
|
static inline
|
||||||
void __calculate_normal( float *p1, float *p2, float *p3, float *normal, unsigned char n)
|
void __calculate_normal( float *p1, float *p2, float *p3, float *normal, unsigned char n)
|
||||||
{ unsigned char i;
|
{ unsigned char i;
|
||||||
@@ -116,3 +129,4 @@ void klein_normalize(struct klein * klein)
|
|||||||
|
|
||||||
free(norm_vec);
|
free(norm_vec);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
Reference in new issue
Block a user