Файл:Dragon Curve unfolding chamfered zoom numbered.webm
Битнең эчтәлекләре башка телләрдә бирелми.
Wikipedia — ирекле энциклопедия проектыннан ([http://tt.wikipedia.org.ttcysuttlart1999.aylandirow.tmf.org.ru/wiki/Dragon Curve unfolding chamfered zoom numbered.webm latin yazuında])
600 × 600 нокта - WEBM файлын беренчел карау размеры JPG. Башка ачыклык: 240 × 240 нокта | 480 × 480 нокта | 768 × 768 нокта | 1024 × 1024 нокта.
Төп файл (WebM-аудио/видеофайл, VP9. Длительность: 50 с. 1024 × 1024 , битрейт: 16,86 Мб/с, размер файла: 99,89 Мб)
Бу файл Викиҗыентык проектыннан һәм башка проектларда кулланылырга мөмкин. Файл турында тулырак мәгълүмат түбәндә күрсәтелгән.
Тасвирлама
ТасвирDragon Curve unfolding chamfered zoom numbered.webm |
English: Animation of an unfolding Dragon curve. The order is increased from 0 to 17. The curve is chamfered for better visibility of the path. After reaching order 17 it is zoomed in to show the emerging pattern.
Deutsch: Animation einer sich entfaltenden Drachenkurve. Die Ordnung steigt von 0 bis 17. Die Ecken sind zur Darstellung des Verlaufs abgeflacht. Nach erreichen der Ordnung 17 wird die Kurve herangeholt um das Muster sichtbar zu machen.
Polski: Animacja rozwijającego się smoka Heighwaya. Rząd krzywej zmienia się od 0 do 17. Dla lepszej widoczności krzywa jest sfazowana. Po osiągnięciu 17. rzędu zostaje powiększona w celu pokazania pojawiającego się wzoru.
Čeština: Animace iteračního výpočtu dračí křivky do 17 iteračních kroků. Po dosažení 17. kroku je výsledný vzor zvětšen pro názorné zobrazení výsledné křivky. |
Дата | |
Чыганак | Үз эшем |
Автор | Jahobr |
Башка юрамалар |
[үзгәртү] |
WEBM‑разработка InfoField | |
Чыганак код InfoField | MATLAB codefunction [] = Dragon_Curve_unfolding_mp4_webm()
% Programmed in Matlab R2017a.
% Animation of an Dragon Curve unfolding.
% Before anything is drawn the algorithm makes a dry run ('xyLim')
% to determine proper axis limits to keep the
% animation nicely in frame.
% Then eight versions of the unfolding as mp4 files are created.
% 'rectangular' and 'chamfered' with and without a final zoom inwards.
% all with and without the order number in the lower left.
% Lastly the conversion to webm is triggered automatically. The conversion
% itself is done by ffmpeg.exe (implementation for windows only) and can
% take up to 4 hours.
[pathstr,fname] = fileparts(which(mfilename)); % save files under the same name and at file location
fname = strrep(fname,'_mp4_webm','');
maxOrder = 17; % final order of fractal
figHandle = figure(345275); clf;
set(figHandle,'Color' ,'white'); % white background
set(figHandle,'Units' ,'pixel');
set(figHandle,'MenuBar','none', 'ToolBar','none'); % free real estate for a maximally large image
% set(figHandle,'Renderer','OpenGL')
% set(figHandle,'GraphicsSmoothing','on')
axesHandle = axes; hold(axesHandle,'on');
axis equal
axis off % invisible axes (no ticks)
% stop acceleration rot de-acceleration stop
accFrames = 20; % frames for acceleration (first frame will be 0 last at full speed, so practicall it is accFrames-2)
speed = [linspace(0,1,accFrames) ones(1,36) linspace(1,0,accFrames)]; %
speed = speed(1:end-1); % last speed is 0, this does nothing in cumsum; (compensated by +1 frames in center)
angleList = cumsum(speed)/sum(speed) * pi/2; % create position, normalize, scale
staticFramesAtVideoStart = 50; % static start image (for all videos)
staticFramesAtVideoEnd = 100; % static end image (half of the versions end after building the curve)
staticFramesAtFullOrders = 10; % in between every rotation section
staticFramesBetweenOutAndIn = 50; % static start image (half of the versions zoom back in)
nFramesZoomIn = 1000; % zoom back in
nFramesZoomOut = length(angleList)*maxOrder + staticFramesAtFullOrders*(maxOrder-1); % inital Frame + (rotation + intermediate state of the curve)*order
xMinR = -0.1*ones(1,nFramesZoomOut); % initial range
xMaxR = +2.1*ones(1,nFramesZoomOut); % initial range
yMinR = -1.1*ones(1,nFramesZoomOut); % initial range
yMaxR = +1.1*ones(1,nFramesZoomOut); % initial range
h_xy = []; h_ro = []; % init
videoFileNames = {}; % init
xySize = 1024; % pixel size of video; multiple-of-16 boundaries (MPEG splits the video into 16x16 squares called macroblocks)
for mode = {'xyLim','chamfered','rectangular'} %
if strcmpi(mode{1},'rectangular')
liWidth = interp1([ 0 0.09 0.5 0.75 1 ]*nFramesZoomOut... during the run
, [28 28 8 1.6 1.3]... defined Linewidth
, 1:nFramesZoomOut); % LineWidth sampled for all frames
elseif strcmpi(mode{1},'chamfered')
liWidth = interp1([ 0 0.09 0.5 0.75 1 ]*nFramesZoomOut... during the run
, [24 24 4 1.1 1.1]... defined Linewidth
, 1:nFramesZoomOut); % LineWidth sampled for all frames
end
switch mode{1}
case {'rectangular','chamfered'}
% create video object
cd(pathstr); % set path to working folder
videoFileNames{end+1} = [fname '_' mode{1} '_unnum'];
vid_u = VideoWriter(videoFileNames{end},'MPEG-4'); % Prepare the new file
vid_u.FrameRate = 50;
vid_u.Quality = 100; % quality in [0% 100%]
open(vid_u);
videoFileNames{end+1} = [fname '_' mode{1} '_zoom_unnum'];
vid_uz = VideoWriter(videoFileNames{end},'MPEG-4'); % Prepare the new file
vid_uz.FrameRate = 50;
vid_uz.Quality = 100; % quality in [0% 100%]
open(vid_uz);
videoFileNames{end+1} = [fname '_' mode{1} '_numbered'];
vid_n = VideoWriter(videoFileNames{end},'MPEG-4'); % Prepare the new file
vid_n.FrameRate = 50;
vid_n.Quality = 100; % quality in [0% 100%]
open(vid_n);
videoFileNames{end+1} = [fname '_' mode{1} '_zoom_numbered'];
vid_nz = VideoWriter(videoFileNames{end},'MPEG-4'); % Prepare the new file
vid_nz.FrameRate = 50;
vid_nz.Quality = 100; % quality in [0% 100%]
open(vid_nz);
end
x_y = [0 0;0 1]; % inital line [x1 x2... ; y1 y2...];
iFrame = 0; % init
set(figHandle, 'Position',[1 1 xySize xySize]);
if ~all(get(figHandle, 'Position')==[1 1 xySize xySize])
error('Figure pos not set propper.')
end
for orderr = 1:maxOrder % create zoom out; generating the dragon curve
rotPoint_x_y = x_y(:,end); % point of rotation [x_end; y_end]
x_y_new = fliplr(x_y);
x_y_new = x_y_new - rotPoint_x_y*ones(1,size(x_y_new,2)); % shift to zero at point of rotation
for currA = angleList % rotate the current state
iFrame = iFrame+1; % next frame
[x_y_newRot] = rotateCordiantes(x_y_new,currA); % rotate
x_y_newRot = x_y_newRot + rotPoint_x_y*ones(1,size(x_y_newRot,2)); % shift back
switch mode{1}
case 'xyLim'
xMinR(iFrame:end) = min([xMinR(iFrame) x_y(1,:) x_y_newRot(1,:)]); % record extreme range
xMaxR(iFrame:end) = max([xMaxR(iFrame) x_y(1,:) x_y_newRot(1,:)]); % record extreme range
yMinR(iFrame:end) = min([yMinR(iFrame) x_y(2,:) x_y_newRot(2,:)]); % record extreme range
yMaxR(iFrame:end) = max([yMaxR(iFrame) x_y(2,:) x_y_newRot(2,:)]); % record extreme range
case {'rectangular','chamfered'}
cla(axesHandle)
setXYlim(axesHandle, [xMinR(iFrame) xMinR(iFrame)+maxR(iFrame)], [yMinR(iFrame) yMinR(iFrame)+maxR(iFrame)]) % use pre-created zoom
h_xy = plot(x_y(1,:), x_y(2,:), 'b.-','LineWidth',liWidth(iFrame),'MarkerSize',3.4*liWidth(iFrame)); % non rotating original line
h_ro = plot(x_y_newRot(1,:), x_y_newRot(2,:), 'k.-','LineWidth',liWidth(iFrame),'MarkerSize',3.4*liWidth(iFrame)); % rotating section
plot(rotPoint_x_y(1),rotPoint_x_y(2),'.r','MarkerSize',liWidth(iFrame)*6); % rotation point marker
drawnow; %
f1 = getframe(figHandle);
writeVideo(vid_u ,f1.cdata); % save video frame
writeVideo(vid_uz,f1.cdata); % save video frame
if iFrame == 1
for iStat = 1:staticFramesAtVideoStart % start video extra static image
writeVideo(vid_u ,f1.cdata); % save video frame
writeVideo(vid_uz,f1.cdata); % save video frame
end
veryFirstFrame = false; % deactivate
end
if currA < pi*0.25
text_s = num2str(orderr-1); % order string
co = interp1([-100 pi*0.1 pi*0.15 100],[0 0 1 1],currA);
else
text_s = num2str(orderr); % order string
co = interp1([-100 pi*0.35 pi*0.4 100],[1 1 0 0],currA);
end
tHand = text(0.075*xySize,0.075*xySize,text_s,... % add order text
'FontName','Helvetica Narrow','Color',co*[1 1 1],...
'FontUnits','pixels','Units','pixel',...
'FontSize',0.11*xySize,'FontWeight','bold',...
'HorizontalAlignment','left','VerticalAlignment','baseline');
drawnow; %
f2 = getframe(figHandle);
writeVideo(vid_n ,f2.cdata); % save video frame
writeVideo(vid_nz,f2.cdata); % save video frame
if veryFirstFrame
for iStat = 1:staticFramesAtVideoStart % start video extra static image
writeVideo(vid_n ,f2.cdata); % save video frame
writeVideo(vid_nz,f2.cdata); % save video frame
end
end
end
end
%% transition between two rotations
if orderr < maxOrder % not after last order
for iTrans = 1:staticFramesAtFullOrders
iFrame = iFrame+1; % next frame
switch mode{1}
case 'xyLim'
xMinR(iFrame:end) = min([xMinR(iFrame) x_y(1,:) x_y_newRot(1,:)]); % record extreme range
xMaxR(iFrame:end) = max([xMaxR(iFrame) x_y(1,:) x_y_newRot(1,:)]); % record extreme range
yMinR(iFrame:end) = min([yMinR(iFrame) x_y(2,:) x_y_newRot(2,:)]); % record extreme range
yMaxR(iFrame:end) = max([yMaxR(iFrame) x_y(2,:) x_y_newRot(2,:)]); % record extreme range
case {'rectangular','chamfered'}
x_y_trans = x_y;
x_y_rotTrans = x_y_newRot;
transFactor = interp1([1 staticFramesAtFullOrders],[0 1],iTrans);
cla(axesHandle)
setXYlim(axesHandle, [xMinR(iFrame) xMinR(iFrame)+maxR(iFrame)], [yMinR(iFrame) yMinR(iFrame)+maxR(iFrame)])
shiftColor = [0 0 1-transFactor]; % from black to blue
if strcmpi(mode{1},'chamfered')
x_y_trans(:,end) = interp1([1 0],x_y(:,end-1:end)' ,transFactor*0.25)';
x_y_rotTrans(:,1) = interp1([0 1],x_y_newRot(:,1:2)',transFactor*0.25)';
plot([x_y_trans(1,end) x_y_rotTrans(1,1)],[x_y_trans(2,end) x_y_rotTrans(2,1)], '-','LineWidth',liWidth(iFrame),'Color',shiftColor/2) % champfered intersection
end
h_xy = plot(x_y_trans(1,:), x_y_trans(2,:), '.-','LineWidth',liWidth(iFrame),'MarkerSize',3.4*liWidth(iFrame),'Color',shiftColor); % non rotating original line
h_ro = plot(x_y_rotTrans(1,:), x_y_rotTrans(2,:), 'k.-','LineWidth',liWidth(iFrame),'MarkerSize',3.4*liWidth(iFrame)); % rotating section shifts color
if (1-transFactor*2) > 0 % only if MarkerSize positive
plot(rotPoint_x_y(1),rotPoint_x_y(2),'.r','MarkerSize',liWidth(iFrame)*6*(1-transFactor*2)); % rotation point marker fade old out
end
if (transFactor*2-1) > 0 % only if MarkerSize positive
plot(x_y_newRot(1,end),x_y_newRot(2,end),'.r','MarkerSize',liWidth(iFrame)*6*(transFactor*2-1)); % rotation point marker fade new in
end
%%%
drawnow; %
f1 = getframe(figHandle);
writeVideo(vid_u ,f1.cdata); % save video frame
writeVideo(vid_uz,f1.cdata); % save video frame
if iFrame == 1
for iStat = 1:staticFramesAtVideoStart % start video extra static image
writeVideo(vid_u ,f1.cdata); % save video frame
writeVideo(vid_uz,f1.cdata); % save video frame
end
veryFirstFrame = false; % deactivate
end
tHand = text(0.075*xySize,0.075*xySize,text_s,... % add order text
'FontName','Helvetica Narrow','Color',[0 0 0],...
'FontUnits','pixels','Units','pixel',...
'FontSize',0.11*xySize,'FontWeight','bold',...
'HorizontalAlignment','left','VerticalAlignment','baseline');
drawnow; %
f2 = getframe(figHandle);
writeVideo(vid_n ,f2.cdata); % save video frame
writeVideo(vid_nz,f2.cdata); % save video frame
if veryFirstFrame
for iStat = 1:staticFramesAtVideoStart % start video extra static image
writeVideo(vid_n ,f2.cdata); % save video frame
writeVideo(vid_nz,f2.cdata); % save video frame
end
end
end
%%%
end
end
%% build curve
switch mode{1}
case {'xyLim','rectangular'}
x_y = [x_y x_y_newRot(:,2:end)]; % extend curve
x_y = round(x_y); % eliminate any rounding errors by the rotation (not really a problem)
case {'chamfered'}
x_y = [x_y_trans x_y_rotTrans]; % extend curve
x_y = round(x_y.*4)./4; % eliminate any rounding errors by the rotation (not really a problem)
end
end
switch mode{1} %
case {'rectangular','chamfered'}
for iStat = 1:staticFramesAtVideoEnd % end video extra static image
writeVideo(vid_u,f1.cdata); % save extra video frame
writeVideo(vid_n,f2.cdata); % save extra video frame
end
%% zoom inwards
for iStat = 1:staticFramesBetweenOutAndIn % pause video using extra static image
writeVideo(vid_uz,f1.cdata); % save extra video frame
writeVideo(vid_nz,f2.cdata); % save extra video frame
end
%% zoom back in
aFrames = 40; % frames for acceleration
cFrames = 20; % frames for constant speed
dFrames = 160; % frames for deceleration
RangeChangeSpeed = [linspace(0,1,aFrames) ones(1,cFrames) linspace(1,0,dFrames) zeros(1,nFramesZoomIn-aFrames-cFrames-dFrames)];
Range_Change = cumsum(RangeChangeSpeed)/sum(RangeChangeSpeed); % create position, normalize, scale
maxR(end); % start Range
endRange = 30; % end Range
rangeList = maxR(end)-Range_Change*(maxR(end)-endRange);
liWidthZoom = interp1(maxR+linspace(0,0.001,nFramesZoomOut),liWidth,rangeList); % remap the old liWidth list to new ranges; +linspace(0,0.001,nFramesZoomOut) to make input strictly increasing
aFrames = 40; % frames for acceleration
cFrames = 10;20; % frames for constant speed
dFrames = 120;100; % frames for deceleration
finMovSpeed = 0.015;0.02; % by trial and error
PosChangeSpeed = [linspace(0,1,aFrames) ones(1,cFrames) linspace(1,finMovSpeed,dFrames) ones(1,nFramesZoomIn-aFrames-cFrames-dFrames)*finMovSpeed];
Pos_Change = cumsum(PosChangeSpeed)/sum(PosChangeSpeed); % create position, normalize, scale
xPos = xMinR(end)+ Pos_Change*(90 -xMinR(end)); % stretch from generic shape to start and end point
yPos = yMinR(end)+ Pos_Change*(270-yMinR(end)); % stretch from generic shape to start and end point
figure(43542); clf; hold on; grid on
title('limits zoom in')
plot(1:nFramesZoomIn,xPos,'r', 1:nFramesZoomIn,xPos+rangeList,'r', 1:nFramesZoomIn,yPos,'b', 1:nFramesZoomIn,yPos+rangeList,'b');
legend({'x limits','x limits','y limits','y limits'})
figure(figHandle); % back to main figure
for iFrame = 1:nFramesZoomIn %
set(h_xy,'LineWidth',liWidthZoom(iFrame),'MarkerSize',3.4*liWidthZoom(iFrame)); % linewidth
set(h_ro,'LineWidth',liWidthZoom(iFrame),'MarkerSize',3.4*liWidthZoom(iFrame)); % linewidth
set(tHand,'Color',[1 1 1]); % hide text
setXYlim(axesHandle, [xPos(iFrame) xPos(iFrame)+rangeList(iFrame)], [yPos(iFrame) yPos(iFrame)+rangeList(iFrame)]) % use pre-created zoom
drawnow
f1 = getframe(figHandle);
writeVideo(vid_uz,f1.cdata); % save video frame
if iFrame<=10 % at the start of the zoom in -> fade out the number
col = interp1([0 5 10],[0 0 1],iFrame);
set(tHand,'Color',col*[1 1 1]); %
else
set(tHand,'String',''); % just get rid of the number from now on
end
f2 = getframe(figHandle);
writeVideo(vid_nz,f2.cdata); % save video frame
end
end
switch mode{1}
case 'xyLim'
% getting a smooth zoom is the most difficult part
% the image is defined as square, but the full height and width
% is not always required. Extra space is assigned at the side,
% which requires it next.
constPadding = 0.015; % 1.5% padding around the actually used area
paddingFactorLowLeft = interp1([1 [0.15 0.2 0.8 0.95 1]*nFramesZoomOut], [1 1 1.04 1.04 1 1]+constPadding, 1:nFramesZoomOut);
xMinR = xMinR.*paddingFactorLowLeft; % start and end fit nicely with constPadding but during movement some padding is required around the dragon curve
yMinR = yMinR.*paddingFactorLowLeft; % start and end fit nicely with constPadding but during movement some padding is required around the dragon curve
paddingFactorTopRight = interp1([1 [0.15 0.2 0.8 0.95 1]*nFramesZoomOut], [1 1 1.02 1.02 1 1]+constPadding, 1:nFramesZoomOut);
xMaxR = xMaxR.*paddingFactorTopRight; % start and end fit nicely with constPadding but during movement some padding is required around the dragon curve
yMaxR = yMaxR.*paddingFactorTopRight; % start and end fit nicely with constPadding but during movement some padding is required around the dragon curve
xRange = xMaxR-xMinR; yRange = yMaxR-yMinR;
maxR = max(xRange,yRange);
assignableX = (maxR-xRange); % assignable space in x-direction
assignableY = (maxR-yRange); % assignable space in y-direction
figure(43543); clf; hold on; grid on
title('required limits')
plot([1:nFramesZoomOut nFramesZoomOut:-1:1],[xMinR fliplr(xMaxR)],'r', [1:nFramesZoomOut nFramesZoomOut:-1:1],[yMinR fliplr(yMaxR)],'b');
plot(assignableX,'m'); plot(assignableY,'k');
legend({'x limits','y limits','assignableX','assignableY'})
for iFrame = 1:nFramesZoomOut
xRange = xMaxR-xMinR; yRange = yMaxR-yMinR;
maxR = max(xRange,yRange);
assignableX = (maxR-xRange); % assignable space in x-direction
assignableY = (maxR-yRange); % assignable space in y-direction
if assignableX(iFrame)>0 % x has wiggle room
needAtRight = find(xMaxR >= xMaxR(iFrame)+ assignableX(iFrame),1,'first'); % when will space be required next?
needAtLeft = find(xMinR <= xMinR(iFrame)- assignableX(iFrame),1,'first'); % when will space be required next?
if and(isempty(needAtRight),isempty(needAtLeft))
nVal = xMinR(iFrame)-assignableX(iFrame)/2;
xMinR(iFrame:end) = min(xMinR(iFrame:end),nVal); % assign space
nVal = xMaxR(iFrame)+assignableX(iFrame)/2;
xMaxR(iFrame:end) = max(xMaxR(iFrame:end),nVal); % assign space
elseif or(isempty(needAtLeft), needAtLeft>needAtRight)
nVal = xMaxR(iFrame)+assignableX(iFrame);
xMaxR(iFrame:end) = max(xMaxR(iFrame:end),nVal); % assign space
elseif or(isempty(needAtRight), needAtLeft<needAtRight)
nVal = xMinR(iFrame)-assignableX(iFrame);
xMinR(iFrame:end) = min(xMinR(iFrame:end),nVal); % assign space
end
end
if assignableY(iFrame)>0 % y has wiggle room
needAtRight = find(yMaxR >= yMaxR(iFrame)+ assignableY(iFrame),1,'first'); % when will space be required next?
needAtLeft = find(yMinR <= yMinR(iFrame)- assignableY(iFrame),1,'first'); % when will space be required next?
if and(isempty(needAtRight),isempty(needAtLeft))
nVal = yMinR(iFrame)-assignableY(iFrame)/2;
yMinR(iFrame:end) = min(yMinR(iFrame:end),nVal); % assign space
nVal = yMaxR(iFrame)+assignableY(iFrame)/2;
yMaxR(iFrame:end) = max(yMaxR(iFrame:end),nVal); % assign space
elseif or(isempty(needAtRight), needAtLeft<needAtRight)
nVal = yMinR(iFrame)-assignableY(iFrame);
yMinR(iFrame:end) = min(yMinR(iFrame:end),nVal); % assign space
elseif or(isempty(needAtLeft), needAtLeft>needAtRight)
nVal = yMaxR(iFrame)+assignableY(iFrame);
yMaxR(iFrame:end) = max(yMaxR(iFrame:end),nVal); % assign space
end
end
end
% the zomm [min max] covers now the neccessary area but is very "stuttering"
figure(43544); clf; hold on; grid on
title('limits with assigned space/ filtered')
plot([1:nFramesZoomOut nFramesZoomOut:-1:1],[xMinR fliplr(xMaxR)],'r', [1:nFramesZoomOut nFramesZoomOut:-1:1],[yMinR fliplr(yMaxR)],'b');
% create smooth zoom with moving average filter & Zero-phase distortion
wind = 60; % window size
xMinR = filtfilt(ones(1,wind)/wind,1,(xMinR));
xMaxR = filtfilt(ones(1,wind)/wind,1,(xMaxR));
yMinR = filtfilt(ones(1,wind)/wind,1,(yMinR));
yMaxR = filtfilt(ones(1,wind)/wind,1,(yMaxR));
% Filter form end to start (right to left). This creates space anticipatory rather then lagging.
% As a result the dragon_curve does not reach out of the frame
wind = 48; b=ones(1,wind)/wind; a=1; % filter parameters
xMinR = fliplr(filter(b,a,fliplr(xMinR),filtic(b,a,ones(1,wind)*xMinR(end),ones(1,wind)*xMinR(end))));
xMaxR = fliplr(filter(b,a,fliplr(xMaxR),filtic(b,a,ones(1,wind)*xMaxR(end),ones(1,wind)*xMaxR(end))));
yMinR = fliplr(filter(b,a,fliplr(yMinR),filtic(b,a,ones(1,wind)*yMinR(end),ones(1,wind)*yMinR(end))));
yMaxR = fliplr(filter(b,a,fliplr(yMaxR),filtic(b,a,ones(1,wind)*yMaxR(end),ones(1,wind)*yMaxR(end))));
xRange = xMaxR-xMinR; yRange = yMaxR-yMinR;
maxR = max(xRange,yRange);
plot([1:nFramesZoomOut nFramesZoomOut:-1:1],[xMinR fliplr(xMaxR)],'r:', [1:nFramesZoomOut nFramesZoomOut:-1:1],[yMinR fliplr(yMaxR)],'b:');
legend({'x limits','y limits','x filtered','y filtered'})
figure(figHandle); % back to main figure
otherwise % {'rectangular','chamfered'}
% finish animation
close(vid_u ); disp(['MP4 completed: ' videoFileNames{end-3} '.mp4']);
close(vid_uz); disp(['MP4 completed: ' videoFileNames{end-2} '.mp4']);
close(vid_n ); disp(['MP4 completed: ' videoFileNames{end-1} '.mp4']);
close(vid_nz); disp(['MP4 completed: ' videoFileNames{end} '.mp4']);
end
end
for iVid = 1:numel(videoFileNames)
disp(['Conversion of ' videoFileNames{iVid} ' from MP4 to WebM (Matlab currently does not support webm)']);
if exist('ffmpeg.exe','file') == 2 % check if it is a valid path to an existing file
try
dosCommand = ['!ffmpeg -i ' videoFileNames{iVid} '.mp4 '... % Command and source
'-c:v libvpx-vp9 -crf 30 -b:v 0 -deadline best '... % constant (best) quality; see: https://trac.ffmpeg.org/wiki/Encode/VP9
'-metadata title="' videoFileNames{iVid} '" '... % see: https://wiki.multimedia.cx/index.php/FFmpeg_Metadata
'-metadata author="Jahobr" -metadata copyright="CC0 1.0 Universal Public Domain Dedication" '...
'-metadata license="CC0 1.0 Universal Public Domain Dedication" '...
videoFileNames{iVid} '.webm']; % conversion target
eval(dosCommand); % run conversion from mp4 to webm
delete(fullfile(pathstr,[videoFileNames{iVid} '.mp4'])); % delete mp4 version after conversion (to save disc space)
catch ME
disp(ME)
end
else
disp(['"ffmpeg.exe" not available in path "' pathstr '" (or other problem); see https://ffmpeg.zeranoe.com/builds/']);
end
end
function [xy] = rotateCordiantes(xy,anglee)
% [x1 x2 x3 ... ; y1 y2 y3 ...] coordinates to rotate
% anglee angle of rotation in [rad]
rotM = [cos(anglee) -sin(anglee); sin(anglee) cos(anglee)];
xy = rotM*xy;
function setXYlim(axesHandle,xLimits,yLimits)
% set limits; practically the axis overhangs the figure all around, to
% hide rendering errors at line-ends.
% Input:
% axesHandle:
% xLimits, yLimits: [min max]
overh = 0.05; % 5% overhang all around; 10% bigger in x and y
xlim([+xLimits(1)*(1+overh)-xLimits(2)*overh -xLimits(1)*overh+xLimits(2)*(1+overh)])
ylim([+yLimits(1)*(1+overh)-yLimits(2)*overh -yLimits(1)*overh+yLimits(2)*(1+overh)])
set(axesHandle,'Position',[-overh -overh 1+2*overh 1+2*overh]); % stretch axis as bigger as figure, [x y width height]
drawnow;
|
Лицензияләү
Я, владелец авторских прав на это произведение, добровольно публикую его на условиях следующей лицензии:
Этот файл доступен на условиях Creative Commons CC0 1.0 Универсальной передачи в общественное достояние (Universal Public Domain Dedication). | |
Лица, связанные с работой над этим произведением, решили передать данное произведение в общественное достояние, отказавшись от всех прав на произведение по всему миру в рамках закона об авторских правах (а также связанных и смежных прав), в той степени, которую допускает закон. Вы можете копировать, изменять, распространять, исполнять данное произведение в любых целях, в том числе в коммерческих, без получения на это разрешения автора.
http://creativecommons.org/publicdomain/zero/1.0/deed.enCC0Creative Commons Zero, Public Domain Dedicationfalsefalse |
Оценка
Этот файл был выбран медиафайлом дня за 31 мая 2019. Название файла:
English: Animation of an unfolding Dragon curve. The order is increased from 0 to 17. The curve is chamfered for better visibility of the path. After reaching order 17 it is zoomed in to show the emerging pattern.
На других языках
Čeština: Animace iteračního výpočtu dračí křivky do 17 iteračních kroků. Po dosažení 17. kroku je výsledný vzor zvětšen pro názorné zobrazení výsledné křivky. Deutsch: Erstellung einer Drachenkurve durch wiederholtes Kopieren und Rotation der Kopie um 90 Grad. English: Animation of an unfolding Dragon curve. The order is increased from 0 to 17. The curve is chamfered for better visibility of the path. After reaching order 17 it is zoomed in to show the emerging pattern. Polski: Animacja rozwijającego się smoka Heighwaya. Rząd krzywej zmienia się od 0 do 17. Dla lepszej widoczności krzywa jest sfazowana. Po osiągnięciu 17. rzędu zostaje powiększona w celu pokazania pojawiającego się wzoru.
|
Элементы, изображённые на этом файле
тасвирланган феномен
У этого свойства есть некоторое значение без элемента в
30 май 2019
MIME-тип рус
video/webm
Файл тарихы
Файлның нинди булганлыгын күрү өчен «дата/вакыт» дигәненә басыгыз.
Дата/вакыт | Кече рәсем | Үлчәмнәре | Кулланучы | Искәрмә | |
---|---|---|---|---|---|
агымдагы | 30 май 2019, 07:25 | 50 с, 1024 × 1024 (99,89 Мб) | Jahobr | User created page with UploadWizard |
Файлны куллану
Әлеге файл киләсе битне куллана:
Файлның гомуми кулланышы
Әлеге файл аста бирелгән викиларда куллана:
- vep.wikipedia.org проектында куллану
Метабирелмәләр
Бу файлда гадәттә санлы камера яки сканер тарафыннан өстәлгән мәгълүмат бар. Әгәр бу файл төзү вакытыннан соң үзгәртелгән булса, аның кайбер параметрлары дөрес булмаска мөмкин.
Кулланылган программа |
|
---|---|
Кыска исем | Dragon_Curve_unfolding_chamfered_zoom_numbered |
Авторлык хокукы иясе | CC0 1.0 Universal Public Domain Dedication |
Куллану шартлары | CC0 1.0 Universal Public Domain Dedication |