Dosiero:StarfieldSimulation.gif

Paĝenhavo ne ekzistas en aliaj lingvoj.
El Vikipedio, la libera enciklopedio

StarfieldSimulation.gif((500 × 400 rastrumeroj, grandeco de dosiero: 781 KB, MIME-tipo: image/gif), ripeta GIF, 240 ĉeloj, 7,2 s)

Jen dosiero de la Wikimedia-Komunejo. La priskribo en ties priskriba paĝo estas montrata suben.
La Komunejo estas dosieruja retejo de libere licencitaj dosieroj.

Resumo

Priskribo
English: Inspired by the "Starfield Simulation" Screensaver for Windows. (With more stars in the distance.)
Deutsch: Ähnlich zum "Starfield Simulation" Bildschirmschoner von Windows. (Mit mehr Sternen in weiter Entfernung.)
Dato
Fonto Propra verko
Aŭtoro Jahobr
Ceteraj versioj
GIF genesis
InfoField
 
Ĉi tiu GIF dosiero estas kreita per MATLAB de Jahobr.
Fontkodo
InfoField

MATLAB code

function StarfieldSimulation
% Source code that produces a GIF.
% Inspired by the "Starfield Simulation" Screensaver for Windows.
%
% 2017-04-20 Jahobr (update 2019-02-07 Jahobr)

[pathstr,fname] = fileparts(which(mfilename)); % save files under the same name and at file location
 
uniqueDepth = 200;
nFrames = 240;
renderDist = 200; % should be smaller or equal then uniqueDepth
StarDensity = 0.0005;
imageMax = [400, 500]; % pixel (height width)
subsampPix = 10; % subsampling per pixel in x and y
starRenderLimInPixel = 0.4; % diameter at least a x% of a pixel % if too small it flickers

for currentCase = 1:2
    rng(1); % int rand generator to make GIF repeatable; If you dont like the GIF try a differnt value
    speed = uniqueDepth/nFrames;
    nStars = StarDensity*(2*renderDist * 2*renderDist * uniqueDepth);
    
    x0 = rand(1,nStars)*renderDist*2-renderDist;
    y0 = rand(1,nStars)*renderDist*2-renderDist;
    sizze = 60+rand(1,nStars)*60;
    sizze = [sizze sizze]; % copy space behind each other to loop the gif
    
    depth = rand(1,nStars)*uniqueDepth;
    depth = sort(depth); % makes later rendering more efficient
    depth = [depth depth+uniqueDepth]; % copy space behind each other to loop the gif
    
    switch currentCase
        case 1 % classic
            saveName = fname;
            x_y =     [x0 x0;y0 y0]; % copy space behind each other to loop the gif
            thetaList = zeros(1,nFrames); % rotation
        case 2 % rot 90° per gif loop
            saveName = [fname '_rot'];
            x_y =     [x0 y0;y0 -x0]; % copy space behind each other to loop the gif
            thetaList = linspace(0,pi/2,nFrames+1); % rotation
            thetaList = thetaList(1:nFrames);
    end

    rawImage.cdata = uint8(zeros([imageMax 3]));
    rawImage.colormap = [];
    tic
    for iFrame = 1:nFrames
        
        
        disp([num2str(iFrame) ' of ' num2str(nFrames)])
        image = zeros(imageMax);
        
        %% calculate perspective
        
        
        theta = thetaList(iFrame);
        R = [cos(theta) -sin(theta);
            sin(theta) cos(theta)];
        x_y_rot = R * x_y; % rotate
        
        plotImCoordX = (x_y_rot(1,:)./depth*imageMax(2))+imageMax(2)/2; % plane of view at depth 1;  focal point at [0 0 0]
        plotImCoordY = (x_y_rot(2,:)./depth*imageMax(1))+imageMax(1)/2; % plane of view at depth 1;  focal point at [0 0 0]
        
        distEuclid = sqrt( x_y_rot(1,:).^2 + x_y_rot(2,:).^2 + depth.^2 );%  euclidean distance focal point at [0 0 0]
        
        %% Rendering
        % It could be done with figure and plot functions but they are not
        % designed to display objects on the pixel and sub-pixel scale.
        % The result just looks bad.
        
        % So a own small rendering engine is used:
        % check if a particular star rendering is necessary
        % lay a grid over the star
        % find if grid-points are within the star circle
        % if yes, match the grid-point to a pixel and add its portion of
        % "brightness" to the image
        
        startIndex = find(depth>0,1,'first'); % depth was sorted
        stopIndex = find(depth<renderDist,1,'last'); % depth was sorted
        
        for k = startIndex:stopIndex % for all stars that would be in range
            
            radiusStar = sizze(k)/distEuclid(k)/2;
            
            if plotImCoordX(k)+radiusStar < 0  % outside to the left
                continue % next star
            end
            if plotImCoordX(k)-radiusStar > imageMax(2)+1  % outside to the right
                continue % next star
            end
            
            if plotImCoordY(k)+radiusStar < 0  % outside to the bottom
                continue % next star
            end
            if plotImCoordY(k)-radiusStar > imageMax(1)+1  % outside to the top
                continue % next star
            end
            
            if radiusStar*2>starRenderLimInPixel % diameter at least a defined part of a pixel
                window = ceil(radiusStar *subsampPix); % size of grid to map over stars
                
                inCircle = false(2*window,2*window);
                
                for ix = 1:window % grid-points in positive x
                    for iy = 1:window % grid-points in positive y
                        
                        distEuclidPixel = sqrt( ((ix-0.5)/subsampPix).^2 + ((iy-0.5)/subsampPix).^2);%  euclidian distance focal point at [0 0 0]
                        
                        % do a quarter of the circle and flip to -x,y  and -x,-y  and  x,-y (1/8 would be enough actually)
                        if  radiusStar>distEuclidPixel % is grid in reach of star
                            inCircle(window+ix  ,window+iy  ) = true; % 1 quadrant
                            inCircle(window+ix  ,window+1-iy) = true; % 2 quadrant
                            inCircle(window+1-ix,window+iy  ) = true; % 3 quadrant
                            inCircle(window+1-ix,window+1-iy) = true; % 4 quadrant
                            
                        end
                    end
                end
                xGrid = round((( (1:2*window)-0.5-window) /subsampPix)+plotImCoordX(k)); % create x-grid and round to nearest Image pixel
                yGrid = round((( (1:2*window)-0.5-window) /subsampPix)+plotImCoordY(k)); % create y-grid and round to nearest Image pixel
                
                for ix = 1:2*window % pixel grid in x
                    if and(xGrid(ix) >= 1, xGrid(ix) <= imageMax(2)) % if in image
                        for iy = 1:2*window % pixel grid in y
                            if and(yGrid(iy) >= 1, yGrid(iy) <= imageMax(1)) % if in image
                                if inCircle(ix,iy) % if in Circle
                                    image(yGrid(iy),xGrid(ix)) = image(yGrid(iy),xGrid(ix))+1/subsampPix^2; % add brightness to pixel
                                end
                            end
                        end
                    end
                end
            end
        end
        
        image(image>1) = 1; % fix "over exposure"
        
        depth = depth-speed; % move
        
        %% save animation
        f = rawImage;
        f.cdata(:,:,1) = uint8(image*255);
        f.cdata(:,:,2) = uint8(image*255);
        f.cdata(:,:,3) = uint8(image*255);
        
        map = gray(8); % self created map. Otherwise use; [im,map] = rgb2ind(f.cdata,4,'nodither')
        
        imtemp = rgb2ind(f.cdata,map,'nodither');
        im(:,:,1,iFrame) = imtemp;
        if iFrame == 1
            im(1,1,1,nFrames) = 0; % allocate
        end
        
    end
    
    toc
    imwrite(im,map,fullfile(pathstr, [saveName '.gif']),'DelayTime',1/30,'LoopCount',inf) %
    disp([saveName '.gif  has ' num2str(numel(im)/10^6 ,4) ' Megapixels']) % Category:Animated GIF files exceeding the 50 MP limit
