Let me start with a graphical riddle. In what sense is the following equivalence true?
To learn the answer, read on!
I recently came across Nick Higham’s fun post on one-liners in MATLAB. That piece and the approach of Bastille Day on July 14th made me think of another one-line program.
image([3 2 1]);colormap(flag)
Pretty impressive, considering that it’s only 29 characters long. Is this the shortest flag program we can write?
As I thought about flags and MATLAB, I gave myself the following task. Using only the colormap “flag” and images of vectors, how many national flags can we construct? Probably more than you might guess. Let’s go on a little tour.
Tidying Up the Flag
Proper flags shouldn’t have numbers running their edges, so I’d like to hide the tick marks and labels. Since I plan to do this multiple times in the script below, I’m going to use an anonymous function for compactness. It’s not necessary, but I like how it keeps the code tidy.
notick = @(ax) set(ax,'XTick',,'YTick',)
notick = @(ax)set(ax,'XTick',,'YTick',)
In honor of Bastille Day, we start with France.
france = [3 2 1]
france = 3 2 1
image(france) title('Vive la France!') notick(gca)
France is the only red, white, and blue tricolor with vertical bars. But if we look at horizontal patterns, we find many more.
Netherlands is a rotated version of France.
netherlands = rot90(france)
netherlands = 1 2 3
image(netherlands); title('The Netherlands') notick(gca)
Luxembourg, next door to the Netherlands, uses essentially the same flag. A pedantic Luxembourger or professional vexillologist may protest that the colors are slightly lighter and the aspect ratio is slightly different. We will gloss over these details.
luxembourg = netherlands
luxembourg = 1 2 3
image(luxembourg) title('Luxembourg') notick(gca)
thailand = [netherlands; flipud(netherlands)]
thailand = 1 2 3 3 2 1
image(thailand) title('Thailand') notick(gca)
Now we see the significance of the graphical riddle that we listed at the top of this post.
Russia’s flag is a variant on the three horizontal bands. We’ll use circshift to do a circular permutation of the colors in the Netherlands flag.
russia = circshift(netherlands,2)
russia = 2 3 1
image(russia) title('Russia') notick(gca)
austria = netherlands([1 2 1])
austria = 1 2 1
image(austria) title('Austria') notick(gca)
indonesia = netherlands(1:2)
indonesia = 1 2
image(indonesia) title('Indonesia') notick(gca)
monaco = indonesia
monaco = 1 2
image(monaco); title('Monaco') notick(gca)
poland = flipud(monaco)
poland = 2 1
image(poland); title('Poland') notick(gca)
There you have it. A veritable Tour d’Image. I count nine separate vector flags using only red, white, or blue. Did I miss any?
As an exercise for the reader, express all flags in terms of the vector “france”.
Addendum #1: Costa Rica
In the comments, Matt Tearle points out another flag that fits the model. It’s a kind of dual to Thailand. I am now convinced that vexillology conventions should always occur in the Netherlands, its flag being the indispensable element at the center of all flag alchemy.
costarica = [flipud(netherlands); netherlands]
costarica = 3 2 1 1 2 3
image(costarica); title('Costa Rica') notick(gca)
And Richard Alcock from MathWorks UK writes in to give us this timely and poignant example.
reflex_blue = [0 51 153]/255; yellow = [255 204 0]/255; [x, y] = pol2cart(linspace(0, 2*pi, 13), 1/3); plot(x, y, 'p', 'MarkerSize', 20, ... 'MarkerEdgeColor', yellow, 'MarkerFaceColor', yellow); axis('equal'); set(gca, 'Color', reflex_blue, ... 'XTick', , 'YTick', , ... 'Xlim', [-.75 .75], 'Ylim', [-.5, .5])
Addendum #3: Yemen
Sean de Wolski reminded me that black is one of the four colors of the “flag” colormap, thereby letting us add the Yemeni flag to our list. I thought the addition of black might give us a few more flags, but Yemen seems to be the end of it.
yemen = [1; 2; 4]; image(yemen) title('Yemen') notick(gca)
要发表评论，请点击 此处 登录到您的 MathWorks 帐户或创建一个新帐户。