Line smoothing - minimum angle

Line smoothing - minimum angle preview image

1 collaborator

Eugene_martin Eugene Martin (Author)

Tags

gis 

"computational geometry"

Tagged by Eugene Martin over 7 years ago

Visible to everyone | Changeable by the author
Model was written in NetLogo 5.3.1 • Viewed 269 times • Downloaded 19 times • Run 0 times
Download the 'Line smoothing - minimum angle' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

globals [Bm Bb Am Ab ang ang1 ang2 p-1_p1_hyp p_p1_hyp p-1_p_hyp A1x A1y A2x A2y B1x B1y B2x B2y Ix Iy thisdist pntlist deg r deglist rlist pos wholist p-1x p-1y px py p1x p1y two_who_list x1 y1 x2 y2 hyp]
turtles-own [jag medianx mediany]

to setup
  ca
  set deglist []
  set rlist []
  repeat Point_count [
    set deg random 360
    set r (max-pxcor * (inner / 100)) + random (max-pxcor * (outer / 100) - max-pxcor * (inner / 100))
    set deglist lput deg deglist
    set rlist lput r rlist
    ]
   set deglist sort deglist
   set pos -1
   repeat Point_count [
     set pos pos + 1
     crt 1 [set label jag set size 3 set shape "dot" set heading item pos deglist jump item pos rlist]
   ]
   calcjag
   drawlinks
end 

to plot_angles
  set-current-plot "Angles"
  histogram [jag] of turtles
  set-current-plot "Radius"
  histogram [distance patch 0 0] of turtles
end 

to noise
  ask turtles [set heading random 360 jump random noise_distance]
  calcjag
  drawlinks
  plot_angles
end 

to dropjag
  ask turtles with [jag < angle_threshold] [die]
  calcjag
  drawlinks
  plot_angles
end 

to gomedian
  ask turtles with [jag < angle_threshold] [carefully [set xcor medianx set ycor mediany][]]
  calcjag
  drawlinks
  plot_angles
end 

to drawlinks
   set wholist []
   ask turtles[set wholist lput who wholist]
   set wholist sort wholist
   set pos 0
   repeat (length wholist - 1) [
     set pos pos + 1
     ask turtle (item pos wholist) [create-link-with turtle (item (pos - 1) wholist)]]
   ask turtle (last wholist) [create-link-with turtle (first wholist)]
end 

to calcjag
   set wholist []
   ask turtles[set wholist lput who wholist]
   set wholist sort wholist
   set wholist lput  first wholist wholist
   set wholist lput item 1 wholist wholist
   set pos 0
   repeat (length wholist - 2) [
     set pos pos + 1
     set p-1x [xcor] of turtle (item (pos - 1) wholist)
     set p-1y [ycor] of turtle (item (pos - 1) wholist)
     set px [xcor] of turtle (item pos wholist)
     set py [ycor] of turtle (item pos wholist)
     set p1x [xcor] of turtle (item (pos + 1) wholist)
     set p1y [ycor] of turtle (item (pos + 1) wholist)
     set p-1_p_hyp hypot p-1x p-1y px py
     set p_p1_hyp hypot px py p1x p1y
     set p-1_p1_hyp hypot p1x p1y p-1x p-1y
     ifelse ((p-1_p_hyp < p_p1_hyp) and (p-1_p1_hyp < p_p1_hyp)) [ ; p_p1_hyp is the longest side of the triangle
        carefully [set ang (asin ((p2l_dist px py p1x p1y p-1x p-1y) / p-1_p_hyp))][set ang 0]
        ]
        [ifelse (p-1_p1_hyp < p-1_p_hyp) and (p_p1_hyp < p-1_p_hyp)[  ; AB is the longest side of the triangle
            carefully [set ang (asin ((p2l_dist p-1x p-1y px py p1x p1y) / p_p1_hyp))][set ang 0]
            ]
            [; AC is the longest side of the triangle
              carefully [set ang1 (asin ((p2l_dist p1x p1y p-1x p-1y px py) / p_p1_hyp))][set ang1 0]
              carefully [set ang2 (asin ((p2l_dist p1x p1y p-1x p-1y px py) / p-1_p_hyp))][set ang1 0]
              set ang 180 - (ang1 + ang2)
            ]
         ]
      ask turtle item pos wholist [set jag int ang set label jag set medianx (first calcmedian p-1x p-1y px py p1x p1y) set mediany (last calcmedian p-1x p-1y px py p1x p1y)]
      plot_angles
   ]
   set wholist but-last but-last wholist
end 

to-report hypot [a b c d]
  report (((a - c) ^ 2) + ((b - d) ^ 2)) ^ 0.5
end 

to-report p2l_dist [a b c d f g]
    set A1x a
    set A1y b
    set A2x c
    set A2y d
    set B1x f
    set B1y g
    set Am (A1y - A2y) / (A1x - A2x)
    set Ab A1y - (Am * A1x)
    set Bm -1 / Am
    set Bb B1y - (Bm * B1x) ;get the y intercept
    ;solve for point intersection at right angle
    set Ix ((Bb - Ab) / (Bm - Am)) * -1
    set Iy Bm * Ix + Bb
    report hypot B1x B1y Ix Iy
end 

to-report calcmedian [ax ay bx by cx cy]
      ;show (se ax ay bx by cx cy)
      ;line A
      carefully [   ;if there's an error (division by 0) then set the median to the current turtle coordinates
        set A1x (ax + cx) / 2
        set A1y (ay + cy) / 2
        set Am (A1y - by) / (A1x - bx)
        set Ab A1y - (Am * A1x)
        ;show (se A1x A1y Am Ab)
        ;line B
        set B1x (ax + bx) / 2
        set B1y (ay + by) / 2
        set Bm (B1y - cy) / (B1x - cx)
        set Bb B1y - (Bm * B1x)
        ;show (se B1x B1y Bm Bb)
        ;lines A and B intersect
        set Ix ((Bb - Ab) / (Bm - Am)) * -1
        set Iy (Bm * Ix) + Bb
        ]
        [set Ix bx
         set Iy by]
      report (list Ix Iy)
end 

There is only one version of this model, created over 7 years ago by Eugene Martin.

Attached files

File Type Description Last updated
Line smoothing - minimum angle.png preview Preview for 'Line smoothing - minimum angle' over 7 years ago, by Eugene Martin Download

This model does not have any ancestors.

This model does not have any descendants.