MATLAB | 官方举办的动图绘制大赛 | 第一周赛情回顾

嘿真的又是很久没见了,最近确实有点非常很特别小忙,今天带来一下MATHWORKS官方举办的迷你黑客大赛第三期(MATLAB Flipbook Mini Hack)的最新进展!!目前比赛已经刚好进行了一周,前两届都要求提交280个字符内的代码来生成图片,但是这一届,要求提交2000个字符内的代码来生成动画,字符限制一放开大家就开始有种各显神通的意思,仅仅一周就贡献了接近200个优质作品

本次比赛要求提交名为drawframe(f)的函数代码,生成长达2s,48帧的动态图,动图生成是依靠如下代码来做到的:

function contestAnimator()animFilename = 'animation.gif'; % Output file namefirstFrame = true;framesPerSecond = 24;delayTime = 1/framesPerSecond;% Create the giffor frame = 1:48drawframe(frame)fig = gcf(); fig.Units = 'pixels';fig.Position(3:4) = [300,300];im = getframe(fig);[A,map] = rgb2ind(im.cdata,256);if firstFramefirstFrame = false;imwrite(A,map,animFilename, LoopCount=Inf, DelayTime=delayTime);elseimwrite(A,map,animFilename, WriteMode="append", DelayTime=delayTime);endend
end

闲话少叙,一起看作品!!


作品概览

看过前两期比赛的人应该对Tim大佬有着深刻的印象这期比赛第一周他也贡献了三个优质的作品:

Tim / Rolling fog

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13177

function drawframe(nn)% Moon over rolling fog.  % Comments below,% Persistent variables -> keep you from having to recompute these% variables at each iteration / save computation timepersistent enz ags x d c mx my mn cmpif nn == 1        % Everything is precomputed so we don't really need this -> undo to% get different clouds each timerng default% Base vector for pixelsx = linspace(-1, 1, 240);% Make complex 3D noise spectrum -> spectrally shaping using% distance. This is expensive so only do once.b=length(x);d=x(1:2:end)/2;c=length(d);r = ifftshift(sqrt((x*2).^2 + d'.^2 + permute(x.^2, [1, 3, 2])));ags = linspace(0, 2*pi, 49);enz = exp(6i*randn(c, b, b))./max(r.^2.4,2e-5);% Make moon[mx, my] = meshgrid(x);rd = (mx-0.6).^2 + (my+0.2).^2;mn = 1 - erf(max(rd - 0.3, 0)*3);% Custom colormap for cloudscmp = linspace(0, 1, 256)'.*[1, 1, 1];cmp(:, 1) = cmp(:, 1).^1.6;cmp(:, 2) = cmp(:, 2).^1.6*0.97;cmp(:, 3) = tanh(cmp(:, 3))*1.1;end% Compute current noise realization. Linear phase causes a looping% shift and offset creates the cloud morphing.dt = abs(ifftn(exp(1i*(x.*ags(nn)/2 - ags(nn)/2)).*enz));% Tapering the noisedt = 5*dt.*(d-d(1))'.*permute(erf((x - 0.1)*2)+1, [1, 3, 2]);dt = dt(:, :, 1:end);% Thresholding for transparencyap = dt>0.08;% Making it look like clouds / adding glintc_alp = cumsum(ap, 3);CLS = (1.1 - erf(c_alp/5)).*ap.*dt;ALP = ap.*rescale(dt);% Alpha blend across volume[AI, AS] = P(ALP, CLS);% Loop spatially / keeps formations in roughly same spot. Turn off to% see a different cloud movement effect.AI = circshift(squeeze(AI)', [0, -5*nn]);AS = circshift(squeeze(AS)', [0, -5*nn]);% Web Matlab's 3D rendering is so slow that this fails to execute if% you use surf to blend the images, so let's use the alpha-blender used% to flatten the clouds for the RGB background, moon and cloud layers% Convert clouds to RGB image using custom colormapC = round(min(AI*40, 1)*255+1);C = double(ind2rgb(C, cmp));% Permuter to work with alpha blending function conventionPP = @(x)permute(x, [3, 2, 1]);% This is a mess, but, it computes the alpha then applies the alpha% blender to each channel and combines to form an image.A = PP(cat(3, AS, mn, ones(size(mn))));    IG = PP([P(A, PP(cat(3, C(:, :, 1), mn, 0*mn))); P(A, PP(cat(3, C(:, :, 2), mn, 0*mn))); P(A, PP(cat(3, C(:, :, 3), mn*0.9, 0*mn)))]);% Now, show.image(IG); axis equal; camva(5.8);%S.D.G.% Alphablend functionfunction [AIf, ASf] = P(ATf, CLSf)ASf = ATf(1, :, :);AIf = CLSf(1, :, :);% Have alpha, have intensity, compress onto single plane using alpha% blending formulafor nf = 2:size(ATf, 1)APf = ASf;ASf = APf + ATf(nf, :, :).*(1-APf);AIf = (AIf.*APf + CLSf(nf, :, :).*ATf(nf, :, :).*(1-APf))./(eps + ASf);endend
end

Tim / Endless tunnel

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/12822

