生成五角星顶点的子函数(GetPentagramVertices.m)function [x y] = GetPentagramVertices(centerPos, radius, orientation)% 子函数:获得五角星的十个顶点%orientation 定位Rad_ext = radius .* ones(1,5);%ones生成1行五列的矩阵,所有参数为1Ori_ext = ([0:72:359] + 90 +orientation).* pi/ 180;%[0:72:359]以72度为间隔产生五个数Rad_int = radius .* sind(18)./sind(126) .* ones(1,5);% sind(30)=0.5Ori_int = ([0:72:359] - 90 +orientation).* pi/ 180;Ori_int = Ori_int([4 5 1 2 3]);%强制换序Rad_all = zeros(1,10);Ori_all = zeros(1,10);Rad_all([1:2:10 2:2:10]) = [Rad_ext Rad_int];Ori_all([1:2:10 2:2:10]) = [Ori_ext Ori_int];[x y] = pol2cart(Ori_all, Rad_all);%pol2cart在MATLAB中,该函数用于把极坐标(柱坐标)转换为笛卡尔坐标(指平面直角坐标或空间直角坐标);把柱坐标(THETA,RHO,Z)转换为对应的三维笛卡尔坐标(X,Y,Z)。
x = x + centerPos(1);y = y + centerPos(2);程序是画静态的五星红旗,并将图像以'FiveStarRedFlag.png'保存在当前目录下。
这个五星红旗的比例是按照《中华人民共和国国旗制法说明》绘制的第一行是调整国旗分辨率的,可以自行修改,但是要保持3:2的比例。
flag_dimension_in_pixel = [600 400];figure_leftbottom_pos = [100 100];bkg_color = [1 0 0];star_color = [1 1 0];flag_horiz_units_num = 30;flag_verti_units_num = 20;star_vertices_x = zeros(10, 5);star_vertices_y = zeros(10, 5);stars(5).center_pos = [];stars(1).center_pos = [5 15];stars(1).radius = 3;stars(1).orientation = 0;stars(2).center_pos = [10 18];stars(2).radius = 1;stars(2).orientation = 0;stars(3).center_pos = [12 16];stars(3).radius = 1;stars(3).orientation = 0;stars(4).center_pos = [12 13];stars(4).radius = 1;stars(4).orientation = 0;stars(5).center_pos = [10 11];stars(5).radius = 1;stars(5).orientation = 0;%类似于c#的自定义函数调用?for i = 2:5dists = deal(stars(i).center_pos - stars(1).center_pos);stars(i).orientation = atan(dists(2)/dists(1)).*180/pi + 90;end%% Prepare the backgroundflag_figure = figure('Units', 'pixels', ...'Position', [figure_leftbottom_pos, flag_dimension_in_pixel]);flag_axes = axes('Parent', flag_figure, 'Units','pixels', ...'Position', [1 1 flag_dimension_in_pixel], 'Color', [1 0 0]);set(flag_axes, 'XLim', [0 flag_horiz_units_num], 'YLim', [0 flag_verti_units_num]);rectangle('Position', [0 0 flag_horiz_units_num flag_verti_units_num], ...'FaceColor', bkg_color ,'EdgeColor' ,bkg_color);set(flag_axes, 'Visible','off');%% Get the Star's Verticesfor i = 1:5[star_vertices_x(:,i) star_vertices_y(:, i)] = ...GetPentagramVertices(stars(i).center_pos, ...stars(i).radius,stars(i).orientation);endstar_handles = patch(star_vertices_x, star_vertices_y, star_color);set(star_handles, 'EdgeColor', star_color);flag_image = frame2im(getframe(flag_figure));imwrite(flag_image, 'FiveStarRedFlag.png');% 如装有Image Processing Toolbox的话,解注下面几行可以保存图形文件%% [filename, pathname, filterindex] = ...% uiputfile('*','Save the Nation Flag as...')%% imwrite(flag_image, [pathname filename]);主程序程序是飘扬的五星红旗,效果是3D实时渲染出来的,所以速度有点慢,机器够牛的同学可以试着将第一行的分辨率改大flag_size = [600 400]; % Change as you see fitflag_dimension_in_pixel = flag_size; %[600 400];figure_leftbottom_pos = [100 100];bkg_color = [1 0 0];star_color = [1 1 0];flag_horiz_units_num = 30;flag_verti_units_num = 20;star_vertices_x = zeros(10, 5);star_vertices_y = zeros(10, 5);stars(5).center_pos = [];stars(1).center_pos = [5 15];stars(1).radius = 3;stars(1).orientation = 0;stars(2).center_pos = [10 18];stars(2).radius = 1;stars(2).orientation = 0;stars(3).center_pos = [12 16];stars(3).radius = 1;stars(3).orientation = 0;stars(4).center_pos = [12 13];stars(4).radius = 1;stars(4).orientation = 0;stars(5).center_pos = [10 11];stars(5).radius = 1;stars(5).orientation = 0;for i = 2:5dists = deal(stars(i).center_pos - stars(1).center_pos);stars(i).orientation = atan(dists(2)/dists(1)).*180/pi + 90;end%% Prepare the backgroundflag_figure = figure('Units', 'pixels', ...'Position', [figure_leftbottom_pos, flag_dimension_in_pixel]);flag_axes = axes('Parent', flag_figure, 'Units','pixels', ...'Position', [1 1 flag_dimension_in_pixel], 'Color', [1 0 0]);set(flag_axes, 'XLim', [0 flag_horiz_units_num], 'YLim', [0 flag_verti_units_num]);rectangle('Position', [0 0 flag_horiz_units_num flag_verti_units_num], ...'FaceColor', bkg_color ,'EdgeColor' ,bkg_color);set(flag_axes, 'Visible','off');%% Get the Star's Verticesfor i = 1:5[star_vertices_x(:,i) star_vertices_y(:, i)] = ...GetPentagramVertices(stars(i).center_pos, ...stars(i).radius,stars(i).orientation);endstar_handles = patch(star_vertices_x, star_vertices_y, star_color);set(star_handles, 'EdgeColor', star_color);flag_texture = double(frame2im(getframe(flag_figure)))./255;%% Constantscycle = 2;cycle2 = 3;frames = 20;wave_length = flag_size(1)./cycle;wave_length2 = flag_size(2)./cycle2;rot_angle = 15.*pi/180;rot_angle2 = 5.*pi/180;amp1 = 1;amp2 = 0.5;flying_FSRF_RGBimages = uint8(zeros(flag_size(2), flag_size(1), 3, frames)); flying_FSRF_INDimages = uint8(zeros(flag_size(2), flag_size(1), 1, frames)); flying_FSRF_INDmap = zeros(256, 3, frames);GIF_filename = 'Flying_FSRF.gif';PNG_filename = 'Flying_FSRF.png';%% Main Program% flag_texture = paintFiveStarRedFlag(flag_size);flag_figure_handle = gcf;flag_size = size(flag_texture);[flag_xflag_y] = meshgrid(1:flag_size(2), 1:flag_size(1));for i = 1:framescla;flag_z = amp1.*sin((cos(rot_angle).*flag_x - sin(rot_angle).*flag_y).*2*pi./wave_length ...- 2*pi*(i-1)/frames) + ...amp2.*sin((cos(rot_angle2).*flag_x-sin(rot_angle2).*flag_y).*2*pi./wave_length2 ...- 2*pi*(i-1)/frames) + ...sin((cosd(20).*flag_x-sind(20).*flag_y).*2*pi./600 - 2*pi*(i-1)/frames);flag_surf_handle = warp(flag_x,flag_y,flag_z,flag_texture);view(2);set(flag_surf_handle, 'FaceLighting', 'phong','AmbientStrength', 0.7);set(gca, 'Visible', 'off', 'XLim', [1 600], 'YLim', [1 400], 'ZLim', [-3 3]);camproj('perspective')material dull% light_handle = camlight('right');l1 = light('Position', [600 200 1], 'Color', [1 1 1]);l2 = light('Position', [0, 0, 4], 'Color', [1 1 1]);flying_FSRF_frames(i) = getframe(flag_figure_handle);flying_FSRF_RGBimages(:,:,:,i) = flying_FSRF_frames(i).cdata;[current_INDimage currentMap] = rgb2ind(flying_FSRF_RGBimages(:,:,:,i), 256);if i==1imwrite(current_INDimage, currentMap,GIF_filename,...'GIF', 'LoopCount', inf, 'DelayTime', 0.05);imwrite(flying_FSRF_RGBimages(:,:,:,i),PNG_filename ,'PNG');elseimwrite(current_INDimage, currentMap,GIF_filename,...'GIF', 'WriteMode', 'Append', 'DelayTime', 0.05);endend主程序flag_size = [600 400]; % Change as you see fit flag_dimension_in_pixel = flag_size; %[600 400]; figure_leftbottom_pos = [100 100];bkg_color = [1 0 0];star_color = [1 1 0];flag_horiz_units_num = 30;flag_verti_units_num = 20;star_vertices_x = zeros(10, 5);star_vertices_y = zeros(10, 5);stars(5).center_pos = [];stars(1).center_pos = [5 15];stars(1).radius = 3;stars(1).orientation = 0;stars(2).center_pos = [10 18];stars(2).radius = 1;stars(2).orientation = 0;stars(3).center_pos = [12 16];stars(3).radius = 1;stars(3).orientation = 0;stars(4).center_pos = [12 13];stars(4).radius = 1;stars(4).orientation = 0;stars(5).center_pos = [10 11];stars(5).radius = 1;stars(5).orientation = 0;for i = 2:5dists = deal(stars(i).center_pos - stars(1).center_pos);stars(i).orientation = atan(dists(2)/dists(1)).*180/pi + 90;end%% Prepare the backgroundflag_figure = figure('Units', 'pixels', ...'Position', [figure_leftbottom_pos, flag_dimension_in_pixel]);flag_axes = axes('Parent', flag_figure, 'Units','pixels', ...'Position', [1 1 flag_dimension_in_pixel], 'Color', [1 0 0]);set(flag_axes, 'XLim', [0 flag_horiz_units_num], 'YLim', [0 flag_verti_units_num]);rectangle('Position', [0 0 flag_horiz_units_num flag_verti_units_num], ...'FaceColor', bkg_color ,'EdgeColor' ,bkg_color);set(flag_axes, 'Visible','off');%% Get the Star's Verticesfor i = 1:5[star_vertices_x(:,i) star_vertices_y(:, i)] = ...GetPentagramVertices(stars(i).center_pos, ...stars(i).radius,stars(i).orientation);endstar_handles = patch(star_vertices_x, star_vertices_y, star_color);set(star_handles, 'EdgeColor', star_color);flag_texture = double(frame2im(getframe(flag_figure)))./255;%% Constantscycle = 2;cycle2 = 3;frames = 20;wave_length = flag_size(1)./cycle;wave_length2 = flag_size(2)./cycle2;rot_angle = 15.*pi/180;rot_angle2 = 5.*pi/180;amp1 = 1;amp2 = 0.5;flying_FSRF_RGBimages = uint8(zeros(flag_size(2), flag_size(1), 3, frames)); flying_FSRF_INDimages = uint8(zeros(flag_size(2), flag_size(1), 1, frames)); flying_FSRF_INDmap = zeros(256, 3, frames);GIF_filename = 'Flying_FSRF.gif';PNG_filename = 'Flying_FSRF.png';%% Main Program% flag_texture = paintFiveStarRedFlag(flag_size);flag_figure_handle = gcf;flag_size = size(flag_texture);[flag_xflag_y] = meshgrid(1:flag_size(2), 1:flag_size(1));for i = 1:framescla;flag_z = amp1.*sin((cos(rot_angle).*flag_x - sin(rot_angle).*flag_y).*2*pi./wave_length ...- 2*pi*(i-1)/frames) + ...amp2.*sin((cos(rot_angle2).*flag_x-sin(rot_angle2).*flag_y).*2*pi./wave_length2 ...- 2*pi*(i-1)/frames) + ...sin((cosd(20).*flag_x-sind(20).*flag_y).*2*pi./600 - 2*pi*(i-1)/frames);flag_surf_handle = warp(flag_x,flag_y,flag_z,flag_texture);%warp函数来实现纹理映射view(2);set(flag_surf_handle, 'FaceLighting', 'phong','AmbientStrength', 0.7);set(gca, 'Visible', 'off', 'XLim', [1 600], 'YLim', [1 400], 'ZLim', [-3 3]);camproj('perspective')material dull% light_handle = camlight('right');l1 = light('Position', [600 200 1], 'Color', [1 1 1]);l2 = light('Position', [0, 0, 4], 'Color', [1 1 1]);flying_FSRF_frames(i) = getframe(flag_figure_handle);flying_FSRF_RGBimages(:,:,:,i) = flying_FSRF_frames(i).cdata;[current_INDimage currentMap] = rgb2ind(flying_FSRF_RGBimages(:,:,:,i), 256);if i==1imwrite(current_INDimage, currentMap,GIF_filename,...'GIF', 'LoopCount', inf, 'DelayTime', 0.05);imwrite(flying_FSRF_RGBimages(:,:,:,i),PNG_filename ,'PNG');elseimwrite(current_INDimage, currentMap,GIF_filename,...'GIF', 'WriteMode', 'Append', 'DelayTime', 0.05);endend参考文献用MATLAB绘制五星红旗【带飘动效果】/thread-185600-1-1.html。