Jump to content

Convex Hull: Difference between revisions

From SELESwiki
Line 39: Line 39:
  Output Frequency: 1
  Output Frequency: 1


===GameOfLife.lse===
===ConvexHull.lse===


  // Sweep-line approach to identifying convex hull using a worker agent
  // Sweep-line approach to identifying convex hull using a worker agent
LSAGENT: ConvexHull
LSAGENT: ConvexHull
 
  DEFINITIONS
  DEFINITIONS
   LAYER: StudyArea, ConvexHull, ConvexHullPoints
   LAYER: StudyArea, ConvexHull, ConvexHullPoints
   GLOBAL VARIABLE: TRLoc
   GLOBAL VARIABLE: TRLoc
   LOCAL VARIABLE: EndingPivotLoc
   LOCAL VARIABLE: EndingPivotLoc
   AGENT VARIABLE: PivotLocation, EdgeLocation, EdgeRow, EdgeCol
   AGENT VARIABLE: PivotLocation, EdgeLocation, EdgeRow, EdgeCol
  ENDDEF
  ENDDEF
  INITIALSTATE
  INITIALSTATE
   INITIALSTATE = 1
   INITIALSTATE = 1
 
// Find the top-right-most point
  // Find the top-right-most point
   TRLoc = 0
   TRLoc = 0
   OVER REGION WHOLE MAP
   OVER REGION WHOLE MAP
Line 62: Line 57:
       TRLoc = MAX(TRLoc, Location)
       TRLoc = MAX(TRLoc, Location)
   ENDFN
   ENDFN
 
ConvexHull = 1 // Initialize convex hull layer to all ones (will erase areas outside hull)
  ConvexHull = 1 // Initialize convex hull layer to all ones (will erase areas outside hull)
  ENDIS
  ENDIS
  NUMAGENTS = 1 // Only need a single worker
  NUMAGENTS = 1 // Only need a single worker
  // Start on the first pivot vertex on convex hull
  // Start on the first pivot vertex on convex hull
  AGENTLOCATION
  AGENTLOCATION
   REGION LOCATION(TRLoc)
   REGION LOCATION(TRLoc)
  ENDAL
  ENDAL
  PROBINIT
  PROBINIT
   PROBINIT = 1
   PROBINIT = 1
 
// Set up first pivot vertex, and first raster boundary location
  // Set up first pivot vertex, and first raster boundary location
   PivotLocation = Location
   PivotLocation = Location
   EdgeRow = NUMROWS-1
   EdgeRow = NUMROWS-1
Line 83: Line 73:
   EndingPivotLoc = -1
   EndingPivotLoc = -1
  ENDPI
  ENDPI
  TRANSITIONS
  TRANSITIONS
   // Continue until we reach the ending pivot location (which is actually second time we hit the second pivot         vertex,
   // Continue until we reach the ending pivot location (which is actually second time we hit the second pivot           vertex,
   // since the first pivot vertex gets only partially processed on first pass)
   // since the first pivot vertex gets only partially processed on first pass)
   TRANSITIONS = (PivotLocation NEQ EndingPivotLoc)
   TRANSITIONS = (PivotLocation NEQ EndingPivotLoc)
 
ConvexHullPoints = 1
  ConvexHullPoints = 1
// Walk line from boundary to vertex and erase until a new pivot vertex is hit (then move there)
 
  // Walk line from boundary to vertex and erase until a new pivot vertex is hit (then move there)
   oldPivot = PivotLocation
   oldPivot = PivotLocation
   hitPivot = FALSE
   hitPivot = FALSE
   OVER REGION VECTOR(EdgeLocation, PivotLocation)
   OVER REGION VECTOR(EdgeLocation, PivotLocation)
     DECISION !hitPivot
     DECISION !hitPivot
 
  IF (StudyArea > 0) // hit new vertex
    IF (StudyArea > 0) // hit new vertex
         hitPivot = TRUE
         hitPivot = TRUE
         IF (EndingPivotLoc EQ -1) AND (Location NEQ PivotLocation)
         IF (EndingPivotLoc EQ -1) AND (Location NEQ PivotLocation)
Line 107: Line 93:
     ENDFN
     ENDFN
   ENDFN
   ENDFN
 
// Move boundary location clockwise around outside edge of raster
  // Move boundary location clockwise around outside edge of raster
   IF (EdgeRow EQ NUMROWS-1) AND (EdgeCol < NUMCOLS-1)
   IF (EdgeRow EQ NUMROWS-1) AND (EdgeCol < NUMCOLS-1)
     EdgeCol = EdgeCol + 1
     EdgeCol = EdgeCol + 1

Revision as of 20:57, 8 November 2006