end
rng('shuffle'); % reset rand

Permesiloj:

Mi, la posedanto de la aŭtorrajto por ĉi tiu verko, ĉi-maniere publikigas tiun laŭ la jena permesilo:
Creative Commons CC-Zero Ĉi tiu dosiero estas disponebla laŭ la Krea Komunaĵo CC0 1.0 Universala Publikaĵiga Dediĉo.
La persono kiu asociis verkon kun ĉi tiu faro dediĉis la verkon kiel publikaĵon forlasante ĉiujn siajn rajtojn al la verko mondvaste sub aŭtorrajta leĝo inkluzivante ĉiujn rilatajn aŭ najbarajn rajtojn permesitajn de leĝo. Oni povas kopii, modifi, distribui kaj ludi la verkon, eĉ por komercaj kialoj, ĉiuj sen peto de permeso.

Titoloj

Donu unulinian priskribon de la enhavo de ĉi tiu dosiero

Eroj prezentitaj en ĉi tiu dosiero

montras

image/gif

Dosierhistorio

Alklaku iun daton kaj horon por vidi kiel la dosiero tiam aspektis.

Dato/HoroBildetoGrandecojUzantoKomento
nun11:08, 20 apr. 2017Bildeto por versio ekde 11:08, 20 apr. 2017500 × 400 (781 KB)Jahobr{{Information |Description ={{en|1=Inpired by the "Starfield Simulation" Screensaver for Windows. (With more stars in the distance.)}} {{de|1=Ählich zum "Starfield Simulation" Bildschirmschoner von Windows. (Mit mehr Sternen in weiter Entfernung)}}...

Neniu paĝo ligas al ĉi tiu dosiero.

Suma uzado de la dosiero

La jenaj aliaj vikioj utiligas ĉi tiun dosieron: