Posted to tcl by schmitzu at Mon Apr 17 14:02:39 GMT 2023view pretty

# get direction of line segment given 
# by start-/endpoint as unit vector [xu:yu]
proc pp2uv {x1 y1 x2 y2} {
   set dx [expr {$x2 - $x1}]
   set dy [expr {$y2 - $y1}]
   set ab [expr {sqrt ($dx * $dx + $dy * $dy)}]

   set xu [expr {$dx / $ab}]
   set yu [expr {$dy / $ab}]

   return [list $xu $yu]
}

# get perpedicular line on linesegment ls at 
# position t with lenth l
# ls       line segment {x1 y1 x2 y2}
# t        positon on ls [0..1]
# l        length of result segment
# returns:
#   {px1 py1 px2 py2} start-/endpoint perpendicular linesegment
proc getPpline {ls t l} {
   lassign $ls x1 y1 x2 y2
   # calculate point at t
   set it [expr {1-$t}]
   set xp [expr {$x1 * $t + $x2 * $it}]
   set yp [expr {$y1 * $t + $y2 * $it}]
   # get unit vector of ls
   lassign [pp2uv $x1 $y1 $x2 $y2] xu yu
   
   set l2 [expr {$l / 2.}]

   # generate start point of perpedicular line
   set px1 [expr {$xp - $yu * $l2}]
   set py1 [expr {$yp + $xu * $l2}]

   # generate end point of perpedicular line
   set px2 [expr {$xp + $yu * $l2}]
   set py2 [expr {$yp - $xu * $l2}]

   return [list $px1 $py1 $px2 $py2]
}

set linesegment {1. 1. 9. 9.}
set ppl [getPpline $linesegment 0.5 2.0]

puts $ppl