Victoria amazonica is de grootste waterlelie ter wereld. Deze soort heeft een temperatuur van 27-30 °C nodig, wat zelfs in de tropen niet overal voorkomt. Ze komt van nature voor in stilstaand of langzaam stromend water in Brazilië, Colombia, Guyana en Peru. In België kan de plant bewonderd worden in de plantentuin van de Universiteit Gent (Gent) en de Nationale Plantentuin van België (Meise).

De bladeren van V. amazonica zijn kastanjebruin als ze het wateroppervlak bereiken, maar worden later groen. Jonge bladeren hebben korte, naar binnen omgekrulde randen. Oudere bladeren kunnen een diameter tot 3 meter bereiken. Ze hebben een 4–10 cm hoge rand en drijven aan 7 tot 8 meter lange stengels. De grootste bladeren hebben een draagvermogen van 40 kg. De bladeren zijn aan de onderkant bezet met stekels en opvallende ribben die een onregelmatig patroon van cellen vormen.

Victoria amazonica
V. amazonica in bloei.
Victoria amazonica
De ribben aan de onderkant van een blad van de V. amazonica vormen een onregelmatig patroon van cellen.

Om een plantensoort te onderzoeken willen we het aantal cellen aan de onderkant van zijn bladeren tellen en de gemiddelde grootte van een bladcel bepalen. Hiervoor zetten we telkens een afbeelding van een blad om in een bitmap waarin de bladcellen duidelijk afgelijnd zijn. Zo een bitmap is niets anders dan een rechthoekig rooster en de vakjes van dit rooster worden bits genoemd. Elke bit van het rooster is leeg (voorgesteld door een spatie) of wordt bedekt door een stuk rib van het blad (voorgesteld door een hekje: #). Als voorbeeld zie je hieronder een afbeelding van een eenvoudig blad met twee cellen (links) en de bitmap die we van deze afbeelding gemaakt hebben (rechts). In een bitmap wordt een bladcel gevormd door een gebied van aangrenzende lege bits. Bits worden hierbij aangrenzend genoemd als ze een gemeenschappelijke zijde hebben. Een gebied van aangrenzende lege bits wordt nooit als een bladcel beschouwt als het bits op de buitenste rand van de bitmap bevat.

blad
Afbeelding van een blad met twee cellen.
bitmap van blad
Bitmap gemaakt van de afbeelding van een blad met twee cellen. Deze bitmap is een rechthoekig rooster met 20 rijen en 60 kolommen, waarbij de posities die samenvallen met de ribben van het blad worden aangeduid door hekjes (#).

Opgave

Definieer een klasse Blad waarmee bladeren van planten kunnen geanalyseerd worden. De objecten van deze klasse moeten minstens de volgende methoden hebben:

Voorbeeld

Bij onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden blad.txt1 en victoria.txt2 zich in de huidige directory bevinden. Het eerste bestand bevat de bitmap die gemaakt werd van de afbeelding van het eenvoudige blad dat hierboven als voorbeeld gebruikt werd. Het tweede bestand bevat een bitmap die gemaakt werd op basis van de afbeelding met de onderkant van een blad van de V. amazonica die we in de inleiding van deze opgave gebruikt hebben.

>>> blad = Blad('blad.txt')
>>> print(blad)
<BLANKLINE>
                                      ######                
                           #############   ##########       
                     #######                         #####  
                  #####                       ############# 
               ####                       ####          ##  
             ###                     #####              ##  
           ###                  #####                  ###  
         ###                ####                       ##   
        ##               ###                          ###   
       ##             ###                            ###    
      ##          ####                             ###      
     ##        ###                                ###       
     #     ####                                 ###         
    ##  ####                                 ####           
    #####                                 #####             
    ###                                #####                
    #####                        #######                    
    #   ##########################                          
<BLANKLINE>
>>> blad.opvullen(5, 30)
182
>>> print(blad)
<BLANKLINE>
                                      ######                
                           #############...##########       
                     #######.........................#####  
                  #####.......................############# 
               ####.......................####          ##  
             ###.....................#####              ##  
           ###..................#####                  ###  
         ###................####                       ##   
        ##...............###                          ###   
       ##.............###                            ###    
      ##..........####                             ###      
     ##........###                                ###       
     #.....####                                 ###         
    ##..####                                 ####           
    #####                                 #####             
    ###                                #####                
    #####                        #######                    
    #   ##########################                          
<BLANKLINE>
>>> blad.opvullen(8, 30)
Traceback (most recent call last):
AssertionError: bit moet leeg zijn
>>> blad.opvullen(15, 30)
335
>>> print(blad)
<BLANKLINE>
                                      ######                
                           #############...##########       
                     #######.........................#####  
                  #####.......................############# 
               ####.......................####..........##  
             ###.....................#####..............##  
           ###..................#####..................###  
         ###................####.......................##   
        ##...............###..........................###   
       ##.............###............................###    
      ##..........####.............................###      
     ##........###................................###       
     #.....####.................................###         
    ##..####.................................####           
    #####.................................#####             
    ###................................#####                
    #####........................#######                    
    #   ##########################                          
<BLANKLINE>
>>> blad.wissen()
>>> print(blad)
<BLANKLINE>
                                      ######                
                           #############   ##########       
                     #######                         #####  
                  #####                       ############# 
               ####                       ####          ##  
             ###                     #####              ##  
           ###                  #####                  ###  
         ###                ####                       ##   
        ##               ###                          ###   
       ##             ###                            ###    
      ##          ####                             ###      
     ##        ###                                ###       
     #     ####                                 ###         
    ##  ####                                 ####           
    #####                                 #####             
    ###                                #####                
    #####                        #######                    
    #   ##########################                          
<BLANKLINE>
>>> blad.cellen()
2
>>> blad.celgrootte()
258.5

>>> victoria = Blad('victoria.txt')
>>> victoria.cellen()
242
>>> victoria.cellen(minimum=10)
219
>>> victoria.cellen(minimum=20)
213
>>> victoria.celgrootte()
107.86363636363636
>>> victoria.celgrootte(minimum=10)
118.74885844748859
>>> victoria.celgrootte(minimum=20)
121.64319248826291