# # rysowanie grafow (zastosowanie jest na koncu pliku!) # ## ladowanie pakietow/ proc bibl. # package req Tk proc iterate {zm liIter kod} { upvar $zm i; for {set i 0} {$i<$liIter} {incr i} {if {[catch {uplevel $kod} x]==2} {return -code return $x}} } if 0 { # wersja lin: set prefix ~/tcl/tcldot load $prefix/libtkspline.so load $prefix/libtcldot_builtin.so package req Tcldot } if 1 { # wersja win: set prefix {E:\TEMP\tcl\__nowe\tcldot\lib} #set env(PATH) "$env(PATH);$prefix" set env(PATH) "$prefix" lappend auto_path $prefix package req Tcldot } ## tworzymy widget w ktorym bedzie widzoczny graf # canvas .c -bg green pack .c -fill both -expand 1 # przesuwanie obrazu mysza set bb 0 bind .c {set bb 1; set xx %x; set yy %y} bind .c {set bb 0} bind .c { if {!$bb} continue .c move all [expr %x-$xx] [expr %y-$yy] set xx %x; set yy %y } # zoom przy pomocy myszy bind .c {.c scale all %x %y .9 .9} bind .c {.c scale all %x %y 1.1 1.1} ## proc rysujaca graf nieskier z wagami na kraw oraz podgraf # we: # {{0 1 2} {{0 1 .1} {1 2 .2} {2 0 .3}} {{0 1} {1 2}}} # wierz kraw z wagami podgraf if 0 { proc rysujGrafNieskier G { # waga kraw - label global dotV dotE if [info exists dotV] {unset dotV} if [info exists dotE] {unset dotE} set GV [lindex $G 0] set GE [lindex $G 1] set T [lindex $G 2] set g [dotnew graph] $g setattr overlap 0 splines 1 sep .5 # te atrybuty grafu powodujace ze lepiej wyglada... foreach v $GV { # rysujemy wierz set dotV($v) [$g addnode label $v width 0 height 0] } foreach e $GE { # rysujemy kraw set v0 [lindex $e 0] set v1 [lindex $e 1] set w [lindex $e 2] set dotE($v0\ $v1) [$g addedge $dotV($v0) $dotV($v1) label $w] } .c delete all; eval [$g render .c] .c scale all 0 0 .5 .5 $g delete foreach e $T { # rysumemy podgraf if {![info exists dotE($e)]} { set e1 [list [lindex $e 1] [lindex $e 0]]; set e $e1 } .c itemconf 1$dotE($e) -fill red -width 2 } }} proc rysujGrafNieskier G { # waga kraw - grubosc global dotV dotE if [info exists dotV] {unset dotV} if [info exists dotE] {unset dotE} set GV [lindex $G 0] set GE [lindex $G 1] set T [lindex $G 2] set g [dotnew graph] $g setattr overlap 0 splines 1 sep .5 # te atrybuty grafu powodujace ze lepiej wyglada... foreach v $GV { # rysujemy wierz set dotV($v) [$g addnode label $v width 0 height 0] } foreach e $GE { # rysujemy kraw set v0 [lindex $e 0] set v1 [lindex $e 1] set w [lindex $e 2] set dotE($v0\ $v1) [$g addedge $dotV($v0) $dotV($v1)] } .c delete all; eval [$g render .c] .c scale all 0 0 .5 .5 $g delete foreach e $T { # podgraf if {![info exists dotE($e)]} { set e1 [list [lindex $e 1] [lindex $e 0]]; set e $e1 } .c itemconf 1$dotE($e) -fill red } foreach e $GE { # wagi jako grubosci krawedzi set e1 [lrange $e 0 1] set w [lindex $e 2] .c itemconf 1$dotE($e1) -width $w } } ## ... i jej zastosowanie -------------------------------- rysujGrafNieskier {{0 1 2} {{0 1 1.0} {1 2 2.0} {2 0 3.0}} {{0 1} {2 1}}} # wierz kraw z wagami podgraf (zb. kraw) # Uwaga: wagi sa reprezentowane przez grubosc # zatem powinny byc calkowite...