% % % Endless Tunnel
%
% How this works:
% - A torus is generated with texture that is periodic at pi/4 intervals
% - The camera is moved around a quarter of the torus so that looping has
%   no discontinuities.
%
% We are swimming in characters this year so this could be significantly
% compressed and more features added!
function drawframe(nn)
% This enables the same "random" texture to be created every time
rng default;
r=6;                            % Torus radius
N=80;                           % Texture resolution. Set to higher on your own computer for improvements.% (Has longer rendering times!)
R=zeros(N, N*8);                % Initial torus radius
R(:,N/2:N:end)=-.02;            % Notches every bit
R=conv2(R,[1:4,3:-1:1],'same');                         % Fare the notches
R=R+conv2(randn(size(R))/500,ones(3)/9,'same')+1;       % Add some random noise. Probably doesn't do a whole% lot for N = 80.
R(end, :)=R(1, :);                                      % Match endpoints to prevent a glitch
% Make angles for torus (radial and axial)
l=@(x)linspace(0,2*pi,x);
ag1=l(N)';
ag2=l(N*8);
% This will be the tunnel
b=R.*cos(ag1);
z=R.*sin(ag1);
x=b.*cos(ag2)+r*cos(ag2);
y=b.*sin(ag2)+r*sin(ag2);;
% This will be the algae growing on the pipe
R2=R*.99;
b=R2.*cos(ag1);
z2=R2.*sin(ag1);
x2=b.*cos(ag2)+r*cos(ag2);
y2=b.*sin(ag2)+r*sin(ag2);
% This will eventually be the water at the bottom
rd=linspace(4, 8, N)';
xd=rd.*cos(ag2);
yd=rd.*sin(ag2);
% Make camera positions
ag=linspace(0,2*pi,48*4);
cpx=r*cos(ag);
cpy=r*sin(ag);
cpz=zeros(size(cpx))-0.2;
% Texture: this will be the water. Making a complex random
% function. Noise generated spectrally like this has looping boundaries /
% can be tiled, so it is tiled for start/end consistency
[xx,yy]=meshgrid(linspace(-1,1,N*8),linspace(-1,1,N));
rd=sqrt(xx.^2+yy.^2);
sgnO=((randn(N, N*8)+1i*randn(N, N*8))./((ifftshift(rd.^2)+1e-5)));
sgnO=ifft2(sgnO(:,[1:N,end-N+1:end]));
sgnO=[sgnO,sgnO,sgnO,sgnO];
% This will be the algae on the side.
sg=(((randn(N,N*8)+1i*randn(N, N*8))./((ifftshift(rd.^2)+1e-6))));
sg=real(ifft2(sg(:, 1:N*2)));
sg=[sg,sg,sg,sg];
sg=erf(sg*2)+1;
sg=-sg.*(1-erf(sin(ag1)+1));
% This will be our phase looper. Since the water phase noise is complex, we
% can loop over 2*pi to get a splashing effect
ags=linspace(0, pi/4, 49);
ags=ags(1:48);
clf             % Lights seem to accumulate without this...
% Algae color
clrF      = permute([0.3, 0.5, 0.3]*0.4, [1, 3, 2]);
% Faster if we limit the number of faces generated each frame... this
% truncates the rendered portion of the torus to what is visible
[~, ci]   = min(abs(ag2-ag(nn)));
rgv       = (1:N*2) + ci;
% Update water noise using a phase rotation
sgn      = real(sgnO.*exp(1i*ags(nn)*16));
sgn      = sgn - mean(sgn(:));
sgn      = erf(1*sgn/std(sgn(:)));
% Truncate
sgn     = sgn(:, rgv);
sg      = sg(:, rgv);
idz     = N*8;
% Begin plotting
clr     = (conv2(rand(N, N*8), ones(5)/25, 'same')*0.3+0.7).*ones(N, N*8, 3)*0.5;
surf(x(:, rgv), y(:, rgv), z(:, rgv), clr(:, rgv, :), 'SpecularStrength', 1, 'AmbientStrength', 0);
hold on;
surf(x2(:, rgv), y2(:, rgv), z2(:, rgv), (rand(size(sgn))*0.2+0.8).*clrF, 'FaceAlpha', 'flat', 'AlphaData', erf(rescale(1-sg)*2+0.5)*1, 'SpecularStrength', 0, 'AmbientStrength', 0);    
surf(xd(:, rgv), yd(:, rgv), rand(size(sgn))*0.002 + sgn/20-0.8, 'FaceAlpha', 0.9, 'AmbientStrength', 0, 'DiffuseStrength', 0.35, 'SpecularStrength', 1);
% Appearance and camera settings
shading interp
axis equal
camproj('Perspective');
camva(50);
campos([cpx(nn), cpy(nn), cpz(1)+sin(ags(nn)*16)/6 - 0.2]);
camtarget([cpx(nn+18), cpy(nn+18), cpz(nn+18)-0.4]);
% Headlight: one doesn't seem strong enough
camlight;
camlight
D = camlight;
D.Color = [0.6, 0.8, 1];
% This is inefficient, should just directly set water color in the call to
% surf but you can pick a different colormap to alter the water color here
cmp = copper + summer;
colormap(cmp/2);
caxis([-1, 1]);
% S.D.G.
end

Tim / Ring world

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13660

