Updated 2004-12-08 15:16:18 by suchenwi

Richard Suchenwirth 2004-12-08 - The corners of a polygon can come in clockwise or counter-clockwise order. The latter is to be preferred, but Tk's canvas displays both without problems. However, a clockwise-ordered polygon may indicate that a transformation (e.g. mirroring) has to take place. So I modified KBK's ccw code from convex hull, so that given a polygon as an {x y x y x y ...} list returns 1 if the polygon is counterclockwise, else 0. Should the first three points be collinear, the second to fourth are taken instead. If the polygon's points are all collinear, you get an error from one of the exprs :p

That the ccw code returns -1 for counterclockwise, 1 for clockwise, is because Kevin used conventional coordinates (where positive y goes "up"), while I used canvas coordinates, where y goes "down".
 proc counterclockwise polygon {
     foreach { x0 y0 x1 y1 x2 y2} $polygon break
     set dx1 [expr { $x1 - $x0 }]
     set dy1 [expr { $y1 - $y0 }]
     set dx2 [expr { $x2 - $x0 }]
     set dy2 [expr { $y2 - $y0 }]
     set prod1 [expr { $dx1 * $dy2 }]
     set prod2 [expr { $dy1 * $dx2 }]
     if { $prod1 > $prod2 } {return 0}
     if { $prod1 < $prod2 } {return 1}
     if { $dx1*$dx2 < 0 || $dy1*$dy2 < 0 } {return 1}
     if { $dx1*$dx1 + $dy1*$dy1 < $dx2*$dx2 + $dy2*$dy2 } {return 0}
     counterclockwise [lrange $polygon 2 end]
 }

Category Polygon | Arts and crafts of Tcl-Tk programming