*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 :pThat 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