Courses/CS 461/Winter 2006/Rick Strom/Week One/HW1 - Fire

From CSWiki

Jump to: navigation, search
;; stromsmoke.nlogo
;; by Rick Strom
;;
;; a 2D fire simulation (smoke version)
;; see Information tab for info on this

globals [this-heatvalue]

patches-own [ heatvalue
              next-heatvalue 
              east
              west
              north
              south ]

to setup
  ca
   
  ask patches [
    set heatvalue 0
    set next-heatvalue 0
  ]
 
  randomize-bottom-row  
end

to go
  ;; calculate the nextvalues
  ask patches [
    ;; set next-heatvalue to the average of the neighbors minus cooling
   
    ifelse use-large-pallette
    [
      ifelse heatvalue-of patch-at  1  0 > 99 
      [set east 99]
      [ set east heatvalue-of patch-at  1  0 ]
   
      ifelse heatvalue-of patch-at -1  0 > 99 
      [set west 99]
      [ set west heatvalue-of patch-at  -1  0 ]
   
      ifelse heatvalue-of patch-at  0  1 > 99 
      [set north 99]
      [ set north heatvalue-of patch-at  0  1 ]
   
      ifelse heatvalue-of patch-at  0 -1 > 99 
      [set south 99]
      [ set south heatvalue-of patch-at  0 -1 ]

      ifelse heatvalue-of patch-at  1  0 < 0 
      [set east 0]
      [ set east heatvalue-of patch-at  1  0 ]
    
      ifelse heatvalue-of patch-at -1  0 < 0 
      [set west 0]
      [ set west heatvalue-of patch-at  -1  0 ]
    
      ifelse heatvalue-of patch-at  0  1 < 0 
      [set north 0]
      [ set north heatvalue-of patch-at  0  1 ]
    
      ifelse heatvalue-of patch-at  0 -1 < 0 
      [set south 0]
      [ set south heatvalue-of patch-at  0 -1 ]
    ]
    [
      ifelse heatvalue-of patch-at  1  0 > 9 
      [set east 9]
      [ set east heatvalue-of patch-at  1  0 ]
   
      ifelse heatvalue-of patch-at -1  0 > 9 
      [set west 9]
      [ set west heatvalue-of patch-at  -1  0 ]
   
      ifelse heatvalue-of patch-at  0  1 > 9 
      [set north 9]
      [ set north heatvalue-of patch-at  0  1 ]
   
      ifelse heatvalue-of patch-at  0 -1 > 9 
      [set south 9]
      [ set south heatvalue-of patch-at  0 -1 ] 

      ifelse heatvalue-of patch-at  1  0 < 0 
      [set east 0]
      [ set east heatvalue-of patch-at  1  0 ]
    
      ifelse heatvalue-of patch-at -1  0 < 0 
      [set west 0]
      [ set west heatvalue-of patch-at  -1  0 ]
    
      ifelse heatvalue-of patch-at  0  1 < 0 
      [set north 0]
      [ set north heatvalue-of patch-at  0  1 ]
    
      ifelse heatvalue-of patch-at  0 -1 < 0 
      [set south 0]
      [ set south heatvalue-of patch-at  0 -1 ]
    ]
        
    set next-heatvalue (( (  east + west + north + south ) / 4) - cooling)     
    
    ifelse use-large-pallette
    [
      if next-heatvalue < 0   [set next-heatvalue 0]
      if next-heatvalue > 9   [set next-heatvalue 9]
    ]
    [
      if next-heatvalue < 0   [set next-heatvalue 0]
      if next-heatvalue > 99   [set next-heatvalue 99]
   ]
   
 ]
   ;; reassign the heatvalue for each cell to the 
   ;; next-heatvalue of the cell below it
   ask patches [
     set heatvalue next-heatvalue-of patch-at 0 -1
     set pcolor heatvalue-to-color(heatvalue)
   ]
   
   ;; re-seed the bottom row
   randomize-bottom-row
   
   repeat smoothness [ diffuse pcolor 1 ]
   
end

to randomize-bottom-row
  ;; assign random values between 1 and 100 for bottom row
  ask patches [
    if (pycor = 0 - screen-edge-y ) [ 
      ifelse use-large-pallette
        [ set pcolor random (100) ]
        [ set pcolor random (10) ]
        
      set pcolor heatvalue-to-color(pcolor)
      set heatvalue pcolor  
    ]
  ]
end

to-report heatvalue-to-color [number]

set this-heatvalue number

  ifelse use-large-pallette
  [
    ifelse (number >= 0 and number < 1) [report 0]
    [
      ifelse (number >= 1 and number < 2) [report 4]
      [
        ifelse (number >= 2 and number < 3) [report 7]
        [
          ifelse (number >= 3 and number < 4) [report 13]
          [
            ifelse (number >= 4 and number < 5) [report 15]
            [
              ifelse (number >= 5 and number < 6) [report 19]
              [
                ifelse (number >= 6 and number < 7) [report 25]
                [
                  ifelse (number >= 7 and number < 8) [report 28]
                  [
                    ifelse (number >= 8 and number < 9) [report 45]
                    [
                      ifelse (number >= 9 and number < 10) [report 49]
                      [
                        ifelse (number >= 10 and number < 11) [report 0]  
                        [report 0]
                      ]
                    ]
                  ]
                ]
              ]
            ]
          ]
        ]
      ]
    ]
  ]
  
  [
    report number
  ]
end
Personal tools