function drawframe(f)
% Ring world...
persistent H CS S3 U
if f==1rng(2,'v4')% % % % Make the ring % % % %r=6;                % RadiusN=60;              % Number of edge-pixels on base unitU=8;                % Rotating by 1/8 of a circle% Add texture to ring. Make it tech-yR=zeros(N,N);R(randi(N^2, 3))=1;k1=ones(N/2)/10;k2=k1;k2(2:end-1,2:end-1)=0;      % Kernel for glowing lightsRL=conv2(R,k2,'same');      % Glowing lightsR=conv2(R,k1,'same');       % Surface% TilingR=repmat(R,[1,U])+1;RL=repmat(RL,[1,U]);% Fix seams. Expendable code.R=s(R,N);RL=s(RL,N);RB=(R-1)/2;RL=RL./RL;% Notch to fit the land in...NH=N/2;NW=floor(N/6);R(NH-NW+1:NH+NW, :)=0;% Make our anglesl=@(x)linspace(0,2*pi,x);ag1=l(N)';a=l(N*U);c=cos(a);v=sin(a);% Ring torusb=erf(R.*cos(ag1)*5)+RB;   % Make it square-ishz=R.*sin(ag1);x=b.*c+r*c;y=b.*v+r*v;% % % % Make the land inside.% Spectral noise shaping... land mass will be a noisy cylinderq=linspace(-1,1,N);rand(8);k=@()exp(6i*randn(N))./(q.^2+q'.^2+2e-4);oo=@(x)ifft2(x);B=rescale(abs(oo(k())))-.3;CS=k();C=rescale(abs(real(oo(CS.*exp(1i*.10)))))-.5;X=@(x)max(repmat(x,[1,U])',0);B=X(B)/2;    % Max makes the waterC=X(C);      % Clouds% Assemble the cylinder   s [xl,yl,zl]=cy(a',q,r-B/3-.6,N);      % Land[xc,yc,zc]=cy(a',q,r+0*B-1.1,N);     % Cloud[xa,ya,za]=cy(a',q,r+0*B-1,N);       % Atmosphereza=za*1.1;% Custom colormap: landscapey with low value = blue = watercmp=max(copper,summer);cmp(1,:)=[.1,.3,1]/2;% Now plotH=hgtransform();surf(x,z,y,'pa',H);          % Ringmaterial([0,.1,.6,3]);hold on;surf(x,z,y,RL.*cat(3,0,1,1),'AmbientS',1,'pa',H);          % Lighthold on;% Land, clouds, atmosphS=surf(xl,zl,yl,B,'pa',H);wn=sin(ag1/2); alph =(1-wn).^3'.*ones(N*U, 1); cp = rescale(alph, 0.7, 1);cp = cat(3, cp.^8, cp.^2.5, cp.^0.9);   mm=@(x,y)material(x,y);S3=surf(xc,zc,yc,0*xc+cat(3,1,1,1),'FaceAlpha','flat','AlphaData',erf(C*4),'pa',H);    S2=surf(xa,za,ya,cp,'FaceAlpha','flat','AlphaData',alph.^.7);mm(S3,[1,0,0,5]);mm(S2,[.6,1,0,5]);mm(S,[0,1,.3,20]);colormap(cmp);caxis([0,.3]);axis equalshading flat% Add starsx=randn(3,900);x=x./vecnorm(x)*20;scatter3(x(1,:),x(2,:),x(3,:),rand(900,1)*100,rand(900,1)*[1,1,1],'.');hold off;% Axis / camera etc.shading flataxis equal offlight('position',[0,-20,0]);light('position',[10,10,5]);lighting('gouraud');shading flatset(gcf,'color','k');camproj('perspective')camva(30);campos([78, -40, -40]/6);camtarget([-1, 0, -1]);endags=linspace(0,2*pi,49);oo=@(x)ifft2(x);C=rescale(abs(real(oo(CS.*exp(1i*ags(f))))))-.5;X=@(x)max(repmat(x,[1,U])',0);C=X(C);      % Cloudscampos([78,-40+sin(ags(f))*2,-40]/6)
S3.AlphaData=erf(C*4);
set(H,'Ma', makehgtform('yrotate',(f-1)*pi/4/48));
end
% Extra functions:
% Make xyz cylinder coordinates
function [x,y,z]=cy(a,q,R,N)x=cos(a).*R;y=sin(a).*R;z=q.*ones(N*8,1)*.9;
end
% Seam joiner
function g=s(g,N)
d=g(N,:)/2+g(1,:)/2;
g(1:4, :) = d.*ones(4,1);
g(end-3:end,:) = d.*ones(4,1);
end

Augusto Mazzei这位大佬在第一周最后关头交上的非常炫酷且优质的作品:

Augusto Mazzei / COLOR PULSE

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13775

1

function drawframe(f)% @"kishimisu" I don't know who you are but you are GLSL god.% this is my transposed version in MATLAB.% https://www.shadertoy.com/view/mtyGWy% What I've learned transposing GLSL to MATLAB:% vec.length = vecnorm( vec,2,3)% vec.fract  = mod( vec, 1)% - all the rest is nearly pure math and talent.iRes = cat(3, 800, 800);
iTime = f/47*3;
persistent fragCoord
if isempty(fragCoord)[x,y]=meshgrid(1:iRes(1), 1:iRes(2));fragCoord = cat(3,x,y);
end
img = mainImage(fragCoord);
imagesc(img)
axis equal
axis off
function out=palette( t )cc = ones(1,1,3);aa = cc/2; dd = reshape([0.263,0.416,0.557],1,1,3);out = aa + aa.*cos( 6.28318*( cc .* t + dd) );
end
function finalColor=mainImage( fragCoord )uv = (fragCoord * 2 - iRes) / iRes(2);uv0 = uv;finalColor = 0;i=0;while i < 4uv = mod(uv * 1.5, 1) - 0.5;d = vecnorm(uv,2,3) .* exp(-vecnorm(uv0,2,3));col = palette( vecnorm(uv0,2,3) + i *0.4 + iTime*0.4);d = sin( d*10 + iTime )/8;d = abs(d);d = (0.01 ./ d).^ 1.2;finalColor = finalColor + col .* d;i=i+1;end
end
end

hiahiahia他甚至还弄了个自画像:

Augusto Mazzei / PORTRAIT

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13475

function drawframe(f)if any(f==1:4:48)
hold off
yy = [198 189];
xx = [388 554];
% I took these coordinates using 'drawpolygon' eheh :)
bocca =[411  370;438 383;466 386;497 382;504 382;525 366;482 362;469 366;448 363];
nose=[420 313;443 296;513 306;460 316];
eyeL = [345 198;368 193;372 207;390 207;402 202;400 193;404 188;420 187;389 176;346 187];
neck=[383 437;383 586;633 558;609 408];
eyebL=[325 163;357 153;401 148;427 143;417 126;379 121;348 134];
eyebR=[503 149;519 114;574 118;594 126;627 158;601 148;572 140;533 144];
nero=[109 832;99  730;152  592;318  525;363  515;553  486;674  500;733  539;770  595;805  605;850  840;820  837;784  837];caps=[228 72;255   79;280   29;291   13;680    4;695   44;699  128;677  174;656  249;653  112;587  121;619   97;517  109;582   66;487   92;541   35;436  118;400  118;468   69;360  109;302  144;302  246;272  157;264  170;248  143;252  112];rosso=[377 474;336 658;404 595;449 699;654 574;672 535;627 437;621 486;416 592];rosa=[295 222;280 204;278  253;297 333;323 357;331 392;368 458;442 495;522 484;599 443;636 370;649 316;679 280;690 202;685 183;657 200;661 97;628 18;317 20;290 108];marr = [.3 .2 .14];
dra( nero,'k');
dra( neck,[1 .90 .90]); 
dra( rosso,[.63 .07 .18]);
dra( rosa,[1 .94 .94]); 
dra( bocca,[.81 .67 .61]); 
dra( nose,[.95 .9 .9]);
dra( caps,marr); 
dra( eyebL,marr); 
dra( eyebR,marr);
for i=1:2for j=1:100drawc([xx(i)+rand*5 -(yy(i)+rand*5)])end
end
axis equal
axis off
set(gcf,'color',[255,255,224]/255)end 
end
function dra(a,c)fill(a(:,1),-a(:,2),c,'EdgeCol','none'); hold on
end
function drawc(c)
r = 10+rand*6;    
aa = 2*pi*linspace(0,1,randi([4 8]));
fill( sin(aa)*r+c(1)+randn*5, randn*5+cos(aa)*r+c(2), hsv2rgb([rand .5 1]),...'FaceAlpha',.5,'EdgeColor','none');
end

