User:Brhaspati/indflag

From Wikipedia, the free encyclopedia

This is a temporary page to get a good representation of the Flag of India.

[edit] Sources

This implementation is based on a combination of FOTW description and the image on the GOI directory. The non-intuitive part of the code is in drawing the chakra, for which I used the FOTW figure as a guide.

[edit] Bugs

Current problems with the figure produced by this code:

  • Figure needs to be anti-aliased.
  • Chakra looks too blue in the center and too white in the edges. Looks a little like some sort of bacterium, especially at reduced sizes. This needs to be rectified.

[edit] Code

% indflag.m
% Written by [[User:Brhaspati]], 2005.
% Code should work in most versions of MATLAB.
% Released under GPL.
%
% MATLAB is a trademark of MathWorks Inc.
%

clear all; close all; clc;

% Define colors (cite source if possible)
saffron  = [251 119   0] ./ 255;    % GOI uses this. FOTW uses [255 204 0].
white    = [255 255 255] ./ 255;
green    = [ 19 136   8] ./ 255;    % GOI uses this. FOTW uses [51 153 51].
navyblue = [  0   0 128] ./ 255;

radius = 1;     % Any positive real number should do - everything else is scaled to this.
ratio = 0.75;   % ratio of diameter of Ashok chakra to the width of the white band.
% This is 75% of the width. Though is misused by flag makers.

npoints = 5000;         % Use more points for better circles and slower rendering.
twopi = pi + pi;        % self-explanatory
r = 5 * pi / 72;        % radius of the small circles around the rim of the Ashok chakra
rim = 5 * (1 + pi/72);  % radius of the rim
y = 6 * radius / ratio; % (1/6) of the height of the flag.
x = 4.5 * y;            % width of the flag, keeping the specified 3:2 width:height ratio.

figure; hold on; axis equal; axis ([-x x -3*y 3*y]); axis off;

% Top band, saffron.
X = [-x x x -x];    Y = [y y 3*y 3*y];
fill (X, Y, saffron, 'EdgeColor', saffron);
% Middle band, white.
X = [-x x x -x];    Y = [y y -y -y];
fill (X, Y, white, 'EdgeColor', white);   % middle band
% Bottom band, green.
X = [-x x x -x];    Y = [-y -y -3*y -3*y];
fill (X, Y, green, 'EdgeColor', green);   % bottom band

% Begin drawing the navy blue Ashok chakra.
% Using FOTW description for shape and ratio of the chakra.
% blue rim
[X,Y] = pol2cart (linspace (0, twopi, npoints), ones (1, npoints) * 6 * radius);
fill (X, Y, navyblue, 'EdgeColor', navyblue);
% white annulus. Spokes will go here later.
[X,Y] = pol2cart (linspace (0, twopi, npoints), ones (1, npoints) * rim * radius);
fill (X, Y, white, 'EdgeColor', navyblue);
% blue core
[X,Y] = pol2cart (linspace (0, twopi, npoints), ones (1, npoints) * radius);
fill (X, Y, navyblue, 'EdgeColor', navyblue);

% 24 spokes
for theta = 0:15:359
    % calculate some angles
    t = theta * pi / 180.0;
    t1 = (theta + 3.75) * pi / 180.0;       t2 = (theta - 3.75) * pi / 180.0;
    t11  = (theta + 7.5) * pi / 180.0;      t22  = (theta - 7.5) * pi / 180.0;

    % draw a spoke. The spoke is a very thin pentagon, with its base resting on the core and the apex on the inner edge of the rim.
    X = [radius*cos(t1) radius*cos(t1)+radius*cos(t11) rim*radius*cos(t) radius*cos(t2)+radius*cos(t22) radius*cos(t2)];
    Y = [radius*sin(t1) radius*sin(t1)+radius*sin(t11) rim*radius*sin(t) radius*sin(t2)+radius*sin(t22) radius*sin(t2)];
    fill (X, Y, navyblue, 'EdgeColor', navyblue);

    % draw the small blue circles around the inner edge of the rim.
    [X,Y] = pol2cart (linspace (0, twopi, npoints), ones (1, npoints) * r * radius);
    X = X + rim*radius*cos(t11);        Y = Y + rim*radius*sin(t11);
    fill (X, Y, navyblue, 'EdgeColor', navyblue);
end