Summary

Screenshot

Download Model

Download the .scn, .sel and .lse files by clicking on the following link: File:ConvexHull.zip

Model Code Exploration

In the following sections we will examine all of the model files for this model. Note that instead of downloading the zip file above, you could just copy the text in the boxes below into a text editor and save it with the appropriate name (Section title). Opening the resulting .scn file in the SELES simulator would run this model.

MLM.scn

SELES Scenario
$gisData$ = ..\..\CaseStudy_Morice\gisData\cell
StudyArea = $gisData$\BEC
Model Dimensions: StudyArea 
Model.sel
SimPriority Low Priority
//SimStart 100000 1

Model.sel

Seles Model
Time Units: Step kiloStep 1000 100000
Landscape Events:
ConvexHull.lse
Spatial Constants:
StudyArea
Spatial Variables:
ConvexHullPoints[1] <= 0
ConvexHull[1] <= 0
Global Variables:
TRLoc = 0
Output Frequency: 1

ConvexHull.lse

// Sweep-line approach to identifying convex hull using a worker agent
LSAGENT: ConvexHull
DEFINITIONS
 LAYER: StudyArea, ConvexHull, ConvexHullPoints
 GLOBAL VARIABLE: TRLoc
 LOCAL VARIABLE: EndingPivotLoc
 AGENT VARIABLE: PivotLocation, EdgeLocation, EdgeRow, EdgeCol
ENDDEF
INITIALSTATE
  INITIALSTATE = 1
// Find the top-right-most point
  TRLoc = 0
  OVER REGION WHOLE MAP
     DECISION StudyArea > 0
     TRLoc = MAX(TRLoc, Location)
  ENDFN
ConvexHull = 1 // Initialize convex hull layer to all ones (will erase areas outside hull)
ENDIS
NUMAGENTS = 1 // Only need a single worker
// Start on the first pivot vertex on convex hull
AGENTLOCATION
  REGION LOCATION(TRLoc)
ENDAL
PROBINIT
 PROBINIT = 1
// Set up first pivot vertex, and first raster boundary location
 PivotLocation = Location
 EdgeRow = NUMROWS-1
 EdgeCol = COL(Location)
 EdgeLocation = LOCATION(EdgeRow, EdgeCol)
 EndingPivotLoc = -1
ENDPI
TRANSITIONS
 // Continue until we reach the ending pivot location (which is actually second time we hit the second pivot           vertex,
 // since the first pivot vertex gets only partially processed on first pass)
 TRANSITIONS = (PivotLocation NEQ EndingPivotLoc)
ConvexHullPoints = 1
// Walk line from boundary to vertex and erase until a new pivot vertex is hit (then move there)
 oldPivot = PivotLocation
 hitPivot = FALSE
 OVER REGION VECTOR(EdgeLocation, PivotLocation)
    DECISION !hitPivot
 IF (StudyArea > 0) // hit new vertex
       hitPivot = TRUE
       IF (EndingPivotLoc EQ -1) AND (Location NEQ PivotLocation)
          EndingPivotLoc = PivotLocation
       ENDFN
       PivotLocation = Location
    ELSE
       ConvexHull = 0 // erase
    ENDFN
 ENDFN
// Move boundary location clockwise around outside edge of raster
 IF (EdgeRow EQ NUMROWS-1) AND (EdgeCol < NUMCOLS-1)
    EdgeCol = EdgeCol + 1
 ELSE IF (EdgeCol EQ NUMCOLS-1) AND (EdgeRow > 0)
    EdgeRow = EdgeRow - 1
 ELSE IF (EdgeRow EQ 0) AND (EdgeCol > 0)
    EdgeCol = EdgeCol - 1
 ELSE
    EdgeRow = EdgeRow + 1
 ENDFN
 EdgeLocation = LOCATION(EdgeRow, EdgeCol)
ENDTR
POPULATIONTIME = 1
// Move to current/new pivot location
MOVELOCATION
 REGION LOCATION(PivotLocation)
ENDML

Suggested Experiments

To explore this cellular automata model further, try the following:

  1. Vary pInitial and see what affect this has.
  2. Change OVER REGION CENTRED to another value. Try "2". What happes when neighbours can live further away from origin cells?
  3. Change 'numNeighbs EQ 3' to 'numNeighbs EQ 2'; what happens?
  4. Example: changed pInitial to 0.005 and in GameOfLife.lse "CellState = IF (CellState EQ 0) AND (numNeighbs EQ 2) THEN 1"...

File:GameOfLife Gliders.jpg

The left window is zoomed (use right mouse button) so you can see a close-up of several groups of cells that move across this virtual landscape.