import numpy as np
import matplotlib.pyplot as plt
x= np.arange(-1,1,0.2)
y= np.arange(-1,1,0.2)
x1,y1= np.meshgrid(x,y)
z= np.cos(x1*2* np.pi)*np.exp(-y1**2-x1**2)
T = np.array([[np.array([x[i],y[j],z[i,j]]).reshape(3,1)\
for j in range(10)] for i in range(10)])
def Rx(t) :
u=t*np.pi/180
return np.array([[1,0,0],[0,np.cos(u),-np.sin(u)],\
[0,np.sin(u),np.cos(u)]])
def Rz(f) :
g=f*np.pi/180
return np.array([[np.cos(g), -np.sin(g),0],\
[np.sin(g),np.cos(g),0], [0,0,1]])
Ri=Rx(-40)@Rz(-135)
cox = lambda pt : pt[0,0]
coy = lambda pt : pt[1,0]
def proj(Ro,Te) :
s=Te.shape ; l=s[0] ; c=s[1]
vueT=np.array([[(Ro@Te[i,j])[:2] for j in range(c)]\
for i in range(l)])
for j in range(c) :
rg=[vueT[i,j] for i in range(l)]
X=list(map(cox,rg)) ; Y=list(map(coy,rg))
plt.plot(X,Y,color="blue")
for i in range(l) :
rg=[vueT[i,j] for j in range(c)]
X=list(map(cox,rg)) ; Y=list(map(coy,rg))
plt.plot(X,Y,color="red")
plt.show()
proj(Ri,T)
R=Ri@Rz(-20)
proj(R,T)
R=Rx(20)@R
proj(R,T)
t_map *ft_init_map(char *path)
{
...
ret->rx = 0.837758; // 48°
ret->ry = 0;
ret->rz = -0.585398; // -30°
...
return (ret);
z= np.cos(x1*2* np.pi)*np.exp(-y1**2-x1**2)
double **ft_matrix_rx(t_map *map)
{
double **ret;
ret = ft_alloc_matrix();
if (!ret)
exit (EXIT_FAILURE);
ret[0][0] = 1;
ret[0][1] = 0;
ret[0][2] = 0;
ret[1][0] = 0;
ret[1][1] = cos(map->rx);
ret[1][2] = -sin(map->rx);
ret[2][0] = 0;
ret[2][1] = sin(map->rx);
ret[2][2] = cos(map->rx);
return (ret);
}
double **ft_matrix_rz(t_map *map)
{
double **ret;
ret = ft_alloc_matrix();
if (!ret)
exit (EXIT_FAILURE);
ret[0][0] = cos(map->rz);
ret[0][1] = -sin(map->rz);
ret[0][2] = 0;
ret[1][0] = sin(map->rz);
ret[1][1] = cos(map->rz);
ret[1][2] = 0;
ret[2][0] = 0;
ret[2][1] = 0;
ret[2][2] = 1;
return (ret);
}
double **ft_multiply_matrix(double **rx, double **rz)
{
double **ret;
int i;
int j;
int k;
ret = ft_alloc_matrix();
if (!ret)
exit (EXIT_FAILURE);
i = -1;
while (++i < 3)
{
j = -1;
while (++j < 3)
{
k = -1;
while (++k < 3)
ret[i][j] += rx[i][k] * rz[k][j];
}
}
return (ret);
}
void ft_calculate_point(t_map *map, t_point **s)
{
int i;
int j;
double **rx;
double **rz;
double **m3;
rx = ft_matrix_rx(map);
rz = ft_matrix_rz(map);
m3 = ft_multiply_matrix(rx, rz);
j = 0;
while (j < map->hgt)
{
i = 0;
while (i < map->wdt)
{
map->init[j][i].x = s[j][i].x * m3[0][0] + s[j][i].y * m3[1][0] + s[j][i].z * m3[2][0];
map->init[j][i].y = s[j][i].x * m3[0][1] + s[j][i].y * m3[1][1] + s[j][i].z * m3[2][1];
map->init[j][i].z = s[j][i].x * m3[0][2] + s[j][i].y * m3[1][2] + s[j][i].z * m3[2][2];
map->init[j][i].color = 0x00FF0000;
i++;
}
j++;
}
}
map->init[j][i].x = s[j][i].x * m3[0][0] + s[j][i].y * m3[0][1] + s[j][i].z * m3[0][2];
map->init[j][i].y = s[j][i].x * m3[1][0] + s[j][i].y * m3[1][1] + s[j][i].z * m3[2][1]; // <-ici
map->init[j][i].z = s[j][i].x * m3[2][0] + s[j][i].y * m3[2][1] + s[j][i].z * m3[2][2];
double **ft_matrix_ry(t_map *map)
{
double **ret;
ret = ft_alloc_matrix();
if (!ret)
exit (EXIT_FAILURE);
ret[0][0] = cos(map->ry);
ret[0][1] = 0;
ret[0][2] = sin(map->ry);
ret[1][0] = 0;
ret[1][1] = 1;
ret[1][2] = 0;
ret[2][0] = -sin(map->ry);
ret[2][1] = 0;
ret[2][2] = cos(map->ry);
return (ret);
}
double **ft_matrix_euler(t_map *map)
{
double **ret;
ret = ft_alloc_matrix();
if (!ret)
exit (EXIT_FAILURE);
ret[0][0] = cos(map->rz) * cos(map->ry);
ret[0][1] = (cos(map->rz) * sin(map->ry) * sin(map->rx)) - (sin(map->rz) * cos(map->rx));
ret[0][2] = (cos(map->rz) * sin(map->ry) * cos(map->rx)) + (sin(map->rz) * sin(map->rx));
ret[1][0] = sin(map->rz) * cos(map->ry);
ret[1][1] = (sin(map->rz) * sin(map->ry) * sin(map->rx)) - (cos(map->rz) * cos(map->rx));
ret[1][2] = (sin(map->rz) * sin(map->ry) * cos(map->rx)) - (cos(map->rz) * sin(map->rx));
ret[2][0] = -sin(map->ry);
ret[2][1] = cos(map->ry) * sin(map->rx);
ret[2][2] = cos(map->ry) * cos(map->rx);
return (ret);
}
int key_hook(int keycode, t_running *run)
{
...
if (keycode == 0)
run->map->r = ft_multiply_matrix(run->map->ri, ft_matrix_rz(0.0174533));
if (keycode == 1)
run->map->r = ft_multiply_matrix(ft_matrix_rx(0.0174533), run->map->ri);
if (keycode == 2)
run->map->r = ft_multiply_matrix(run->map->ri, ft_matrix_rz(-0.0174533));
if (keycode == 13)
run->map->r = ft_multiply_matrix(ft_matrix_rx(-0.0174533), run->map->ri);
if (keycode == 0 || keycode == 1 || keycode == 2 || keycode == 13)
run->map->ri = run->map->r;
return (0);
}
Je sais pas si je suis claire
les seuls solutions que j'ai trouvé pour y remédier sont soit d'initialiser l'angle de rotation sur l'axe des x à 55° au lieu de -55°,
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :