Cómo hacer el símbolo del pentagrama con Matlab



Resumen
Un pentagrama es una estrella de cinco picos, hecha con cinco trazos. Tiene propiedades geométricas muy interesantes.

Para construirla, aquí dibujamos una linea horizontal, y la giramos mediante la función rot2d, cuyo al código encontraras al final de esta entrada. El guión del pentagrama se basa en dibujar una linea horizontal y luego rotarla. Sin embargo, se tiene cuidado de usar adecuadamente las definiciones de operaciones de matrices para obtener los vectores rotados.

Preguntas para pensar
1) ¿En que situaciones Matlab es una herramienta cómoda y adecuada para dibujar?, ¿y en situaciones Matlab es una pesima herramienta para hacer dibujos?
2) ¿Mejorando el entorno gráfico de Matlab, hace más amigable sus funciones de dibujo?

Ejercicios
1) Dibuje una estrella de David, utilizando de base los códigos de esta entrada
2) Explique con un ejemplo la importancia de de usar x = [x x(1)]; para obtener una rotación adecuada.
3) ¿En que coordenadas el punto en que gira la linea horizontal?, ¿Cómo puede especificar otro punto como pivote de los giros?

Códigos Matlab 
function [xt, yt] = rot2d(t, x, y)
% La función  rot2d rota un objeto bidimensional 
% que es representado por dos vectores: X y Y
% El ángulo de rotación es t, en radianes. 
r = [cos(t) -sin(t); sin(t) cos(t)];
x = [x x(1)];
y = [y y(1)];
z = r*[x;y];
xt = z(1,:);
 yt = z(2,:);

%guión para dibujar el pentagrama
%% Pentagrama 
%  Author: Vicente Torres Zuñiga 
%  
% Guión Matlab para graficar el símbolo de un pentagrama en el sistema 
% cartesiano
% El símbolo consiste en un círculo con un pentagrama en interior -un 
% estrella de cinco puntas dibujada con cinco lineas % 
%
% El algoritmo se enfoca en obtener las coordenadas de dibujo:
% primero de un circulo, luego de una linea horizontal, que posteriormente
% se rota para generar cuatro lineas para completar el pentagrama
%
close all; clear; clc % limpiamos la casa
num_puntos = 250; % número de puntos
t = linspace(0, 2*pi, num_puntos); % Intervalo
noLados = 5; % Número de lados del polígono
AnguloInt = 2*pi/noLados; % Ángulo interior del polígono
%
% Variables del círculo 
r = 2; % Radio
h = 0; k = 0; % Coordenadas del centro
%
% Ecuación parámetrica del círculo:
x = r*cos(t)+h; y = r*sin(t)+k; 
%
%% Ecuaciones para la linea horizontal
% Longitud de la linea horizontal
lH = 2*r*sin(AnguloInt);
% Distancia de la linea horizontal al centro: (0,0)
dist_lH = r*cos(AnguloInt);
%
% Definición del intervalo de la línea horizontal
xH = linspace(-lH/2, lH/2, num_puntos);
% Definición de vectores
L = zeros(2,num_puntos);
L(1,:) = xH;
L(2,:) = -dist_lH;
%
[L0rx  L0ry] = rot2d(AnguloInt*0, L(1,:), L(2,:));
[L1rx  L1ry] = rot2d(AnguloInt, L(1,:), L(2,:));
[L2rx  L2ry] = rot2d(AnguloInt*2, L(1,:), L(2,:));
[L3rx  L3ry] = rot2d(AnguloInt*3, L(1,:), L(2,:));
[L4rx  L4ry] = rot2d(AnguloInt*4, L(1,:), L(2,:));
%
% Gráficas
hold on
plot(x,y, 'r', 'LineWidth', 4) % círculo 
plot(L0rx, L0ry, 'LineWidth', 4)  % línea horizontal
plot(L1rx, L1ry, 'LineWidth', 4)
plot(L2rx, L2ry, 'LineWidth', 4)
plot(L3rx, L3ry, 'LineWidth', 4)
plot(L4rx, L4ry, 'LineWidth', 4)
axis square off
hold off
% fin del guión/script

Descubriendo huevos de Pascua en Matlab



Los huevos de Pascua son imagenes, fragmentos de audio o video o pedazos de código con una funcion inesperada e intencional de un programa. Fueron dejadas por los programadores para dejar un testimonio de su trabajo y aficiones; pero tal vez lo princiapal, estan ahí para que las descubramos.

Hay que enfatizar que los huevos de pascua no son demos, ni errores de programación.

De mis ejemplos favoritos en Matlab debo mendicionar siguientes:

  • fifteen
  • load handel, sound(y,Fs)
  • load audio48, sound(signal48kHz, Fs48)
  • why
  • spy
  • image

¡Debes probarlas!

Unas notas extras:

1) Parece que las versiones modernas de Matlab dejo de aparecer la imagen del espia. Pero la puedes recuperar con el código de una entrada de stackoverflow.

2) Image tiene una interesante historia, que la cuenta -en su blog- Steve Eddins.

