%%Ing. David Said Martinez
%%Arquitectura Computacional III, Enero-Mayo de 2005
%%Programa generador de ruleta.
%%PARAMETROS DEL PROGRAMA (Pueden jugar con ellos)
%Dimension en x de la imagen
ilim = 128;%640/2; %|Pixels|
%Dimension en y de la imagen, REQUISITO, tiene que ser menor o igual que x.
jlim = 128;%480/2; %|Pixels|
%Numero de divisiones del circulo, los colores van de 1 a divs, estan
%codificados en hexadecimal y 8 bits. El maximo de divisiones es 255, duh.
divs = 35;
%%TERMINAN PARAMETROS DEL PROGRAMA
if(jlim>ilim)
%Valida que las condiciones se cumplan.
error('El programa considera que y es <= que x');
else
%Calcula un vector de coordenadas para x
x = linspace(-ilim/jlim, ilim/jlim, ilim);
%Y un vector de coordenadas para y
y = linspace(-1, 1, jlim);
%Genera la matriz de coordenadas cartesianas.
[X, Y] = meshgrid(x, y);
%Calcula la matriz de R en polares
R = sqrt(X.^2 + Y.^2);
%Calcula la matriz de theta en polares
theta = atan2(Y, X);
%Todo lo que no quepa en un circulo
theta = theta.*(R<1);
%Normalizacion de theta para dividir...
theta = theta + abs(min(min(theta)));
theta = theta./( max(max(theta) ) );
%Hace las divisiones en theta segun lo especificado. Considerar que no
% debe haber ningun gajo negro, para tener el negro como fondo...
theta = (double((uint8(theta*(divs) + 1))).*(R<1));
%Preparar otra matriz para graficar.
theta2 = im2uint8(theta/(max(max(theta))));
%Grafica de la imagen
figure(1);
imshow(theta2);
title(sprintf('Ruleta de %d x %d pixeles con %d divisiones', ilim, jlim, divs ) );
colormap default;
%Cosas que no sirven :P
figure(2);
imshow(sin(R)/max(max(R)));
title('Mapa de radios');
colormap default;
%Mas cosas que no sirven
loco = (R/max(max(R))).*im2double(theta2);
loco = abs( loco - max(max(loco))/2 );
%Ma todavia...
figure(3);
imshow( loco/max(max(loco)) );
title('Algo locochon...');
colormap default;
%%%%Comienza rutina para escribir el archivo
%Abrir el archivo...
file = fopen('ruleta.txt', 'w', 'native');
%Imprime el encabezado del rom
fprintf(file, '\tconstant ruleta : rom_type := \n\t(\n');
%Recorrer la matriz
for(jj=1:jlim)
%Cada renglon comienza con dos tabs
fprintf(file, '\t\t');
for(ii=1:ilim)
%Escribir en hexadecimal...
if( theta(jj, ii) >= 16 )
%Si es de dos digitos escribir directamente
fprintf(file, 'x"%2X"', theta(jj, ii) );
else
%Si es de un digito concatenar un 0 a la izquierda
fprintf(file, 'x"0%1X"', theta(jj, ii) );
end
%La coma va en todos excepto el ultimo elemento
if( ~(ii==ilim && jj==jlim) )
fprintf(file, ', ');
end
end
%Cada renglon termina con un fin de linea
fprintf(file, '\n');
end;
%El Rom termina con un parentesis y un punto y coma
fprintf(file, '\t);\n\n');
%Cerrar el archivo.
fclose(file);
end
%%Fin