How to resolve the algorithm Convex hull step by step in the Tcl programming language
Published on 12 May 2024 09:40 PM
How to resolve the algorithm Convex hull step by step in the Tcl programming language
Table of Contents
Problem Statement
Find the points which form a convex hull from a set of arbitrary two dimensional points. For example, given the points (16,3), (12,17), (0,6), (-4,-6), (16,6), (16,-7), (16,-3), (17,-4), (5,19), (19,-8), (3,16), (12,13), (3,-4), (17,5), (-3,15), (-3,-9), (0,11), (-9,-3), (-4,-2) and (12,10) the convex hull would be (-9,-3), (-3,-9), (19,-8), (17,5), (12,17), (5,19) and (-3,15).
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Convex hull step by step in the Tcl programming language
Source code in the tcl programming language
catch {namespace delete test_convex_hull} ;# Start with a clean namespace
namespace eval test_convex_hull {
package require Tcl 8.5 ;# maybe earlier?
interp alias {} @ {} lindex;# An essential readability helper for list indexing
proc cross {o a b} {
### 2D cross product of OA and OB vectors ###
return [expr {([@ $a 0] - [@ $o 0]) * ([@ $b 1] - [@ $o 1]) - ([@ $a 1] - [@ $o 1]) * ([@ $b 0] - [@ $o 0]) }]
}
proc calc_hull_edge {points} {
### Build up hull edge ###
set edge [list]
foreach p $points {
while {[llength $edge ] >= 2 && [cross [@ $edge end-1] [@ $edge end] $p] <= 0} {
set edge [lreplace $edge end end] ;# pop
}
lappend edge $p
}
return $edge
}
proc convex_hull {points} {
### Convex hull of a set of 2D points ###
# Unique points
set points [lsort -unique $points]
# Sorted points
set points [lsort -real -index 0 [lsort -real -index 1 $points]]
# No calculation necessary
if {[llength $points] <= 1} {
return $points
}
set lower [calc_hull_edge $points]
set upper [calc_hull_edge [lreverse $points]]
return [concat [lrange $lower 0 end-1] [lrange $upper 0 end-1]]
}
# Testing
set tpoints {{16 3} {12 17} {0 6} {-4 -6} {16 6} {16 -7} {16 -3} {17 -4} {5 19} {19 -8}
{3 16} {12 13} {3 -4} {17 5} {-3 15} {-3 -9} {0 11} {-9 -3} {-4 -2} {12 10}}
puts "Test points:"
puts [lrange $tpoints 0 end] ;# prettier
puts "Convex Hull:"
puts [convex_hull $tpoints]
}
You may also check:How to resolve the algorithm DNS query step by step in the PicoLisp programming language
You may also check:How to resolve the algorithm CSV data manipulation step by step in the Yabasic programming language
You may also check:How to resolve the algorithm MD5 step by step in the J programming language
You may also check:How to resolve the algorithm Metaprogramming step by step in the J programming language
You may also check:How to resolve the algorithm EKG sequence convergence step by step in the Go programming language