以下是一个在比赛最开始几天非常惊艳的作品,由Jenny Bosten大佬绘制:

Jenny Bosten / Midnattsol

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/12937

function drawframe(f)
g1=[45	129	191
64	148	195
135	178	210
158	196	215
170	207	216
210	219	218];
g2=[120	110	119
142	119	113
167	123	88
194	134	72
206	142	68
219	142	28];
z=linspace(1,6,100);
d=[linspace(10,30,24) linspace(30,10,24)];
x(:,:,1)=interp1(1:6,g1,z);
x(:,:,2)=interp1(1:6,g2,z);
x=permute(x,[3 1 2]);
x=permute(interp1([1,48],x,1:2:48),[2,3,1])./255;
x=cat(3,x,x(:,:,end:-1:1));
a=1000;
q=linspace(-235,235,48);
m=linspace(pi,-pi,48);
X=linspace(-255,255,a);
[t,r]=cart2pol(X-q(f),100+X'-100*cos(m(f)));
[x_i,y_i]=find(r<21);
[x_i2,y_i2]=find(r<3);
b=x(:,:,f);
j=[1 1 .9];
colormap([j;flipud(b)]);
r(r<20)=1;
for k=1:300
y(k,:)=circshift(r(min(x_i),:),randi(100)-50);
y(k,y_i2+round(randi(round(d(f)))-d(f)/2))=1;
end
imagesc([r(100:600,:);y])
axis equal
axis off
xlim([100 900]);
end

甚至还有人绘制了本场比赛的logo:

Chen Lin / Mini Hack 2023 Logo

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13022

% Author:Eric Ludlam
function drawframe(f)
% Constantsblue=validatecolor("#0076a8");darkblue=validatecolor("#004b87");S.vertices = [ 0 2 0; 1 2 0;  % top1 0 0; 2 0 0;  % middle0 -2 0; 1 -2 0; % bottom];S.faces = [ 1 2 4 3;3 4 6 5;];S.facevertexcdata = [ 1 ;1 ];% Convert our number into different animation stages.framemax = floor(48/5); % 5 stagesstage = ceil(f/framemax);f = mod(f-1,framemax)+1;  % approx 9 frames per stageif stage > 5stage = 5;f = f + framemax;framemax = framemax + 4;end% Initializeif f==1 && stage==1ax = newplot;set(gcf, 'color','white');axis(ax, [ -2 6 -5 3 0 1 ])set(ax, 'position', [ 0 0 1 1], 'visible','off','tag','mh_ax')daspect(ax,[1 1.5 1]);clim([1 2]);colormap(ax,[ blue; darkblue]);p1 = patch('vertices',[], 'faces', [], 'FaceColor', 'flat', 'EdgeColor', 'none', 'tag', 'chevron1');p2 = patch('vertices',[], 'faces', [], 'FaceColor', 'flat', 'EdgeColor', 'none', 'tag', 'chevron2');txt = text(0,0,'', ...'FontUnits', 'norm', ...'FontSize', .17, ... % normalized units lets you resize this fig to any old size.'Color', blue, ...'VerticalAlignment', 'top',...'HorizontalAlignment', 'center',...'tag', 'mh_txt');elsep1 = findobj('tag','chevron1');p2 = findobj('tag','chevron2');txt = findobj('tag','mh_txt');end% Animateswitch stagecase 1 % First chevron appearsxrng = linspace(-4,0,framemax);x = xrng(f);S.vertices = S.vertices + [ x 0 0 ];set(p1, S);set([txt p2], 'visible','off');case 2 % Flip downtmp = S.vertices([1 2],:);yrng = linspace(2,-2,framemax);tmp(:,2) = yrng(f);S.vertices = [ S.verticestmp ];S.faces = [ S.faces3 4 8 7 ];S.facevertexcdata = [ 1;1;2 ];set(p1, S);case 3 % Second chevron appearsxrng = linspace(-4,2,framemax);x = xrng(f);S.vertices = S.vertices + [ x 0 0 ];S.facevertexcdata(2) = 2;set(p2, S, 'visible','on');case 4 % Minihack Txt appearsxrng = linspace(-5,2,framemax);x = xrng(f);clr = sprintf('\\color[rgb]{%.2f,%.2f,%.2f}', darkblue);set(txt, 'visible','on', 'Position', [x -2.5], 'String', "Mini \bf" + clr + "Hack");case 5 % Txt color changerrng = linspace(darkblue(1),blue(1),framemax);grng = linspace(darkblue(2),blue(2),framemax);brng = linspace(darkblue(3),blue(3),framemax);clr = sprintf('\\color[rgb]{%.2f,%.2f,%.2f}', rrng(f),grng(f),brng(f));set(txt,'String', "Mini \bf" + clr + "Hack");end
end

剩下一些不详细讲解了,大家自己看叭~

Seth DeLand / Ray Tracing: Red Ball Rolls By

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13372


function drawframe(xx)
% Inspiration: https://www.gabrielgambetta.com/computer-graphics-from-scratch/reflection.html
%% Scene Setup
vs = [1.5 1]; % viewport size
p = 1; % projection plane
O = [0 0 0];
c = eye(3); % Camera Rotation
Cw = 120; Ch = 80;
cnvs = zeros(Cw+1,Ch+1,3); % Canvas of pixels
b = Sphere([8/47*xx-196/47 -1 3],1,[0 0 255],500,0.2);
r = Sphere([2 0 4],1,[255 0 0],500,0.3);
g = Sphere([-2 0 4],1,[0 255 0],10,0.4);
y = Sphere([0 -5001 0],5000,[0 255 255],1000,0.5);
sp = [r g b y];
l1 = Light('amb',0.2,[],[]);
l2 = Light('pt',0.6,[2 1 0],[]);
l3 = Light('dir',0.2,[],[1 4 4]);
ls = [l1 l2 l3];
%%
for i = 1:Cw+1 % For each column of pixelsx = i-1-Cw/2;slc = zeros(1,Ch,3);for j = 1:Ch+1 % For each row of pixelsy = j-1-Ch/2;D = C2V(x,y,Cw,Ch,vs,p);D = (c*D')';color = TR(O,D,1,inf,sp,ls,3);slc(1,j,:) = rot90(color);endcnvs(i,:,:) = slc;
end
% Show the canvas, upsample by a factor of 2
imshow(imresize(rot90(uint8(cnvs)),2));
axis equal;
end
%%
function D = C2V(x,y,Cw,Ch,V,d)% Canvas to ViewportD = [x*V(1)/Cw, y*V(2)./Ch, d];
end
function c = TR(O,D,ti,ta,sp,ls,rd)% Trace Ray% rd: recursion depth[cs,ct] = CI(O,D,ti,ta,sp);if isempty(cs)c = [0 0 0];returnelseP = O + ct*D; % Compute intersectionN = P-cs.m; % Compute sphere normal at intersectionN = N/norm(N);c = cs.c*CL(P,N,ls,-D,cs.s,ta,sp);endr = cs.rf;if ~(rd<=0 || r<=0)R = RR(-D,N);rc = TR(P,R,0.001,Inf,sp,ls,rd-1); % reflected colorc = c*(1-r)+rc*r;end
end
function [s,t] = CI(O,D,t_min,t_max,sp)% CI: ClosestIntersectiont = inf; % Distance to sheres = []; % Spherefor i = 1:length(sp)[t1,t2] = IRS(O, D, sp(i));if t1>t_min && t1<t_max && t1 < tt = t1;s = sp(i);endif t2>t_min && t2<t_max && t2 < tt = t2;s = sp(i);endend
end
function i = CL(P,N,ls,V,s,ta,sp)% Compute Lightingi = 0;for l = 1:length(ls)if strcmp(ls(l).t,'amb') % Ambient lighti = i+ls(l).i;elseif strcmp(ls(l).t,'pt') % Point lightL = ls(l).p - P;elseL = ls(l).d; % Diffuse lightend% Shadow Checkss = CI(P,L,0.001,ta,sp);if ~isempty(ss)continueend% Diffusen_dot_l = dot(N,L);if n_dot_l>0i = i + ls(l).i*n_dot_l/(norm(N)*norm(L));end% Specularif s ~= -1R = RR(L,N);r_dot_v = dot(R,V);if r_dot_v > 0i = i + ls(l).i*(r_dot_v/(norm(R)*norm(V)))^s;endendendend
end
function r = RR(R,N)% Reflect Rayr = 2*N*dot(N,R)-R;
end
function [t1,t2] = IRS(O,D,s)% IntersectRaySphereC = s.m;r = s.r;OC = O - C;k1 = dot(D, D);k2 = 2*dot(OC, D);k3 = dot(OC, OC) - r*r;d = k2*k2 - 4*k1*k3; % discriminantif d < 0t1 = inf;t2 = inf;elset1 = (-k2 + sqrt(d)) / (2*k1);t2 = (-k2 - sqrt(d)) / (2*k1);end
end
function l = Light(t,i,p,d)% t: type (amb: ambient, pt: point, dir: directional)% i: intensity% p: position% d: directionl.t = t;l.i = i;l.p = p;l.d = d;
end
function s = Sphere(cntr,r,col,spec,ref)% cntr: center% r: radius% col: color% spec: spectral% ref: reflectives.m = cntr;s.r = r;s.c = col;s.s = spec;s.rf = ref;
end

Adam Danz / Rainy evening in the MATropolis

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13213

function drawframe(f)
persistent handles
if f == 1 || isempty(handles)rng('default')axes(colormap=gray,View=[172,22],Color='k')hold oncamva(3)h=randg(1,25);          % building heightsb=bar3(h);axis equalg=.17;                  % height and width of windows[m,k]=ndgrid(1:25);     % (x,y) building indiceshandles.w = gobjects(0);for i=1:625             % loop through each building% Interpolate building color according to building height% Ideally this should be outside the loop but that would require more charactersq=b(m(i));set(q,'CData',q.ZData,'FaceColor','interp')for j=1:2                   % loop through each column of windowsL=k(i)-.27+(j-1)*.37;   % in k-a+(j-1)*b, a is the signed distance from center of building in row k(i) to left edge of window in column j and b is the interval between left edges of windows.x=L+[0,g,g,0]';         % [L;R;R;L] edges of windows in building i, window column jz=ones(4,1)*(.2:.4:h(i)-.2)+[0;0;g;g]; % 4xn height of windows for n levels of windows; in a:b:c a is height of first row of windows, b is the interval between window-bottoms, c is height of tallest window.y=z*0+m(i)+.45;          % 4xn location of front face of building% Plot windows for building i, column jfor w = 1:width(z)handles.w(end+1)=patch(z(:,w)*0+x,y(:,w),z(:,w),'y');if rand(1) < 0.25handles.w(end).FaceColor = 'none';endendendendset(gcf,'color','k')axis offcamva(2.5)campos([58.256 185.12 25.621])view([165.27, 7.0091])clim([0 8])% lightning lighthandles.light = light('style','infinite',...'Position',[-0.21759 1.3841 0.1921], ...'Visible', 'off');% lightning backgroundax = gca;handles.Z = patch(ax.XLim([2,2,1,1]),...ax.YLim([1 1 1 1]),...ax.ZLim([1 2 2 1]),...[6 7.5 -3 -6],...'Visible','off');handles.rain = gobjects(1);xlim(xlim) % lazy way of freezing axis limitsylim(ylim)zlim(zlim)
end
% randomly toggle on/off some window lights
p = 0.001;  % portion (0:1) of lights to toggle
n = numel(handles.w);
idx = randperm(n,ceil(n*p));
colors = {handles.w(idx).FaceColor};
isnone = cellfun(@ischar, colors);
set(handles.w(idx(isnone)), 'FaceColor', 'y')
set(handles.w(idx(~isnone)), 'FaceColor', 'none')
% Show lightning on select frames 
lightningFrames = [24 26 28 29 31:34];
onoff = ismember(f,lightningFrames);
handles.light.Visible = onoff;
handles.Z.Visible = onoff;
% Rain
if mod(f,2)>0 % update every odd framehandles.rain.deletexyRain0 = rand(3,300).*[26;26;10]-[0;0;2];xyRain1 = xyRain0 + [-1;0;-2]; % orientation and length of rain lineshandles.rain = plot3([xyRain0(1,:);xyRain1(1,:)], ...[xyRain0(2,:);xyRain1(2,:)], ...[xyRain0(3,:);xyRain1(3,:)], ...'color',[.7 .7 .7 .4]);
end
end

Jenny Bosten / Time lapse of Lake view to the West

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13760

function drawframe(f)
persistent u n b M2 a2 a2_a r2
if f==1
u=@linspace;
n=@rescale;
b=@circshift;
q=400;
a=1.65;
m=0;
%sets up the colormap
g=[0.5373    0.1529    0.08240.6745    0.2353    0.11760.8706    0.3412    0.16470.9176    0.6353    0.24710.9843    0.9922    0.9725];
g=interp1(u(0,100,5),g,u(0,100,255));
g2=g-.15;
g2(g2<0)=0;
colormap([g;g2]);
% for the sunset have 2 different colourmaps for the background and the
% clouds then blend within each channel
%declare some functions and variables to save characters
X=u(1,255,200); %vector ranging between 1 and 255 200 long
X2=u(-1,1,400); %vector ranging between -1 and 1 400 long
[t2,r2]=cart2pol(X2,X2'+.1);%make radial gradient for the sun
M=n(-r2(1:200,:),1,280);%or for sun
X=u(-1,1,q);
[t,r]=cart2pol(X,X'); %create r matrix for filter in fourier transform
l1=d(r,a); %generate 3 cloud layers using filtered noise function
l2=-d(r,a);
l3=d(r,a);
i1=round(u(1,q,48)); %create 2 sets of indices for slow and fast moving cloud layers
i2=round(u(1,800,48));
[x,y] = meshgrid(0:399);
%smaller first constant creates wider cloud band (line below).
M3 = exp(-.007*(y-290).^2/4^2); % gaussian envelope in matrix to keep clouds in a specified band. 
%pregenerate frames so all frames can be rescaled together
for k=1:48%pairs of matrices define the pixelmap and the alphaa1(:,:,1)=n(l1,-6,8); %first cloud layer doesn't movea1_a(:,:,1)=n(l1,-6,8);a1(:,:,2)=n(b(l2,i2(k),2),-6,8); %second cloud layer traverses the image oncea1_a(:,:,2)=n(b(l2,i2(k),2),-6,8);a1(:,:,3)=n(b(-l3,i1(k),2),-6,8); %third cloud layer traverses the image twicea1_a(:,:,3)=n(b(l3,i1(k),2),-6,8);a2(:,:,k)=(max(a1,[],3)).*M3; %blend 3 cloud layers using a max functiona2_a(:,:,k)=(max(a1_a,[],3)).*M3; %blend 3 cloud layers using a max function
end
a2=n(abs(a2),-80,255);
a2_a=n(a2_a,0,1);
for k=1:48M2(:,:,k)=M.*(1-(a2_a(201:400,:,k)))+(a2_a(201:400,:,k)).*a2(201:400,:,k); %blend alpha cloud layer with sky layer
end
%flip matrix and create sea currents using circshift
M2=n(M2,0,255);
endD=flip(M2(:,:,f))+255;% reflection from waterM4=M2(:,:,f);M4(r2(1:200,:)<0.045)=255;%set sun colourfor k1=30:200D(k1,197:203)=255+255-randi(80);M4=[M4;b(D(k1,:),round(4*randn),2)];endimage(M4)axis equalaxis offcamva(4)
function c=d(r,a)
c=rescale(abs(ifft2(fftshift(fft2(randn(400))).*(r.^-a))),0,1).^1; %function to create clouds
end
end

Adam Danz / The MATropolis is ALIVE!

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13187

function drawframe(f)
persistent h
if f==1 || isempty(h)%% plot the cityh = struct();  % store graphics handles.rng(0) % the scene is customized for seed=0 (twister)set(gcf,'color','k')h.ax = axes(Position=[0 0 1 1],colormap=gray,Color='k',Projection='perspective');hold onaxis equalh.ax.XTickLabel = '';h.ax.YTickLabel = '';h.ax.ZTickLabel = '';xlim([-27.76, 88.76])ylim([-4.5, 65.5])zlim([0,10.7])h.light = light(po=[-.7 .7 -1]);campos([1.3,33,7]) % z=buildingHeights(33)  % plot3(1.3, 33,7,'r*')camtarget([40 33 3])camva(70)buildingHeights = randg(2,60); % building heightsh.bar = bar3(h.ax,buildingHeights);set(h.bar,'EdgeColor','k')% Loop through buildingsh.windows = gobjects([2,size(buildingHeights)]);floorCount = nan(size(buildingHeights));for i = 1:height(buildingHeights)for j = 1:width(buildingHeights)c = 0.1:0.2:buildingHeights(i,j)-.2;floorCount(i,j) = numel(c);d = [c;c];z = d(:)'+[0;0;.1;.1];y = i+[-.2,.2]+[-1;1;1;-1]/12;y = repmat(y,size(c));ison = logical(rand(1,numel(d))>0.3); % some window lights will be offyellow = [1,1,.05];p1 = patch(h.ax,z(:,ison)*0+j-.4,y(:,ison),z(:,ison),yellow);p2 = patch(h.ax,z(:,~ison)*0+j-.4,y(:,~ison),z(:,~ison),yellow);if ~isempty(p1)h.windows(1,i,j) = p1;endif ~isempty(p2)p2.FaceColor = 'none';h.windows(2,i,j) = p2;endendendh.ax.XAxis.Visible = 'off';h.ax.ZTick = 0:5:10;h.ax.TickLength = [0 0];grid(h.ax,'on')h.ax.GridColor = 'm';h.ax.GridAlpha = 1;
end
%% Animate construction
h.ax.GridAlpha = 1-f/48; % Fade grid
h.ax.CameraPosition(3) = f/48*7+2;
h.ax.CameraPosition(1) = max(40-f/40*38.7,1.3);
h.ax.CameraTarget(3) =  2.2 - f/48*3.9;
camva(50*f/48+30)
end

我提交的一个作品:

slandarer / moon bridge

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/13382

function drawframe(n)
global bl1 bl2 bl3 ml X1 X2 M
L=1600;H=1400;S=1000;R=400;F=550;
x1=@(x)x.*80+F+40.*(rand(1)-.5);
x2=@(x)x.*60+F+200+40.*(rand(1)-.5);
l=@linspace;
f=@fill;
if n==1
rng(12)
ax=gca;
ax.XColor='none';
ax.YColor='none';
ax.XLim=[0,L];
ax.YLim=[0,H];
ax.DataAspectRatio=[1 1 1];
hold on;
rgb=@(C)hsv2rgb(C./[360,100,100]);
cF=[225 35 70];   % 远山的颜色
cM=[210 70 10];   % 近山的颜色
cC=[250 26 43];   % 云的颜色
cS=[215 100 18];  % 天空的颜色
cN=[253,252,222]./255;
% 背景为远山的颜色 ==========================================================
ax.Color=rgb(cM);
% 画出天空颜色渐变效果 ======================================================
bp=rgb(cF)+l(0,1,S)'.*(rgb(cS)-rgb(cF));
ip=(1:S)'.*ones(1,L);
C=ind2rgb(ip,bp);
[X,Y]=meshgrid(1:L,401:H);
surf(X,Y,X.*0,'CData',C,'EdgeColor','none');
% 画出山脉效果 =============================================================
[X,Y]=meshgrid(l(0,1,S));
CLX=(-cos(X.*2.*pi)+1).^.2;
CLY=(-cos(Y.*2.*pi)+1).^.2;
r=(X-.5).^2+(Y-.5).^2;
% 8层山
for i=1:8% 每次都生成一次二维随机噪声,并取其中一行的数据h=abs(ifftn(exp(5i*rand(S))./r.^1.05)).*(CLX.*CLY).*24;nh=(8-i)*30+h(500,:);if i==1,nh=nh.*.8;endhm=ceil(max(nh));C=ones(hm,S);% 颜色矩阵构造tcol=cF+(cM-cF)./8.*(i);tcol=rgb(tcol);C=ind2rgb(C,tcol);% 用nan数值框出山的轮廓a=ones(hm,S);a((1:hm)'>nh)=nan;% 绘制山峰image([-50,L+50],[R,R+hm],C,'AlphaData',a.*0.98);
end
% 绘制月亮和云朵 ===========================================================
t1=l(-pi/2,pi/2,100);
t2=l(pi/2,3*pi/2,100);
X1=cos(t1).*80;Y1=sin(t1).*80;
X2=cos(t2).*80;Y2=sin(t2).*80;
ml=f([X1,X2]+1350,[Y1,Y2]+1200,cN,'EdgeColor','none');
a=abs(ifftn(exp(3i*rand(S))./r.^.8)).*(CLX.*CLY);
a=a./max(a,[],'all');
C=ones(size(a));
C=ind2rgb(C,rgb(cC));
% 越向下、云越透明
dy=(1:S)./S.*0.8+0.2;
image([0,L],[800,H],C,'AlphaData',a.*(dy'));
bp=rgb(cF)+l(0,1,R)'.*(rgb(cM)-rgb(cF));
ip=(1:R)'.*ones(1,L);
C=ind2rgb(ip,bp);
[X,Y]=meshgrid(1:L,0:R);
surf(X,Y,X.*0,'CData',C,'EdgeColor','none');
% 绘制石头桥 ===============================================================
X=l(100,S,100);
Y=sin(l(0,pi,100));
f(X,Y.*150+R,[.1,.1,.1],'EdgeColor','none')
plot(X,Y.*150+R,'Color',[cN,.3],'LineWidth',1)
T=l(0,pi,100);
f(cos(T).*80+F,sin(T).*80+R,cN,'EdgeColor','none');
f(cos(T).*60+F+200,sin(T).*60+R,cN,'EdgeColor','none');
f(cos(T).*60+F-200,sin(T).*60+R,cN,'EdgeColor','none');
for i=1:7y=(i-1)/6;x=[-1,1].*sqrt(1-y.^2);cp={'Color',cN,'LineWidth',1};bl1(i)=plot(x1(x),R-[y,y].*90,cp{:});bl2(i)=plot(x2(x),R-[y,y].*60,cp{:});bl3(i)=plot(x2(x)-R,R-[y,y].*60,cp{:});
end
elsek=l(-1,1,48);tX2=X2.*k(n);ml.XData=[X1,tX2]+1350;for i=1:7y=(i-1)/6;x=[-1,1].*sqrt(1-y.^2);set(bl1(i),'XData',x1(x));set(bl2(i),'XData',x2(x));set(bl3(i),'XData',x2(x)-R);end
end
end

由于这一周属实太忙,我交的很多作品都是原本代码的修改版本,在公众号或者知乎都找得到,因此就不都放代码了,大家感兴趣可以去投个票玩hiahiahia:

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/12797

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/12777

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/12757

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/12742

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries/12787


比赛还有20天才结束,感兴趣的快去参加:

https://ww2.mathworks.cn/matlabcentral/communitycontests/contests/6/entries

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/191063.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM字符串常量池StringTable

目录 一、StringTable为什么要调整 二、String的基本特性 三、String的内存分配 四、字符串拼接操作 五、intern()方法 六、Stringtable的垃圾回收 七、G1中String去重操作 一、StringTable为什么要调整 jdk7之前&#xff0c;hotspot对于方法区的实现是永久代&#xff…

尝试使用php给pdf添加水印

在开发中增加pdf水印的功能是很常见的&#xff0c;经过实验发现这中间还是会有很多问题的。第一种模式&#xff0c;采用生成图片的方式把需要添加的内容保存成图片&#xff0c;再将图片加到pdf中间&#xff0c;这种方法略麻烦一些&#xff0c;不过可以解决中文乱码的问题&#…

互联网Java工程师面试题·微服务篇·第三弹

目录 34、什么是端到端微服务测试&#xff1f; 35、Container 在微服务中的用途是什么&#xff1f; 36、什么是微服务架构中的 DRY&#xff1f; 37、什么是消费者驱动的合同&#xff08;CDC&#xff09;&#xff1f; 38、Web&#xff0c;RESTful API 在微服务中的作用是什…

SpringCloud微服务:服务拆分

不同的数据库之间&#xff0c;如何共同调用&#xff1f;接下来讲讲两个数据库之间如何交互 1、微服务需要根据业务模块拆分&#xff0c;做到单一职责,不要重复开发相同业务 2、微服务可以将业务暴露为接口&#xff0c;供其它微服务使用 3、不同微服务都应该有自己独立的数据库…

(头哥)多表查询与子查询

目录 第1关&#xff1a;查询每个学生的选修的课程信息 第2关&#xff1a;查询选修了“数据结构”课程的学生名单 第3关&#xff1a;查询“数据结构”课程的学生成绩单 第4关&#xff1a;查询每门课程的选课人数 第5关&#xff1a;查询没有选课的学生信息 第6关&#xff1a…

【算法】新的开始(Kruskal算法,虚拟源点)

题目 发展采矿业当然首先得有矿井&#xff0c;小 FF 花了上次探险获得的千分之一的财富请人在岛上挖了 n 口矿井&#xff0c;但他似乎忘记了考虑矿井供电问题。 为了保证电力的供应&#xff0c;小 FF 想到了两种办法&#xff1a; 在矿井 i 上建立一个发电站&#xff0c;费用…

VB.NET三层之用户查询窗体

目录 前言: 过程: UI层代码展示: BLL层代码展示: DAL层代码展示: 查询用户效果图:​ 总结: 前言: 想要对用户进行查询&#xff0c;需要用到控件DataGrideView&#xff0c;通过代码的形式将数据库表中的数据显示在DataGrideview控件中&#xff0c;不用对DatGridView控件…

探索向量数据库 | 重新定义数据存储与分析

随着大模型带来的应用需求提升&#xff0c;最近以来多家海外知名向量数据库创业企业传出融资喜讯。 随着AI时代的到来&#xff0c;向量数据库市场空间巨大&#xff0c;目前处于从0-1阶段&#xff0c;预测到2030年&#xff0c;全球向量数据库市场规模有望达到500亿美元&#xff…

20.有效的括号(LeetCode)

思路&#xff1a;用栈的后进先出的特性&#xff0c;来完成题目的要求 因为C有库&#xff0c;可以直接用&#xff0c;而C语言没有&#xff0c;所以我们直接把写好的栈拷贝上来用。 首先&#xff0c;完成框架的搭建 其次&#xff0c;再实现循环内的部分。1.左括号入栈 2.右括…

数据分析实战 | KNN算法——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型改进 十一、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接&#xff1a;https://dow…

HTML简单介绍

且视他人之疑目如盏盏鬼火&#xff0c;大胆地去你的夜路。 目录 1.网页 2.Web标准 3.HTML 3.1HTML结构 3.2HTML标签​编辑 4.标签介绍 4.1排版标签 4.2文本格式化标签 4.3媒体标签 4.3.1图片标签 4.3.2 音频标签 4.3.3视频标签 5.相对路径 6.链接标签 6.1target属…

车载通信与DDS标准解读系列(1):DDS-RPC

▎RPC & DDS-RPC RPC&#xff1a;Remote Procedure Call&#xff0c;远程过程调用。 远程过程调用是一种进程间通信&#xff0c;它允许计算机程序在另一个地址空间中执行子程序&#xff0c;就好像用别人的东西像用自己的一样&#xff0c;常用于分布式系统。 远程过程调用…

Rust编程中的线程间通信

1.消息传递 为了实现消息传递并发&#xff0c;Rust 标准库提供了一个 信道&#xff08;channel&#xff09;实现。信道是一个通用编程概念&#xff0c;表示数据从一个线程发送到另一个线程。 可以将编程中的信道想象为一个水流的渠道&#xff0c;比如河流或小溪。如果你将诸如…

图论14-最短路径-Dijkstra算法+Bellman-Ford算法+Floyed算法

文章目录 0 代码仓库1 Dijkstra算法2 Dijkstra算法的实现2.1 设置距离数组2.2 找到当前路径的最小值 curdis&#xff0c;及对应的该顶点cur2.3 更新权重2.4 其他接口2.4.1 判断某个顶点的连通性2.4.2 求源点s到某个顶点的最短路径 3使用优先队列优化-Dijkstra算法3.1 设计内部类…

海上船舶交通事故VR模拟体验低成本高效率-深圳华锐视点

在海上运输行业&#xff0c;安全事故的防范和应对能力是企业安全教育的重中之重。针对这一问题&#xff0c;海上运输事故VR模拟逃生演练成为了一种创新且高效的教育手段。通过这种演练&#xff0c;企业能够在提升员工安全意识和技能方面获得多方面的帮助。 在VR船舶搜救演练中&…

Python高级语法----Python C扩展与性能优化

文章目录 1. 编写Python C扩展模块示例代码编译和运行运行结果2. 利用Cython优化性能示例代码编译和运行运行结果3. Python性能分析工具示例代码分析结果1. 编写Python C扩展模块 Python C扩展模块允许你将C语言代码集成到Python程序中,以提高性能。这对于计算密集型任务特别…

20.1 platform 设备驱动

一、Linux 驱动的分离与分层 1. 驱动的分隔和分离 现在有三个平台&#xff0c;A、B 和 C&#xff0c;这三个平台都有 MPU6050 设备。编写最简单的驱动框架如下图&#xff1a; 每个平台下都有一个主机驱动和设备驱动&#xff0c;主机驱动是必要的&#xff0c;因为不同的平台 I2…

设计模式JAVA

1 创建型 如何合理的创建对象&#xff1f; 1.1 单例模式 字面意思就是只能创建一个对象实例时使用。 例如&#xff0c;Windows中只能打开一个任务管理器&#xff0c;这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费&#xff0c;或出现各个窗口显示内容的不一致等…

软件开发流程

目录 1 软件开发流程 第1阶段&#xff1a;需求分析 第2阶段&#xff1a;设计 第3阶段&#xff1a;编码 第4阶段&#xff1a;测试 第5阶段&#xff1a;上线运维 2 角色分工 3 软件环境 1). 开发环境(development) 2). 测试环境(testing) 3). 生产环境(production) &a…

ctfshow sql171-179

mysql 先打开我们本地的mysql&#xff0c;可以看到这些数据库 information_schema information_schema 库: 是信息数据库&#xff0c;其中保存着关于MySQL服务器所维护的所有其他数据库的信息比如数据库名&#xff0c;数据库表&#xff0c; SCHEMATA表: 提供了当前MySQL实例…