NetLogo version NetLogo 3.0.2
Running with NetLogoLite.jar version 302.
NetLogo Version: NetLogo 3.0.2
;;;; Summary ;; An enhanced 3d wave machine ;; COPYRIGHT & LICENSE ;;;; Copyright (C) 2005 James P. Steiner ;;;; Based on prior work (C) Uri Wilensky. See code for details. ;;;; Some Rights Reserved, Creative Commons Attribution-NonCommercial-ShareAlike License v. 2.0. ;;;; Visit http://creativecommons.org/licenses/by-nc-sa/2.0/ for more information. ;;; globals [ rows cols max-peak max-pit curr-peak curr-pit dist-fact time drive-zpos setup-2d? old-freq old-3d old-x-d-point old-y-d-point old-width old-boundary old-pers pers-exp spacing ; all-nodes drive-nodes free-nodes edge-nodes grid-edge xtheta-control ytheta-control oldmx oldmy ] breeds [ nodes rays ] nodes-own [ x1 y1 z1 ;; computed xcor ycor zpos xpos ypos zvel ;; zcor component of velocity xvel yvel xorig yorig zorig p phi theta node-type link-set link-set-2 link-count link-count-2 i zpos-sum zpos-count neighbor xpos-sum xpos-count ypos-sum ypos-count row col vxcor vycor vzcor ] rays-own [ source target col row link-set vxcor vycor ] to setup locals [ ] no-display ca clear-output set setup-2d? not three-d? set rows grid-size set cols grid-size set grid-edge (grid-size - 1) / 2 set dist-fact 1 / ( sqrt 2 ) cct-nodes grid-size * grid-size ;; create enough nodes to fill a square grid [ hide-turtle set color base-color set node-type 1 ; free-node ;; line up the turtles so that turtle who + 1 is on your right, ;; turtle who - 1 is on your left, turtle who + columns, ;; is beneath you, and turtle who - columns is above you. set row int ( who / grid-size ) set col (who mod grid-size) set xorig (0.0 - .5 * cols + col ) set yorig (0.0 - .5 * rows + row ) set zorig 0 set zvel 0 set zpos 0 set xpos xorig set ypos yorig set time 0 set shape "small-pix" ] define-node-links define-nodes define-rays ; for wire-frame view set constrained? true go display end to define-nodes define-node-types define-node-sets end to define-node-types define-free-nodes define-drive-nodes define-edge-nodes end to define-node-links ask nodes ;; each turtle has an agent set that points to it's neighbor turtles [ without-interruption [ set link-set nodes with [ ( ( row = row-of myself ) and ( abs ( col - col-of myself ) = 1 ) ) or ( ( col = col-of myself ) and ( abs ( row - row-of myself ) = 1 ) ) ] set link-count count link-set ] ] end to get-peak locals [new-peak new-pit] set new-peak max values-from turtles [zpos] if new-peak > max-peak [ set max-peak new-peak ] set new-pit min values-from turtles [zpos] set-current-plot-pen "peak" plot new-peak set-current-plot-pen "pit" plot new-pit end to define-node-sets set free-nodes turtles with [ node-type = 1 ] set drive-nodes turtles with [ node-type = 2 ] set edge-nodes turtles with [ node-type = 3 ] end to define-free-nodes ask turtles [ set node-type 1 ; free-node ] end to define-edge-nodes ;; observer procedure ;; color edges of wave "membrane" blue ask turtles with [ row = 0 or row = grid-size - 1 or col = 0 or col = grid-size - 1 ] [ set node-type 3 ; edge set color edge-color ] end to define-drive-nodes ;;observer procedure ;; tell turtles that they are part of the the drive point ifelse circular-dp? [ ask turtles with [ sqrt( (row - rows * .5 - x-d-point + .5) ^ 2 + (col - cols * .5 - y-d-point + .5) ^ 2 ) + 1 <= width ] [ set node-type 2 ; drive-plate set color green ] ] [ ask turtles with [ row >= ( rows * .5 + x-d-point - width - 1 ) and row <= ( rows * .5 + x-d-point + width ) and col >= ( cols * .5 + y-d-point - width - 1 ) and col <= ( cols * .5 + y-d-point + width ) ] [ set node-type 2 ; drive-plate set color green ] ] end to define-rays ; for wire-frame view ask nodes [ if any? link-set with [ (col - 1) = col-of myself ] [ hatch 1 [ set breed rays set shape "ray" set source myself set target one-of (link-set) with [ (col - 1) = col-of myself ] ] ] if any? link-set with [ (row - 1) = row-of myself ] [ hatch 1 [ set breed rays set shape "ray" set source myself set target one-of (link-set) with [ (row - 1) = row-of myself ] ] ] ] end to go if move? [ set time time + speed set drive-zpos (amplitude * grid-size * (sin (time))) ] drive-force project if not any? free-nodes [stop] end to-report dist-3d [ b a ] locals [ ax ay az bx by bz dist ] set ax xpos-of a set ay ypos-of a set az zpos-of a set bx xpos-of b set by ypos-of b set bz zpos-of b set dist sqrt ((ax - bx) ^ 2 + (ay - by) ^ 2 + (az - bz) ^ 2 ) ifelse dist = 0 [ report 0.000001 ] [ report dist ] end to drive-force ;; turtle procedure ;; propagates the wave to neighboring turtles ifelse connected? [ ask drive-nodes [ set zpos drive-zpos set ypos yorig set xpos xorig ] ] [ ask drive-nodes [ accelerate ] ] ifelse constrained? [ ask edge-nodes [ set zvel 0 set xvel 0 set yvel 0 if xpos != xorig [set xpos xpos + ( xorig - xpos ) * .1] if ypos != yorig [set ypos ypos + ( yorig - ypos ) * .1] if zpos != zorig [set zpos zpos + ( zorig - zpos ) * .1] ] ] [ ask edge-nodes [ accelerate ] ] ask free-nodes [ accelerate ] end to color-nodes locals [ allz maxz minz ] set allz values-from nodes [ zpos ] set minz abs min allz set maxz abs max allz ifelse minz > maxz [ set maxz minz ] [ set minz maxz ] set minz 0 - minz if minz = maxz [ set minz minz - 1 set maxz maxz + 1 ] set minz minz * 1.1 set maxz maxz * 1.1 ask free-nodes [ set color scale-color base-color zpos minz maxz ] ask edge-nodes [ set color edge-color ] ; scale-color edge-color zpos minz maxz show-turtle ] ask drive-nodes [ set color drive-color ] ; scale-color green zpos minz maxz show-turtle ] end to accelerate set link-count count link-set ;; add up inter-node forces set xpos-sum ( sum ( map [ ( ( ?1 - xpos) + ( 0 - ?2 + xorig ) ) ] ( values-from link-set [ xpos ]) ( values-from link-set [ xorig ]) ; ( values-from link-set [ (dist-3d myself self) ] ) ) ) / link-count set ypos-sum ( sum ( map [ ( ( ?1 - ypos) + ( 0 - ?2 + yorig ) ) ] ( values-from link-set [ ypos ] ) ( values-from link-set [ yorig ] ) ; ( values-from link-set [ ( dist-3d myself self ) ] ) ) ) / link-count set zpos-sum ( sum ( map [ ( ( ?1 - zpos ) + ( 0 - ?2 + zorig ) ) ] ( values-from link-set [ zpos ] ) ( values-from link-set [ zorig ] ) ; ( values-from link-set [ ( dist-3d myself self ) ] ) ) ) / link-count ;; apply acceleration due to inter-atom forces set zvel zvel + (k * zpos-sum ) set xvel xvel + (k * xpos-sum ) set yvel yvel + (k * ypos-sum ) ;; apply (de)acceleration due to viscosity set zvel zvel * (1 - friction) set xvel xvel * (1 - friction) set yvel yvel * (1 - friction) ;; apply deelleration due to extreme occeclation ;if zvel > grid-size ;[ set xvel xvel * ( 1 - ( (log xvel 10) * .1 )) ; set yvel yvel * ( 1 - ( (log yvel 10) * .1 )) ; set zvel zvel * ( 1 - ( (log zvel 10) * .1 )) ;] ;; apply acceleration due to gravity set zvel zvel - gravity set zpos (zpos + zvel) set xpos (xpos + xvel) set ypos (ypos + yvel) end to project ifelse three-d? [ set setup-2d? false project-3d ] [ if any? rays with [ not hidden? ] [ ask rays [ hide-turtle ] ] project-2d ] color-nodes end to project-3d set theta-x (theta-x + delta-tx) mod 360 set theta-z (theta-z + delta-tz) mod 360 ;if perspective != old-pers ;[ set old-pers perspective ; set pers-exp 10 ^ perspective ;] monitor-mouse ask nodes [ set x1 xpos set y1 ypos set z1 zpos rotate-on-z-axis rotate-on-x-axis set vzcor y1 - (nearness * .01 * screen-edge-y) set vxcor ((0 - x1) * ( 1 - ( (vzcor) / (vzcor + perspective )))) / eye set vycor ((0 - z1) * ( 1 - ( (vzcor) / (vzcor + perspective )))) / eye + (altitude * .01 * screen-edge-y) ] ask nodes [ ifelse abs vycor > screen-edge-y or abs vxcor > screen-edge-x or vzcor < 0 - perspective [ hide-turtle ] [ set xcor vxcor set ycor vycor show-turtle ] ] ask rays [ ifelse (hidden?-of source) [ ifelse (hidden?-of target) [ hide-turtle ] [ setxy (vxcor-of target) (vycor-of target) set heading towardsxy-nowrap (vxcor-of source) (vycor-of source) set size distancexy-nowrap (vxcor-of source) (vycor-of source) set color color-of target if hidden? [ show-turtle ] ] ] [ setxy (vxcor-of source) (vycor-of source) set heading towardsxy-nowrap (vxcor-of target) (vycor-of target) set size distancexy-nowrap (vxcor-of target) (vycor-of target) set color color-of target if hidden? [ show-turtle ] ] ;; don't draw turtles that "wrap" around the edge of the ;; screen; we need no-display, above, because otherwise ;; the turtle would briefly be drawn before the hide-turtle ;; command had a chance to take effect ] end to project-2d ;; this is only needed for if the user turns three-d? off ;; while the model is running color-nodes ask nodes [ setxy xpos ypos show-turtle ] end to rotate-on-z-axis ; rotate nodes on z axis set p sqrt((x1 * x1) + (y1 * y1) + (z1 * z1)) set phi (atan sqrt((x1 * x1) + (y1 * y1)) z1) set theta (atan y1 x1) set theta theta + (theta-z mod 360) ; incrementing the angle to simulate rotation set y1 (p * (sin phi) * (sin theta)) set x1 (p * (sin phi) * (cos theta)) ; z is not changed by change in theta ; set z1 (p * (cos phi)) end to rotate-on-x-axis set p sqrt ( ( x1 ^ 2 ) + ( y1 ^ 2 ) + ( z1 ^ 2 ) ) set phi ( atan sqrt ( ( y1 ^ 2 ) + ( z1 ^ 2 ) ) x1 ) set theta ( atan z1 y1 ) set theta theta + ( theta-x mod 360 ) ; incrementing the angle to simulate rotation set y1 ( p * ( sin phi ) * ( sin theta ) ) set z1 ( p * ( sin phi ) * ( cos theta ) ) set x1 ( p * ( cos phi ) ) end to disintegrate ; end to event-manager every .1 [ if x-d-point != old-x-d-point or y-d-point != old-y-d-point or width != old-width [ print "Change Drive Point" set old-x-d-point x-d-point set old-y-d-point y-d-point set old-width width define-nodes ] ] end to monitor-mouse locals [ mx my ] ifelse mouse-down? [ set mx mouse-xcor set my mouse-ycor if oldmx = -9999 [ set oldmx mx set oldmy my ] if oldmx != mx or oldmy != my [ set theta-x (theta-x - (oldmy - my ) ) mod 360 set theta-z (theta-z - (oldmx - mx ) ) mod 360 set oldmx mx set oldmy my ] ] [ set oldmx -9999 ] if shape-of one-of rays != edge-shape [ ask rays [ set shape edge-shape ] ] end ; ***NetLogo Model Copyright Notice*** ; This model was created as part of the project: CONNECTED MATHEMATICS: ; MAKING SENSE OF COMPLEX PHENOMENA THROUGH BUILDING OBJECT-BASED PARALLEL ; MODELS (OBPML) ; The project gratefully acknowledges the support of the National Science ; Foundation (Applications of Advanced Technologies Program) -- grant numbers ; RED #9552950 and REC #9632612. ; Copyright 1996 by Uri Wilensky. All rights reserved. ; converted to NetLogo from StarLogoT, 2001. ; Permission to use, modify or redistribute this model is hereby granted, ; provided that both of the following requirements are followed: ; a) this copyright notice is included. ; b) this model will not be redistributed for profit without permission ; from Uri Wilensky. ; Contact Uri Wilensky for appropriate licenses for redistribution for ; profit. ; To refer to this model in academic publications, please use: ; Wilensky, U. (1996). NetLogo Wave Machine model. ; http://ccl.northwestern.edu/netlogo/models/WaveMachine. ; Center for Connected Learning and Computer-Based Modeling, ; Northwestern University, Evanston, IL. ; ***End NetLogo Model Copyright Notice***
View or download the complete model file (to download: right-click, save-link-as):
-- Download wave-machine_6.1 --