Para ver las demas imagenes que se ocultan en la imagen por defecto puedes usar el siguiente código Matlab:
defImage = pow2(get(0,'DefaultImageCData'),47);
imgCell = repmat({zeros(size(defImage))},8,7);
for shift = 0:52
imgCell{shift+1} = bitshift(defImage,shift);
end;
allImages = cell2mat(imgCell.');
imshow(allImages,[min(allImages(:)) max(allImages(:))]);
%fin del script

Cómo ocultar una imagen en una rejilla espacial con Matlab



Se han hecho populares estas imágenes en Facebook, son fotos ocultadas a través de una densa rejilla espacial. Te mostramos cómo hacer esta ilusión óptica con Matlab.

Básicamente, se trata de disminuir el contraste de las fotos, alejarse de los tonos oscuros y luego introducir muchas franjas oscuras en la imagen. El resultado es que percibimos primero franjas oscuras y claras, pues entre ellas hay más contraste, cuando cambiamos de perspectiva (al inclinar la pantalla o la cabeza o alejarnos de la imagen) o sacudir la cabeza podemos ver la imagen oculta.

Se trata más de una curiosidad que de un verdadero sistema de criptografía, asi que diviértanse con el código y las imágenes que dejo en esta  entrada.

Preguntas para pensar
1) ¿Por qué aparece la imagen cuando cambiamos de perspectiva?

Ejercicios
1) Altera  el código para que sea una función de cuatro parámetros, que de de salida una imagen .gif

Imagen utilizada


Imagen de salida

Guión Matlab

% A limpiar la casa
 clear all; close all; clc;

% Cargar la imagen y ponerla en grises
im_fuente = rgb2gray(imread('maz.jpg'));

% cambia la clase de una variable
imgs = cast(im_fuente,'double'); 

% La imagen se ajusta a 60 tonos de gris, 
img = 60*((imgs)./(max(max(imgs))));
img = img + 195; % desplazar los tonos a 195
% al final tengo tonos de 195 a 255

[f c d] = size(img); % el proceso es para cada capa
% Paso es el número de columnas negras en la imagen final 
paso = floor(c/160); %redondea hacia abajo, frecuencia 1/160

for i = 1:2*paso:c
    img(:,i:i+paso,:) = 0; %img suele tener tres capas
end

im_final = cast(img,'uint8');
imshow(im_final); % ver para creer
%fin del guión

Más información en la ref.

Retirar datos atípicos (outliers) de una distribución de datos con Matlab



Los datos atípicos son datos que se alejan mucho de promedio de una distribución. Por lo general, se interpretan como errores experimentales aleatorios, por ello se suelen remover. En esta ocasión te muestro un script que usa cuartiles estadísticos para remover tales datos.

Preguntas para pensar
1)  En que caso un dato atípico brinda información experimental relevante y no debe removerse de la serie.

Ejercicios
1) Sugiere una modificación al guion presentado para usar la desviación-estándar como base para eliminar los datos atípicos.

GUIÓN MATLAB

%% Primer guión para remover datos atípicos
clc; clear; close all
%% Información de entrada
Y = [10 20 -150 40 50 60 70 200 90 100];
X = [2 4 6 8 10 12 14 16 18 20];
%% Cálculos
IQR = iqr(Y); %intervalo  intercuartil,
    % la diferencia entre el tercer  y el primer cuartil
    % de una distribución: 75%-25% de Y
    % σ= IQR * 0.7413

lowr=prctile(Y,25)-1.5*IQR; %Percentiles. Q1 - 1.5IQR.
highr=prctile(Y,75)+1.5*IQR; % Q3 + 1.5IQR

new_Y = Y(Y>lowr &   Y
new_X = X(Y>lowr &   Y

%%ver; es creer

hold on
plot(X, Y, 'bo','MarkerSize',20)
plot(new_X, new_Y, 'kx','MarkerSize',20)
hold off
%fin del guión

Juego de volados y casinos ricos



Guión:

%% ¿En cuanto tiempo un casino te deja sin dinero?
% este guion simula un juego de tirar una moneda entre un casino y un
% apostador.

%% Guión escrito por Vicente Torres Zúñiga; 18 de abril 2003.

clc; clear; close all % Limpia la memoria

casino = 100000; % Dinero con el que empieza el casino
apostador = 10; % Dinero con el que empieza el apostador

casino_zero = casino;
apostador_zero = apostador;

num_evento = 0; % Número de veces que han apostado, que se inicia en cero.

dinero_apostador(casino) = 0; % Tentativamente pongo este vector para
% hacer más rapida la asignición de memoria. Pero al final el vector puede
% ser más grande o pequeño que esta asignación

% Todas las apuestas son iguales, de una unidad. Es decir, en un juego
% se pierde o gana una unidad.

while (apostador > 0 && casino > 0)
num_evento = num_evento +1;
dinero_apostador(num_evento) = apostador;
moneda = rand(1); % rand brinda números pseudoaleatorios entre 0 y 1
if moneda >=0.5 % gana el casino
casino = casino +1;
apostador = apostador -1;

else % gana apostador
casino = casino - 1;
apostador = apostador +1;
end
end
porciento_perdida_casino = 100*max(dinero_apostador)/casino_zero; % porcentualmente cuanto es lo máximo que
% le puedo sacar al casino
porciento_ganancia_apostador = 100*(max(dinero_apostador)- apostador_zero)/apostador_zero; % porcentualmente cuanto es lo máximo que
% le puedo sacar al casino
num_juegos = num_evento; %cuantos juegos realizamos

% Vizualización
axes('fontsize',14,'fontweight','b')
plot(dinero_apostador,'b', 'LineWidth',6)

xlabel('Número de juego, N', 'fontsize',20,'fontweight','b')
ylabel('Dinero del apostador, D', 'fontsize',20,'fontweight','b')
title(['Al principio, el dinero del casino es ', num2str(casino_zero./apostador_zero), ' veces más grande que el del apostador'], 'fontsize',20,'fontweight','b')
set(gca, 'Fontsize',18, 'fontweight','b')
axis([0, num_juegos, 0, max(dinero_apostador)]);

salida = [porciento_ganancia_apostador, porciento_perdida_casino, num_juegos];

% fin del guión
Related Posts Plugin for WordPress, Blogger...