Zahnräder
Glauben Sie es oder nicht: der Peripherie-Punkt des inneren Zahnrades bewegt sich beim Abrollen im äußeren Zahnkranz auf einer exakten Geraden. Mit der Geometrie könnte ein Hubkolbenmotor ohne Pleuel gebaut werden.
#!/usr/bin/wish package require Tk pack [canvas .c -bg white -width 300 -height 300]\ -expand yes -fill both wm resizable . no no namespace import ::tcl::mathop::* ::tcl::mathfunc::* variable pi [acos -1] proc drawGeometry {} { .c create line 10 150 290 150\ -fill green -width 5 -tags geometry } proc gearwheelCoords {x y r num {alpha 0}} { variable pi set 2pi [* 2 $pi] set toothLength 12 set rI [- $r $toothLength] set rO [+ $r $toothLength] set phi [/ $2pi $num] for {set i 0} {$i < $num} {incr i} { if {$i % 2 != 0} then { set rC $rI } else { set rC $rO } lappend coords\ [+ $x [* $rC [cos [+ $alpha [* $i $phi]]]]]\ [+ $y [* $rC [sin [+ $alpha [* $i $phi]]]]] } set coords } set outerGearCoords [gearwheelCoords 150 150 100 52] set innerGearCoords [gearwheelCoords 200 150 50 26] .c delete all .c create oval 20 20 280 280 -fill silver -tags outer -width 0 .c create polygon $outerGearCoords\ -fill white -width 0 -smooth yes -tags outer .c create polygon $innerGearCoords\ -fill grey90 -width 0 -smooth yes -tags inner drawGeometry .c create oval 240 140 260 160 -fill "" -outline red -width 3\ -tags crankpin proc setInnerGear alpha { set radius 50 lassign {150 150 50} sunX sunY orbit set xC [+ $sunX [* $orbit [cos $alpha]]] set yC [+ $sunY [* $orbit [sin $alpha]]] .c coords inner\ [gearwheelCoords $xC $yC 50 26 [* $alpha -1]] set dx [* [cos [- $alpha]] $radius] set dy [* [sin [- $alpha]] $radius] set x [+ $xC $dx] set y [+ $yC $dy] .c coords crankpin [- $x 10] [- $y 10] [+ $x 10] [+ $y 10] } variable alpha 0 variable timeDelta 10 proc step {} { variable alpha variable timeDelta set alpha [+ $alpha 0.01] setInnerGear $alpha after $timeDelta step } bind .c <5> { if {$timeDelta < 5} then { incr timeDelta } elseif {$timeDelta < 50} then { incr timeDelta 5 } } bind .c <4> { if {$timeDelta > 5} then { incr timeDelta -5 } elseif {$timeDelta > 1} then { incr timeDelta -1 } } # main step
11.3.2022
<< | Heimatseite | Verzeichnis | Stichworte | Autor | >>