Lösningar till förberedande övningar

Contents

Övning 1

n = 25;
figure(1); clf; hold on
fill([1, n+1, n+1, 1],[1, 1, n+1, n+1],'green')
axis equal, axis([1,n+1,1,n+1])

for k = 1:n+1
    plot([1 n+1],[k k],'black')
    plot([k k],[1 n+1],'black')
end

% När vi är klara med hela programmet kommer vi lägga till
% axis off efter axis equal, så att skalorna på axlarna inte syns

Övning 2

% En matris A får sköta bokföringen av cellernas status, vi låter
% element A(i,j) beskriva status för cellen på position (i,j) i skogen.
% Vi låter 0 motsvara 'ingeting som kan brinna', 1 motsvarar att 'cellen
% kan börja brinna och 2 motsvarar 'cellen brinner'. Vi behöver två
% matriser, en för nuvarande tidssteg och en för nästa.
% Med ones får vi matriser fyllda med 1:or, sedan kan vi fylla på med
% några 0:or för att markera var det inte kan börja brinna.
A = ones(n,n);
Any = A;

Övning 3

% Med [x,y,b] = ginput(1) läser man in koordinater för en punkt och får
% samtidigt reda på vilken musknapp det trycktes på. Vänster musknapp ger b
% värdet 1, mellersta ger b värdet 2, osv. Trycker vi på vänster musknapp
% ska vi markera att cellen brinner, annars bryter vi. Vi ser också till
% att bara celler som kan börja brinna brinner.

while 1
    [x,y,b] = ginput(1);
    x = floor(x); y = floor(y);
    if b == 1
        if A(x,y)~=0
            A(x,y) = 2;
            fill([x, x+1, x+1, x],[y, y, y+1, y+1],'yellow')
        end
    else
        break;
    end
end

Övning 4

% Vi ska räkna antalet brinnande grannar (antalet grannar som har värdet
% 2). Antag vi ser på cell (i,j). Om cellen kan börja brinna får vi reda på
% genom att se på matriselementet A(i,j). Nu vill vi veta hur många grannar
% till en cell A(i,j) som har värdet 2. Om vår cell ligger i det inre, dvs
% om alla grannar finns representerade i matrisen, så gäller att blocket
% (delmatrisen) A(i-1:i+1,j-1:j+1) innehåller vår cell och dess grannar, vi
% antalet brinnande grannar med
% antal = sum(sum(A(i-1:i+1,j-1:j+1)==2))-1 om A(i,j) == 2
% antal = sum(sum(A(i-1:i+1,j-1:j+1)==2)) om A(i,j) ~= 2
% För att klara av fallen med att vår cell ligger längs en kant, eller i
% ett hörn gör vi två indexvektorer, igrannar och jgrannar. Tex om i-1
% ligger utanför eller till vänster om skogen ska vi bara gå till
% horisontell position 1. Vi tar därför gränsen åt vänster i horisontell
% riktning som max(1,i-1). På motsvarande sätt för de övriga riktningarna.
% Med dessa indexgränser klarar vi alla fall och vi beräknar antalet
% grannar med
%
%igrannar = max(1,i-1):min(n,i+1);
%jgrannar = max(1,j-1):min(n,j+1);
%if A(i,j) == 2
%  antal = sum(sum(A(igrannar, jgrannar)==2))-1;
%else
%   antal = sum(sum(A(igrannar, jgrannar)==2));
%end

% Vi skriver det hela fom en funktion enligt
type antalgrannar.m
function antal = antalgrannar(A,i,j,n)
  igrannar = max(1,i-1):min(n,i+1);
  jgrannar = max(1,j-1):min(n,j+1);
  if A(i,j) == 2
    antal = sum(sum(A(igrannar, jgrannar)==2))-1;
  else
    antal = sum(sum(A(igrannar, jgrannar)==2));
  end