breed [ segments segment ] breed [ markers marker ] segments-own [ x1 y1 x2 y2 vx vy] to startup setup loop [ go wait ( 1 / 60 ) ] end to setup ca ;; define 2 line segments cct-segments 2 [ setxy 0 0 set color 30 + red + who * 10 set shape "line" set heading random 360 set size world-width * .5 update-segment-endpoints ] cct-markers 1 [ setxy 0 0 set color white set shape "marker" set size world-width * .1 ] end to go every ( 1 / 30 ) [ ask segments [ rt 3 - (1 + who) * 2 if not can-move? (size * .5) [ rt 179 ] jump ( 1 + who) * .5 update-segment-endpoints ] mark-intersection segment 0 segment 1 ] end to update-segment-endpoints set x1 xcor - dx * size * .5 set x2 xcor + dx * size * .5 set y1 ycor - dy * size * .5 set y2 ycor + dy * size * .5 end to-report intersection-eta-lambda [ a b ] let vax value-from a [ x2 - x1 ] let vay value-from a [ y2 - y1 ] let vbx value-from b [ x2 - x1 ] let vby value-from b [ y2 - y1 ] let px1 x1-of a let px2 x2-of a let py1 y1-of a let py2 y2-of a let px3 x1-of b let px4 x2-of b let py3 y1-of b let py4 y2-of b let divisor-eta ( vbx * vay - vax * vby ) let divisor-lambda ( vbx * vay - vax * vby ) ifelse divisor-eta = 0 or divisor-lambda = 0 [ report [ -1 -1 ] ] ;; parallel! [ let eta (vax * (py3 - py1) - vay * ( px3 - px1) ) / ( vbx * vay - vax * vby ) let lambda (vbx * (py3 - py1) - vby * ( px3 - px1) ) / ( vbx * vay - vax * vby ) report (list eta lambda) ] end to-report check-eta-lambda? [ eta lambda ] report ( 0 <= lambda and lambda <= 1 and 0 <= eta and eta <= 1 ) end to-report intersect-x [ a b lambda ] report x1-of a + lambda * (x2-of a - x1-of a) end to-report intersect-y [ a b lambda ] report y1-of a + lambda * (y2-of a - y1-of a) end to-report intersect-segments? [ a b ] let eta-lambda intersection-eta-lambda a b let eta first eta-lambda let lambda last eta-lambda report check-eta-lambda? eta lambda end to mark-intersection [ a b ] let eta-lambda intersection-eta-lambda a b let eta first eta-lambda let lambda last eta-lambda ifelse check-eta-lambda? eta lambda [ let ix intersect-x a b lambda let iy intersect-y a b lambda ask markers [ setxy ix iy show-turtle ] ask segments [ set color red + 2 ] ] [ ask markers [ hide-turtle ] ask segments [ set color (30 + red + who * 10) ] ] end @#$#@#$#@ GRAPHICS-WINDOW 10 10 440 461 17 17 12.0 1 10 1 1 1 0 0 0 1 -17 17 -17 17 CC-WINDOW 5 475 449 570 Command Center 0 @#$#@#$#@ WHAT IS IT? ----------- A model to demonstrate detecting when two line segments (line shaped turtles) intersect, using math. @#$#@#$#@ default true 0 Polygon -7500403 true true 150 5 40 250 150 205 260 250 line true 0 Line -7500403 true 150 0 150 300 link true 0 Line -7500403 true 150 0 150 300 marker false 6 Circle -13840069 false true 0 0 300 Line -13840069 true 150 0 150 300 Line -13840069 true 0 150 300 150 @#$#@#$#@ NetLogo 3.1beta2 @#$#@#$#@ @#$#@#$#@ @#$#@#$#@ @#$#@#$#@