Ticket #57: grid_0438942f8930.patch
File grid_0438942f8930.patch, 48.0 KB (added by , 16 years ago) |
---|
-
doc/CMakeLists.txt
# HG changeset patch # User Balazs Dezso <deba@inf.elte.hu> # Date 1224501056 -7200 # Node ID 0438942f893073ff353d7cbbdc246029ad9f6931 # Parent ada5f74d1c9e874b24256426f1c5c0e141fcbc2d Improvements on grid graph - The indexing of the nodes is changed according to integer points of the plane. - The graph type does not depend on the UndirDigraphExtender. - Improve documentation. - Improve image generation. diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
a b 13 13 ADD_CUSTOM_TARGET(html 14 14 COMMAND rm -rf gen-images 15 15 COMMAND mkdir gen-images 16 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps 17 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps 18 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps 19 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps 20 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps 16 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps 17 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps 18 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps 19 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps 20 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps 21 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps 21 22 COMMAND rm -rf html 22 23 COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile 23 24 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) … … 25 26 ADD_CUSTOM_TARGET(html 26 27 COMMAND if exist gen-images rmdir /s /q gen-images 27 28 COMMAND mkdir gen-images 28 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps 29 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps 30 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps 31 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps 32 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r18 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps 29 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/nodeshape_0.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_0.eps 30 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/nodeshape_1.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_1.eps 31 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/nodeshape_2.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_2.eps 32 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/nodeshape_3.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_3.eps 33 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/nodeshape_4.png ${CMAKE_CURRENT_SOURCE_DIR}/images/nodeshape_4.eps 34 COMMAND ${GHOSTSCRIPT_EXECUTABLE} -dNOPAUSE -dBATCH -q -dEPSCrop -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=pngalpha -r36 -sOutputFile=gen-images/grid_graph.png ${CMAKE_CURRENT_SOURCE_DIR}/images/grid_graph.eps 33 35 COMMAND if exist html rmdir /s /q html 34 36 COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile 35 37 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -
doc/Makefile.am
diff --git a/doc/Makefile.am b/doc/Makefile.am
a b 15 15 nodeshape_1.eps \ 16 16 nodeshape_2.eps \ 17 17 nodeshape_3.eps \ 18 nodeshape_4.eps 18 nodeshape_4.eps \ 19 grid_graph.eps 19 20 20 21 DOC_EPS_IMAGES = \ 21 22 $(DOC_EPS_IMAGES18) … … 33 34 $(DOC_EPS_IMAGES18:%.eps=doc/gen-images/%.png): doc/gen-images/%.png: doc/images/%.eps 34 35 -mkdir doc/gen-images 35 36 if test ${gs_found} = yes; then \ 36 $(GS_COMMAND) -sDEVICE=pngalpha -r 18-sOutputFile=$@ $<; \37 $(GS_COMMAND) -sDEVICE=pngalpha -r36 -sOutputFile=$@ $<; \ 37 38 else \ 38 39 echo; \ 39 40 echo "Ghostscript not found."; \ -
new file doc/images/grid_graph.eps
diff --git a/doc/images/grid_graph.eps b/doc/images/grid_graph.eps new file mode 100644
- + 1 %!PS-Adobe-2.0 EPSF-2.0 2 %%Title: Grid undirected graph 3 %%Copyright: (C) 2006 LEMON Project 4 %%Creator: LEMON, graphToEps() 5 %%CreationDate: Fri Sep 29 11:55:56 2006 6 %%BoundingBox: 0 0 596 842 7 %%DocumentPaperSizes: a4 8 %%EndComments 9 /lb { setlinewidth setrgbcolor newpath moveto 10 4 2 roll 1 index 1 index curveto stroke } bind def 11 /l { setlinewidth setrgbcolor newpath moveto lineto stroke } bind def 12 /c { newpath dup 3 index add 2 index moveto 0 360 arc closepath } bind def 13 /sq { newpath 2 index 1 index add 2 index 2 index add moveto 14 2 index 1 index sub 2 index 2 index add lineto 15 2 index 1 index sub 2 index 2 index sub lineto 16 2 index 1 index add 2 index 2 index sub lineto 17 closepath pop pop pop} bind def 18 /di { newpath 2 index 1 index add 2 index moveto 19 2 index 2 index 2 index add lineto 20 2 index 1 index sub 2 index lineto 21 2 index 2 index 2 index sub lineto 22 closepath pop pop pop} bind def 23 /nc { 0 0 0 setrgbcolor 5 index 5 index 5 index c fill 24 setrgbcolor 1.1 div c fill 25 } bind def 26 /arrl 1 def 27 /arrw 0.3 def 28 /lrl { 2 index mul exch 2 index mul exch rlineto pop} bind def 29 /arr { setrgbcolor /y1 exch def /x1 exch def /dy exch def /dx exch def 30 /w exch def /len exch def 31 newpath x1 dy w 2 div mul add y1 dx w 2 div mul sub moveto 32 len w sub arrl sub dx dy lrl 33 arrw dy dx neg lrl 34 dx arrl w add mul dy w 2 div arrw add mul sub 35 dy arrl w add mul dx w 2 div arrw add mul add rlineto 36 dx arrl w add mul neg dy w 2 div arrw add mul sub 37 dy arrl w add mul neg dx w 2 div arrw add mul add rlineto 38 arrw dy dx neg lrl 39 len w sub arrl sub neg dx dy lrl 40 closepath fill } bind def 41 /cshow { 2 index 2 index moveto dup stringwidth pop 42 neg 2 div fosi .35 mul neg rmoveto show pop pop} def 43 44 gsave 45 100 150 translate 46 5.5000 5.5000 scale 47 1.14018 1.14018 translate 48 %Edges: 49 gsave 50 70 80 70 90 0 0 0 0.5000 l 51 70 70 70 80 0 0 0 0.5000 l 52 70 60 70 70 0 0 0 0.5000 l 53 70 50 70 60 0 0 0 0.5000 l 54 70 40 70 50 0 0 0 0.5000 l 55 70 30 70 40 0 0 0 0.5000 l 56 70 20 70 30 0 0 0 0.5000 l 57 70 10 70 20 0 0 0 0.5000 l 58 70 0 70 10 0 0 0 0.5000 l 59 60 80 60 90 0 0 0 0.5000 l 60 60 70 60 80 0 0 0 0.5000 l 61 60 60 60 70 0 0 0 0.5000 l 62 60 50 60 60 0 0 0 0.5000 l 63 60 40 60 50 0 0 0 0.5000 l 64 60 30 60 40 0 0 0 0.5000 l 65 60 20 60 30 0 0 0 0.5000 l 66 60 10 60 20 0 0 0 0.5000 l 67 60 0 60 10 0 0 0 0.5000 l 68 50 80 50 90 0 0 0 0.5000 l 69 50 70 50 80 0 0 0 0.5000 l 70 50 60 50 70 0 0 0 0.5000 l 71 50 50 50 60 0 0 0 0.5000 l 72 50 40 50 50 0 0 0 0.5000 l 73 50 30 50 40 0 0 0 0.5000 l 74 50 20 50 30 0 0 0 0.5000 l 75 50 10 50 20 0 0 0 0.5000 l 76 50 0 50 10 0 0 0 0.5000 l 77 40 80 40 90 0 0 0 0.5000 l 78 40 70 40 80 0 0 0 0.5000 l 79 40 60 40 70 0 0 0 0.5000 l 80 40 50 40 60 0 0 0 0.5000 l 81 40 40 40 50 0 0 0 0.5000 l 82 40 30 40 40 0 0 0 0.5000 l 83 40 20 40 30 0 0 0 0.5000 l 84 40 10 40 20 0 0 0 0.5000 l 85 40 0 40 10 0 0 0 0.5000 l 86 30 80 30 90 0 0 0 0.5000 l 87 30 70 30 80 0 0 0 0.5000 l 88 30 60 30 70 0 0 0 0.5000 l 89 30 50 30 60 0 0 0 0.5000 l 90 30 40 30 50 0 0 0 0.5000 l 91 30 30 30 40 0 0 0 0.5000 l 92 30 20 30 30 0 0 0 0.5000 l 93 30 10 30 20 0 0 0 0.5000 l 94 30 0 30 10 0 0 0 0.5000 l 95 20 80 20 90 0 0 0 0.5000 l 96 20 70 20 80 0 0 0 0.5000 l 97 20 60 20 70 0 0 0 0.5000 l 98 20 50 20 60 0 0 0 0.5000 l 99 20 40 20 50 0 0 0 0.5000 l 100 20 30 20 40 0 0 0 0.5000 l 101 20 20 20 30 0 0 0 0.5000 l 102 20 10 20 20 0 0 0 0.5000 l 103 20 0 20 10 0 0 0 0.5000 l 104 10 80 10 90 0 0 0 0.5000 l 105 10 70 10 80 0 0 0 0.5000 l 106 10 60 10 70 0 0 0 0.5000 l 107 10 50 10 60 0 0 0 0.5000 l 108 10 40 10 50 0 0 0 0.5000 l 109 10 30 10 40 0 0 0 0.5000 l 110 10 20 10 30 0 0 0 0.5000 l 111 10 10 10 20 0 0 0 0.5000 l 112 10 0 10 10 0 0 0 0.5000 l 113 0 80 0 90 0 0 0 0.5000 l 114 0 70 0 80 0 0 0 0.5000 l 115 0 60 0 70 0 0 0 0.5000 l 116 0 50 0 60 0 0 0 0.5000 l 117 0 40 0 50 0 0 0 0.5000 l 118 0 30 0 40 0 0 0 0.5000 l 119 0 20 0 30 0 0 0 0.5000 l 120 0 10 0 20 0 0 0 0.5000 l 121 0 0 0 10 0 0 0 0.5000 l 122 60 90 70 90 0 0 0 0.5000 l 123 60 80 70 80 0 0 0 0.5000 l 124 60 70 70 70 0 0 0 0.5000 l 125 60 60 70 60 0 0 0 0.5000 l 126 60 50 70 50 0 0 0 0.5000 l 127 60 40 70 40 0 0 0 0.5000 l 128 60 30 70 30 0 0 0 0.5000 l 129 60 20 70 20 0 0 0 0.5000 l 130 60 10 70 10 0 0 0 0.5000 l 131 60 0 70 0 0 0 0 0.5000 l 132 50 90 60 90 0 0 0 0.5000 l 133 50 80 60 80 0 0 0 0.5000 l 134 50 70 60 70 0 0 0 0.5000 l 135 50 60 60 60 0 0 0 0.5000 l 136 50 50 60 50 0 0 0 0.5000 l 137 50 40 60 40 0 0 0 0.5000 l 138 50 30 60 30 0 0 0 0.5000 l 139 50 20 60 20 0 0 0 0.5000 l 140 50 10 60 10 0 0 0 0.5000 l 141 50 0 60 0 0 0 0 0.5000 l 142 40 90 50 90 0 0 0 0.5000 l 143 40 80 50 80 0 0 0 0.5000 l 144 40 70 50 70 0 0 0 0.5000 l 145 40 60 50 60 0 0 0 0.5000 l 146 40 50 50 50 0 0 0 0.5000 l 147 40 40 50 40 0 0 0 0.5000 l 148 40 30 50 30 0 0 0 0.5000 l 149 40 20 50 20 0 0 0 0.5000 l 150 40 10 50 10 0 0 0 0.5000 l 151 40 0 50 0 0 0 0 0.5000 l 152 30 90 40 90 0 0 0 0.5000 l 153 30 80 40 80 0 0 0 0.5000 l 154 30 70 40 70 0 0 0 0.5000 l 155 30 60 40 60 0 0 0 0.5000 l 156 30 50 40 50 0 0 0 0.5000 l 157 30 40 40 40 0 0 0 0.5000 l 158 30 30 40 30 0 0 0 0.5000 l 159 30 20 40 20 0 0 0 0.5000 l 160 30 10 40 10 0 0 0 0.5000 l 161 30 0 40 0 0 0 0 0.5000 l 162 20 90 30 90 0 0 0 0.5000 l 163 20 80 30 80 0 0 0 0.5000 l 164 20 70 30 70 0 0 0 0.5000 l 165 20 60 30 60 0 0 0 0.5000 l 166 20 50 30 50 0 0 0 0.5000 l 167 20 40 30 40 0 0 0 0.5000 l 168 20 30 30 30 0 0 0 0.5000 l 169 20 20 30 20 0 0 0 0.5000 l 170 20 10 30 10 0 0 0 0.5000 l 171 20 0 30 0 0 0 0 0.5000 l 172 10 90 20 90 0 0 0 0.5000 l 173 10 80 20 80 0 0 0 0.5000 l 174 10 70 20 70 0 0 0 0.5000 l 175 10 60 20 60 0 0 0 0.5000 l 176 10 50 20 50 0 0 0 0.5000 l 177 10 40 20 40 0 0 0 0.5000 l 178 10 30 20 30 0 0 0 0.5000 l 179 10 20 20 20 0 0 0 0.5000 l 180 10 10 20 10 0 0 0 0.5000 l 181 10 0 20 0 0 0 0 0.5000 l 182 0 90 10 90 0 0 0 0.5000 l 183 0 80 10 80 0 0 0 0.5000 l 184 0 70 10 70 0 0 0 0.5000 l 185 0 60 10 60 0 0 0 0.5000 l 186 0 50 10 50 0 0 0 0.5000 l 187 0 40 10 40 0 0 0 0.5000 l 188 0 30 10 30 0 0 0 0.5000 l 189 0 20 10 20 0 0 0 0.5000 l 190 0 10 10 10 0 0 0 0.5000 l 191 0 0 10 0 0 0 0 0.5000 l 192 grestore 193 %Nodes: 194 gsave 195 70 90 1.4000 0 0 0 nc 196 70 80 1.4000 1 1 1 nc 197 70 70 1.4000 1 1 1 nc 198 70 60 1.4000 1 1 1 nc 199 70 50 1.4000 1 1 1 nc 200 70 40 1.4000 1 1 1 nc 201 70 30 1.4000 1 1 1 nc 202 70 20 1.4000 1 1 1 nc 203 70 10 1.4000 1 1 1 nc 204 70 0 1.4000 0 0 0 nc 205 60 90 1.4000 1 1 1 nc 206 60 80 1.4000 1 1 1 nc 207 60 70 1.4000 1 1 1 nc 208 60 60 1.4000 1 1 1 nc 209 60 50 1.4000 1 1 1 nc 210 60 40 1.4000 1 1 1 nc 211 60 30 1.4000 1 1 1 nc 212 60 20 1.4000 1 1 1 nc 213 60 10 1.4000 1 1 1 nc 214 60 0 1.4000 1 1 1 nc 215 50 90 1.4000 1 1 1 nc 216 50 80 1.4000 1 1 1 nc 217 50 70 1.4000 1 1 1 nc 218 50 60 1.4000 1 1 1 nc 219 50 50 1.4000 1 1 1 nc 220 50 40 1.4000 1 1 1 nc 221 50 30 1.4000 1 1 1 nc 222 50 20 1.4000 1 1 1 nc 223 50 10 1.4000 1 1 1 nc 224 50 0 1.4000 1 1 1 nc 225 40 90 1.4000 1 1 1 nc 226 40 80 1.4000 1 1 1 nc 227 40 70 1.4000 1 1 1 nc 228 40 60 1.4000 1 1 1 nc 229 40 50 1.4000 1 1 1 nc 230 40 40 1.4000 1 1 1 nc 231 40 30 1.4000 1 1 1 nc 232 40 20 1.4000 1 1 1 nc 233 40 10 1.4000 1 1 1 nc 234 40 0 1.4000 1 1 1 nc 235 30 90 1.4000 1 1 1 nc 236 30 80 1.4000 1 1 1 nc 237 30 70 1.4000 1 1 1 nc 238 30 60 1.4000 1 1 1 nc 239 30 50 1.4000 1 1 1 nc 240 30 40 1.4000 1 1 1 nc 241 30 30 1.4000 1 1 1 nc 242 30 20 1.4000 1 1 1 nc 243 30 10 1.4000 1 1 1 nc 244 30 0 1.4000 1 1 1 nc 245 20 90 1.4000 1 1 1 nc 246 20 80 1.4000 1 1 1 nc 247 20 70 1.4000 1 1 1 nc 248 20 60 1.4000 1 1 1 nc 249 20 50 1.4000 1 1 1 nc 250 20 40 1.4000 1 1 1 nc 251 20 30 1.4000 1 1 1 nc 252 20 20 1.4000 1 1 1 nc 253 20 10 1.4000 1 1 1 nc 254 20 0 1.4000 1 1 1 nc 255 10 90 1.4000 1 1 1 nc 256 10 80 1.4000 1 1 1 nc 257 10 70 1.4000 1 1 1 nc 258 10 60 1.4000 1 1 1 nc 259 10 50 1.4000 1 1 1 nc 260 10 40 1.4000 1 1 1 nc 261 10 30 1.4000 1 1 1 nc 262 10 20 1.4000 1 1 1 nc 263 10 10 1.4000 1 1 1 nc 264 10 0 1.4000 1 1 1 nc 265 0 90 1.4000 0 0 0 nc 266 0 80 1.4000 1 1 1 nc 267 0 70 1.4000 1 1 1 nc 268 0 60 1.4000 1 1 1 nc 269 0 50 1.4000 1 1 1 nc 270 0 40 1.4000 1 1 1 nc 271 0 30 1.4000 1 1 1 nc 272 0 20 1.4000 1 1 1 nc 273 0 10 1.4000 1 1 1 nc 274 0 0 1.4000 0 0 0 nc 275 grestore 276 gsave 277 /fosi 3.5 def 278 (Helvetica) findfont fosi scalefont setfont 279 0 0 0 setrgbcolor 280 0 95 ((0,height-1)) cshow 281 67 95 ((width-1,height-1)) cshow 282 0 -5 ((0,0)) cshow 283 70 -5 ((width-1,0)) cshow 284 grestore 285 grestore 286 showpage -
doc/images/nodeshape_0.eps
diff --git a/doc/images/nodeshape_0.eps b/doc/images/nodeshape_0.eps
a b 1 1 %!PS-Adobe-2.0 EPSF-2.0 2 2 %%Title: LEMON GraphToEps figure 3 3 %%Creator: LEMON GraphToEps function 4 %%BoundingBox: 0 0 200 2004 %%BoundingBox: 0 0 100 100 5 5 %%EndComments 6 6 /lb { setlinewidth setrgbcolor newpath moveto 7 7 4 2 roll 1 index 1 index curveto stroke } bind def … … 45 45 neg 2 div fosi .35 mul neg rmoveto show pop pop} def 46 46 47 47 gsave 48 100 dup scale48 50 dup scale 49 49 %Edges: 50 50 gsave 51 51 grestore -
doc/images/nodeshape_1.eps
diff --git a/doc/images/nodeshape_1.eps b/doc/images/nodeshape_1.eps
a b 1 1 %!PS-Adobe-2.0 EPSF-2.0 2 2 %%Title: LEMON GraphToEps figure 3 3 %%Creator: LEMON GraphToEps function 4 %%BoundingBox: 0 0 200 2004 %%BoundingBox: 0 0 100 100 5 5 %%EndComments 6 6 /lb { setlinewidth setrgbcolor newpath moveto 7 7 4 2 roll 1 index 1 index curveto stroke } bind def … … 45 45 neg 2 div fosi .35 mul neg rmoveto show pop pop} def 46 46 47 47 gsave 48 100 dup scale48 50 dup scale 49 49 %Edges: 50 50 gsave 51 51 grestore -
doc/images/nodeshape_2.eps
diff --git a/doc/images/nodeshape_2.eps b/doc/images/nodeshape_2.eps
a b 1 1 %!PS-Adobe-2.0 EPSF-2.0 2 2 %%Title: LEMON GraphToEps figure 3 3 %%Creator: LEMON GraphToEps function 4 %%BoundingBox: 0 0 200 2004 %%BoundingBox: 0 0 100 100 5 5 %%EndComments 6 6 /lb { setlinewidth setrgbcolor newpath moveto 7 7 4 2 roll 1 index 1 index curveto stroke } bind def … … 45 45 neg 2 div fosi .35 mul neg rmoveto show pop pop} def 46 46 47 47 gsave 48 100 dup scale48 50 dup scale 49 49 %Edges: 50 50 gsave 51 51 grestore -
doc/images/nodeshape_3.eps
diff --git a/doc/images/nodeshape_3.eps b/doc/images/nodeshape_3.eps
a b 1 1 %!PS-Adobe-2.0 EPSF-2.0 2 2 %%Title: LEMON GraphToEps figure 3 3 %%Creator: LEMON GraphToEps function 4 %%BoundingBox: 0 0 256 3724 %%BoundingBox: 0 0 128 186 5 5 %%EndComments 6 6 /lb { setlinewidth setrgbcolor newpath moveto 7 7 4 2 roll 1 index 1 index curveto stroke } bind def … … 65 65 neg 2 div fosi .35 mul neg rmoveto show pop pop} def 66 66 67 67 gsave 68 100 dup scale68 50 dup scale 69 69 %Edges: 70 70 gsave 71 71 grestore -
doc/images/nodeshape_4.eps
diff --git a/doc/images/nodeshape_4.eps b/doc/images/nodeshape_4.eps
a b 1 1 %!PS-Adobe-2.0 EPSF-2.0 2 2 %%Title: LEMON GraphToEps figure 3 3 %%Creator: LEMON GraphToEps function 4 %%BoundingBox: 0 -1 99 200 2004 %%BoundingBox: 0 -100 100 100 5 5 %%EndComments 6 6 /lb { setlinewidth setrgbcolor newpath moveto 7 7 4 2 roll 1 index 1 index curveto stroke } bind def … … 65 65 neg 2 div fosi .35 mul neg rmoveto show pop pop} def 66 66 67 67 gsave 68 100 dup scale68 50 dup scale 69 69 %Edges: 70 70 gsave 71 71 grestore -
lemon/grid_graph.h
diff --git a/lemon/grid_graph.h b/lemon/grid_graph.h
a b 19 19 #ifndef GRID_GRAPH_H 20 20 #define GRID_GRAPH_H 21 21 22 #include <iostream>23 22 #include <lemon/core.h> 23 #include <lemon/bits/graph_extender.h> 24 #include <lemon/dim2.h> 24 25 #include <lemon/assert.h> 25 26 #include <lemon/bits/base_extender.h>27 #include <lemon/bits/graph_extender.h>28 29 #include <lemon/dim2.h>30 26 31 27 ///\ingroup graphs 32 28 ///\file … … 41 37 typedef GridGraphBase Graph; 42 38 43 39 class Node; 40 class Edge; 44 41 class Arc; 45 42 46 43 public: … … 49 46 50 47 protected: 51 48 52 void construct(int w, int h) { 53 _height = h; _width = w; 54 _nodeNum = h * w; _arcNum = 2 * _nodeNum - w - h; 55 _arcLimit = _nodeNum - w; 56 } 57 58 Arc _down(Node n) const { 59 if (n.id < _nodeNum - _width) { 60 return Arc(n.id); 61 } else { 62 return INVALID; 63 } 64 } 65 66 Arc _up(Node n) const { 67 if (n.id >= _width) { 68 return Arc(n.id - _width); 69 } else { 70 return INVALID; 71 } 72 } 73 74 Arc _right(Node n) const { 75 if (n.id % _width < _width - 1) { 76 return _arcLimit + n.id % _width + (n.id / _width) * (_width - 1); 77 } else { 78 return INVALID; 79 } 80 } 81 82 Arc _left(Node n) const { 83 if (n.id % _width > 0) { 84 return _arcLimit + n.id % _width + (n.id / _width) * (_width - 1) - 1; 85 } else { 86 return INVALID; 87 } 49 void construct(int width, int height) { 50 _width = width; _height = height; 51 _node_num = width * height; 52 _edge_num = 2 * _node_num - width - height; 53 _edge_limit = _node_num - _width; 88 54 } 89 55 90 56 public: 91 57 92 58 Node operator()(int i, int j) const { 93 LEMON_ ASSERT(0 <= i && i < width()&&94 0 <= j && j < height(), "lemon::GridGraph::IndexError");59 LEMON_DEBUG(0 <= i && i < _width && 60 0 <= j && j < _height, "Index out of range"); 95 61 return Node(i + j * _width); 96 62 } 97 63 98 int row(Node n) const {99 return n. id /_width;64 int col(Node n) const { 65 return n._id % _width; 100 66 } 101 67 102 int col(Node n) const { 103 return n.id % _width; 68 int row(Node n) const { 69 return n._id / _width; 70 } 71 72 dim2::Point<int> pos(Node n) const { 73 return dim2::Point<int>(col(n), row(n)); 104 74 } 105 75 106 76 int width() const { … … 114 84 typedef True NodeNumTag; 115 85 typedef True ArcNumTag; 116 86 117 int nodeNum() const { return _nodeNum; } 118 int arcNum() const { return _arcNum; } 87 int nodeNum() const { return _node_num; } 88 int edgeNum() const { return _edge_num; } 89 int arcNum() const { return 2 * _edge_num; } 119 90 120 int maxNodeId() const { return nodeNum() - 1; } 121 int maxArcId() const { return arcNum() - 1; } 122 123 Node source(Arc e) const { 124 if (e.id < _arcLimit) { 125 return e.id; 91 Node u(Edge edge) const { 92 if (edge._id < _edge_limit) { 93 return edge._id; 126 94 } else { 127 return (e .id - _arcLimit) % (_width - 1) +128 (e .id - _arcLimit) / (_width - 1) * _width;95 return (edge._id - _edge_limit) % (_width - 1) + 96 (edge._id - _edge_limit) / (_width - 1) * _width; 129 97 } 130 98 } 131 99 132 Node target(Arce) const {133 if (e .id < _arcLimit) {134 return e .id + _width;100 Node v(Edge edge) const { 101 if (edge._id < _edge_limit) { 102 return edge._id + _width; 135 103 } else { 136 return (e .id - _arcLimit) % (_width - 1) +137 (e .id - _arcLimit) / (_width - 1) * _width + 1;104 return (edge._id - _edge_limit) % (_width - 1) + 105 (edge._id - _edge_limit) / (_width - 1) * _width + 1; 138 106 } 139 107 } 140 108 141 static int id(Node v) { return v.id; } 142 static int id(Arc e) { return e.id; } 109 Node source(Arc arc) const { 110 return (arc._id & 1) == 1 ? u(arc) : v(arc); 111 } 112 113 Node target(Arc arc) const { 114 return (arc._id & 1) == 1 ? v(arc) : u(arc); 115 } 116 117 static int id(Node node) { return node._id; } 118 static int id(Edge edge) { return edge._id; } 119 static int id(Arc arc) { return arc._id; } 120 121 int maxNodeId() const { return _node_num - 1; } 122 int maxEdgeId() const { return _edge_num - 1; } 123 int maxArcId() const { return 2 * _edge_num - 1; } 143 124 144 125 static Node nodeFromId(int id) { return Node(id);} 145 126 static Edge edgeFromId(int id) { return Edge(id);} 146 127 static Arc arcFromId(int id) { return Arc(id);} 147 128 148 typedef True FindArcTag; 129 typedef True FindEdgeTag; 130 131 Edge findEdge(Node u, Node v, Edge prev = INVALID) const { 132 if (prev != INVALID) return INVALID; 133 if (v._id > u._id) { 134 if (v._id - u._id == _width) 135 return Edge(u._id); 136 if (v._id - u._id == 1 && u._id % _width < _width - 1) { 137 return Edge(u._id / _width * (_width - 1) + 138 u._id % _width + _edge_limit); 139 } 140 } else { 141 if (u._id - v._id == _width) 142 return Edge(v._id); 143 if (u._id - v._id == 1 && v._id % _width < _width - 1) { 144 return Edge(v._id / _width * (_width - 1) + 145 v._id % _width + _edge_limit); 146 } 147 } 148 return INVALID; 149 } 149 150 150 151 Arc findArc(Node u, Node v, Arc prev = INVALID) const { 151 152 if (prev != INVALID) return INVALID; 152 if (v.id - u.id == _width) return Arc(u.id); 153 if (v.id - u.id == 1 && u.id % _width < _width - 1) { 154 return Arc(u.id / _width * (_width - 1) + 155 u.id % _width + _arcLimit); 153 if (v._id > u._id) { 154 if (v._id - u._id == _width) 155 return Arc((u._id << 1) | 1); 156 if (v._id - u._id == 1 && u._id % _width < _width - 1) { 157 return Arc(((u._id / _width * (_width - 1) + 158 u._id % _width + _edge_limit) << 1) | 1); 159 } 160 } else { 161 if (u._id - v._id == _width) 162 return Arc(v._id << 1); 163 if (u._id - v._id == 1 && v._id % _width < _width - 1) { 164 return Arc((v._id / _width * (_width - 1) + 165 v._id % _width + _edge_limit) << 1); 166 } 156 167 } 157 168 return INVALID; 158 169 } … … 161 172 friend class GridGraphBase; 162 173 163 174 protected: 164 int id;165 Node(int _id) : id(_id) {}175 int _id; 176 Node(int id) : _id(id) {} 166 177 public: 167 178 Node() {} 168 Node (Invalid) { id = -1; } 169 bool operator==(const Node node) const { return id == node.id; } 170 bool operator!=(const Node node) const { return id != node.id; } 171 bool operator<(const Node node) const { return id < node.id; } 179 Node (Invalid) : _id(-1) {} 180 bool operator==(const Node node) const {return _id == node._id;} 181 bool operator!=(const Node node) const {return _id != node._id;} 182 bool operator<(const Node node) const {return _id < node._id;} 183 }; 184 185 class Edge { 186 friend class GridGraphBase; 187 friend class Arc; 188 189 protected: 190 int _id; 191 192 Edge(int id) : _id(id) {} 193 194 public: 195 Edge() {} 196 Edge (Invalid) : _id(-1) {} 197 bool operator==(const Edge edge) const {return _id == edge._id;} 198 bool operator!=(const Edge edge) const {return _id != edge._id;} 199 bool operator<(const Edge edge) const {return _id < edge._id;} 172 200 }; 173 201 174 202 class Arc { 175 203 friend class GridGraphBase; 176 204 177 205 protected: 178 int id; 179 Arc(int _id) : id(_id) {} 206 int _id; 207 208 Arc(int id) : _id(id) {} 209 180 210 public: 181 211 Arc() {} 182 Arc (Invalid) { id = -1; } 183 bool operator==(const Arc arc) const { return id == arc.id; } 184 bool operator!=(const Arc arc) const { return id != arc.id; } 185 bool operator<(const Arc arc) const { return id < arc.id; } 212 Arc (Invalid) : _id(-1) {} 213 operator Edge() const { return _id != -1 ? Edge(_id >> 1) : INVALID; } 214 bool operator==(const Arc arc) const {return _id == arc._id;} 215 bool operator!=(const Arc arc) const {return _id != arc._id;} 216 bool operator<(const Arc arc) const {return _id < arc._id;} 186 217 }; 187 218 219 static bool direction(Arc arc) { 220 return (arc._id & 1) == 1; 221 } 222 223 static Arc direct(Edge edge, bool dir) { 224 return Arc((edge._id << 1) | (dir ? 1 : 0)); 225 } 226 188 227 void first(Node& node) const { 189 node. id = nodeNum()- 1;228 node._id = _node_num - 1; 190 229 } 191 230 192 231 static void next(Node& node) { 193 --node.id; 232 --node._id; 233 } 234 235 void first(Edge& edge) const { 236 edge._id = _edge_num - 1; 237 } 238 239 static void next(Edge& edge) { 240 --edge._id; 194 241 } 195 242 196 243 void first(Arc& arc) const { 197 arc. id = arcNum()- 1;244 arc._id = 2 * _edge_num - 1; 198 245 } 199 246 200 247 static void next(Arc& arc) { 201 --arc. id;248 --arc._id; 202 249 } 203 250 204 251 void firstOut(Arc& arc, const Node& node) const { 205 if (node.id < _nodeNum - _width) { 206 arc.id = node.id; 207 } else if (node.id % _width < _width - 1) { 208 arc.id = _arcLimit + node.id % _width + 209 (node.id / _width) * (_width - 1); 252 if (node._id % _width < _width - 1) { 253 arc._id = (_edge_limit + node._id % _width + 254 (node._id / _width) * (_width - 1)) << 1 | 1; 255 return; 256 } 257 if (node._id < _node_num - _width) { 258 arc._id = node._id << 1 | 1; 259 return; 260 } 261 if (node._id % _width > 0) { 262 arc._id = (_edge_limit + node._id % _width + 263 (node._id / _width) * (_width - 1) - 1) << 1; 264 return; 265 } 266 if (node._id >= _width) { 267 arc._id = (node._id - _width) << 1; 268 return; 269 } 270 arc._id = -1; 271 } 272 273 void nextOut(Arc& arc) const { 274 int nid = arc._id >> 1; 275 if ((arc._id & 1) == 1) { 276 if (nid >= _edge_limit) { 277 nid = (nid - _edge_limit) % (_width - 1) + 278 (nid - _edge_limit) / (_width - 1) * _width; 279 if (nid < _node_num - _width) { 280 arc._id = nid << 1 | 1; 281 return; 282 } 283 } 284 if (nid % _width > 0) { 285 arc._id = (_edge_limit + nid % _width + 286 (nid / _width) * (_width - 1) - 1) << 1; 287 return; 288 } 289 if (nid >= _width) { 290 arc._id = (nid - _width) << 1; 291 return; 292 } 210 293 } else { 211 arc.id = -1; 294 if (nid >= _edge_limit) { 295 nid = (nid - _edge_limit) % (_width - 1) + 296 (nid - _edge_limit) / (_width - 1) * _width + 1; 297 if (nid >= _width) { 298 arc._id = (nid - _width) << 1; 299 return; 300 } 301 } 302 } 303 arc._id = -1; 304 } 305 306 void firstIn(Arc& arc, const Node& node) const { 307 if (node._id % _width < _width - 1) { 308 arc._id = (_edge_limit + node._id % _width + 309 (node._id / _width) * (_width - 1)) << 1; 310 return; 311 } 312 if (node._id < _node_num - _width) { 313 arc._id = node._id << 1; 314 return; 315 } 316 if (node._id % _width > 0) { 317 arc._id = (_edge_limit + node._id % _width + 318 (node._id / _width) * (_width - 1) - 1) << 1 | 1; 319 return; 320 } 321 if (node._id >= _width) { 322 arc._id = (node._id - _width) << 1 | 1; 323 return; 324 } 325 arc._id = -1; 326 } 327 328 void nextIn(Arc& arc) const { 329 int nid = arc._id >> 1; 330 if ((arc._id & 1) == 0) { 331 if (nid >= _edge_limit) { 332 nid = (nid - _edge_limit) % (_width - 1) + 333 (nid - _edge_limit) / (_width - 1) * _width; 334 if (nid < _node_num - _width) { 335 arc._id = nid << 1; 336 return; 337 } 338 } 339 if (nid % _width > 0) { 340 arc._id = (_edge_limit + nid % _width + 341 (nid / _width) * (_width - 1) - 1) << 1 | 1; 342 return; 343 } 344 if (nid >= _width) { 345 arc._id = (nid - _width) << 1 | 1; 346 return; 347 } 348 } else { 349 if (nid >= _edge_limit) { 350 nid = (nid - _edge_limit) % (_width - 1) + 351 (nid - _edge_limit) / (_width - 1) * _width + 1; 352 if (nid >= _width) { 353 arc._id = (nid - _width) << 1 | 1; 354 return; 355 } 356 } 357 } 358 arc._id = -1; 359 } 360 361 void firstInc(Edge& edge, bool& dir, const Node& node) const { 362 if (node._id % _width < _width - 1) { 363 edge._id = _edge_limit + node._id % _width + 364 (node._id / _width) * (_width - 1); 365 dir = true; 366 return; 367 } 368 if (node._id < _node_num - _width) { 369 edge._id = node._id; 370 dir = true; 371 return; 372 } 373 if (node._id % _width > 0) { 374 edge._id = _edge_limit + node._id % _width + 375 (node._id / _width) * (_width - 1) - 1; 376 dir = false; 377 return; 378 } 379 if (node._id >= _width) { 380 edge._id = node._id - _width; 381 dir = false; 382 return; 383 } 384 edge._id = -1; 385 dir = true; 386 } 387 388 void nextInc(Edge& edge, bool& dir) const { 389 int nid = edge._id; 390 if (dir) { 391 if (nid >= _edge_limit) { 392 nid = (nid - _edge_limit) % (_width - 1) + 393 (nid - _edge_limit) / (_width - 1) * _width; 394 if (nid < _node_num - _width) { 395 edge._id = nid; 396 return; 397 } 398 } 399 if (nid % _width > 0) { 400 edge._id = _edge_limit + nid % _width + 401 (nid / _width) * (_width - 1) - 1; 402 dir = false; 403 return; 404 } 405 if (nid >= _width) { 406 edge._id = nid - _width; 407 dir = false; 408 return; 409 } 410 } else { 411 if (nid >= _edge_limit) { 412 nid = (nid - _edge_limit) % (_width - 1) + 413 (nid - _edge_limit) / (_width - 1) * _width + 1; 414 if (nid >= _width) { 415 edge._id = nid - _width; 416 return; 417 } 418 } 419 } 420 edge._id = -1; 421 dir = true; 422 } 423 424 Arc right(Node n) const { 425 if (n._id % _width < _width - 1) { 426 return Arc(((_edge_limit + n._id % _width + 427 (n._id / _width) * (_width - 1)) << 1) | 1); 428 } else { 429 return INVALID; 212 430 } 213 431 } 214 432 215 void nextOut(Arc& arc) const { 216 if (arc.id >= _arcLimit) { 217 arc.id = -1; 218 } else if (arc.id % _width < _width - 1) { 219 arc.id = _arcLimit + arc.id % _width + 220 (arc.id / _width) * (_width - 1); 433 Arc left(Node n) const { 434 if (n._id % _width > 0) { 435 return Arc((_edge_limit + n._id % _width + 436 (n._id / _width) * (_width - 1) - 1) << 1); 221 437 } else { 222 arc.id = -1;438 return INVALID; 223 439 } 224 440 } 225 441 226 void firstIn(Arc& arc, const Node& node) const { 227 if (node.id >= _width) { 228 arc.id = node.id - _width; 229 } else if (node.id % _width > 0) { 230 arc.id = _arcLimit + node.id % _width + 231 (node.id / _width) * (_width - 1) - 1; 442 Arc up(Node n) const { 443 if (n._id < _edge_limit) { 444 return Arc((n._id << 1) | 1); 232 445 } else { 233 arc.id = -1;446 return INVALID; 234 447 } 235 448 } 236 449 237 void nextIn(Arc& arc) const { 238 if (arc.id >= _arcLimit) { 239 arc.id = -1; 240 } else if (arc.id % _width > 0) { 241 arc.id = _arcLimit + arc.id % _width + 242 (arc.id / _width + 1) * (_width - 1) - 1; 450 Arc down(Node n) const { 451 if (n._id >= _width) { 452 return Arc((n._id - _width) << 1); 243 453 } else { 244 arc.id = -1;454 return INVALID; 245 455 } 246 456 } 247 457 248 458 private: 249 459 int _width, _height; 250 int _node Num, _arcNum;251 int _ arcLimit;460 int _node_num, _edge_num; 461 int _edge_limit; 252 462 }; 253 463 254 typedef GraphExtender<UndirDigraphExtender<GridGraphBase> > 255 464 465 typedef GraphExtender<GridGraphBase> ExtendedGridGraphBase; 256 466 257 467 /// \ingroup graphs 258 468 /// 259 469 /// \brief Grid graph class 260 470 /// 261 471 /// This class implements a special graph type. The nodes of the 262 /// graph can be indiced by two integer \c (i,j) value where \c i 263 /// is in the \c [0,width) range and j is in the [0, height) range. 264 /// Two nodes are connected in the graph if the indices differ only 265 /// on one position and only one is the difference. 472 /// graph can be indexed by two integer \c (i,j) value where \c i is 473 /// in the \c [0..width()-1] range and j is in the \c 474 /// [0..height()-1] range. Two nodes are connected in the graph if 475 /// the indexes differ exactly on one position and exactly one is 476 /// the difference. The nodes of the graph can be indexed by position 477 /// with the \c operator()() function. The positions of the nodes can be 478 /// get with \c pos(), \c col() and \c row() members. The outgoing 479 /// arcs can be retrieved with the \c right(), \c up(), \c left() 480 /// and \c down() functions, where the bottom-left corner is the 481 /// origin. 266 482 /// 267 483 /// \image html grid_graph.png 268 /// \image latex grid_graph.eps "Grid graph" width=\textwidth484 /// \image latex grid_graph.eps "Grid graph" row_num=\textrow_num 269 485 /// 270 /// The graph can be indiced in the following way:486 /// A short example about the basic usage: 271 487 ///\code 272 /// GridGraph gr (w, h);273 /// GridGraph::NodeMap<int> val(gr );274 /// for (int i = 0; i < gr .width(); ++i) {275 /// for (int j = 0; j < gr .height(); ++j) {276 /// val[gr (i, j)] = i + j;488 /// GridGraph graph(rows, cols); 489 /// GridGraph::NodeMap<int> val(graph); 490 /// for (int i = 0; i < graph.width(); ++i) { 491 /// for (int j = 0; j < graph.height(); ++j) { 492 /// val[graph(i, j)] = i + j; 277 493 /// } 278 494 /// } 279 495 ///\endcode 280 496 /// 281 497 /// This graph type is fully conform to the \ref concepts::Graph 282 /// " Undirected Graph" concept, and it also has an important extra283 /// featurethat its maps are real \ref concepts::ReferenceMap498 /// "Graph" concept, and it also has an important extra feature 499 /// that its maps are real \ref concepts::ReferenceMap 284 500 /// "reference map"s. 285 501 class GridGraph : public ExtendedGridGraphBase { 286 502 public: … … 292 508 /// Map to get the indices of the nodes as dim2::Point<int>. 293 509 class IndexMap { 294 510 public: 295 /// The key type of the map511 /// \brief The key type of the map 296 512 typedef GridGraph::Node Key; 297 /// The value type of the map513 /// \brief The value type of the map 298 514 typedef dim2::Point<int> Value; 299 515 516 /// \brief Constructor 517 /// 300 518 /// Constructor 301 519 IndexMap(const GridGraph& graph) : _graph(graph) {} 302 520 303 /// The subscript operator 304 Value operator[](const Key& key) const { 305 return dim2::Point<int>(_graph.row(key), _graph.col(key)); 521 /// \brief The subscript operator 522 /// 523 /// The subscript operator. 524 Value operator[](Key key) const { 525 return _graph.pos(key); 526 } 527 528 private: 529 const GridGraph& _graph; 530 }; 531 532 /// \brief Map to get the column of the nodes. 533 /// 534 /// Map to get the column of the nodes. 535 class ColMap { 536 public: 537 /// \brief The key type of the map 538 typedef GridGraph::Node Key; 539 /// \brief The value type of the map 540 typedef int Value; 541 542 /// \brief Constructor 543 /// 544 /// Constructor 545 ColMap(const GridGraph& graph) : _graph(graph) {} 546 547 /// \brief The subscript operator 548 /// 549 /// The subscript operator. 550 Value operator[](Key key) const { 551 return _graph.col(key); 306 552 } 307 553 308 554 private: … … 314 560 /// Map to get the row of the nodes. 315 561 class RowMap { 316 562 public: 317 /// The key type of the map563 /// \brief The key type of the map 318 564 typedef GridGraph::Node Key; 319 /// The value type of the map565 /// \brief The value type of the map 320 566 typedef int Value; 321 567 568 /// \brief Constructor 569 /// 322 570 /// Constructor 323 571 RowMap(const GridGraph& graph) : _graph(graph) {} 324 572 325 /// The subscript operator 326 Value operator[](const Key& key) const { 573 /// \brief The subscript operator 574 /// 575 /// The subscript operator. 576 Value operator[](Key key) const { 327 577 return _graph.row(key); 328 }329 330 private:331 const GridGraph& _graph;332 };333 334 /// \brief Map to get the column of the nodes.335 ///336 /// Map to get the column of the nodes.337 class ColMap {338 public:339 /// The key type of the map340 typedef GridGraph::Node Key;341 /// The value type of the map342 typedef int Value;343 344 /// Constructor345 ColMap(const GridGraph& graph) : _graph(graph) {}346 347 /// The subscript operator348 Value operator[](const Key& key) const {349 return _graph.col(key);350 578 } 351 579 352 580 private: … … 355 583 356 584 /// \brief Constructor 357 585 /// 358 /// Constructor. 359 /// \param width The width of the grid. 360 /// \param height The height of the grid. 586 /// Construct a grid graph with given size. 361 587 GridGraph(int width, int height) { construct(width, height); } 362 588 363 589 /// \brief Resize the graph 364 590 /// 365 /// Resize the grid. 591 /// Resize the graph. The function will fully destroy and rebuild 592 /// the graph. This cause that the maps of the graph will 593 /// reallocated automatically and the previous values will be 594 /// lost. 366 595 void resize(int width, int height) { 367 596 Parent::notifier(Arc()).clear(); 368 597 Parent::notifier(Edge()).clear(); … … 380 609 return Parent::operator()(i, j); 381 610 } 382 611 612 /// \brief Gives back the column index of the node. 613 /// 614 /// Gives back the column index of the node. 615 int col(Node n) const { 616 return Parent::col(n); 617 } 618 383 619 /// \brief Gives back the row index of the node. 384 620 /// 385 621 /// Gives back the row index of the node. … … 387 623 return Parent::row(n); 388 624 } 389 625 390 /// \brief Gives back the column indexof the node.626 /// \brief Gives back the position of the node. 391 627 /// 392 /// Gives back the column index of the node.393 int col(Node n) const {394 return Parent:: col(n);628 /// Gives back the position of the node, ie. the <tt>(col,row)</tt> pair. 629 dim2::Point<int> pos(Node n) const { 630 return Parent::pos(n); 395 631 } 396 632 397 /// \brief Gives back the width of the grid.633 /// \brief Gives back the number of the columns. 398 634 /// 399 /// Gives back the width of the grid.635 /// Gives back the number of the columns. 400 636 int width() const { 401 637 return Parent::width(); 402 638 } 403 639 404 /// \brief Gives back the height of the grid.640 /// \brief Gives back the number of the rows. 405 641 /// 406 /// Gives back the height of the grid.642 /// Gives back the number of the rows. 407 643 int height() const { 408 644 return Parent::height(); 645 } 646 647 /// \brief Gives back the arc goes right from the node. 648 /// 649 /// Gives back the arc goes right from the node. If there is not 650 /// outgoing arc then it gives back INVALID. 651 Arc right(Node n) const { 652 return Parent::right(n); 653 } 654 655 /// \brief Gives back the arc goes left from the node. 656 /// 657 /// Gives back the arc goes left from the node. If there is not 658 /// outgoing arc then it gives back INVALID. 659 Arc left(Node n) const { 660 return Parent::left(n); 661 } 662 663 /// \brief Gives back the arc goes up from the node. 664 /// 665 /// Gives back the arc goes up from the node. If there is not 666 /// outgoing arc then it gives back INVALID. 667 Arc up(Node n) const { 668 return Parent::up(n); 409 669 } 410 670 411 671 /// \brief Gives back the arc goes down from the node. 412 672 /// 413 673 /// Gives back the arc goes down from the node. If there is not 414 /// outgoing arc then it gives back \cINVALID.674 /// outgoing arc then it gives back INVALID. 415 675 Arc down(Node n) const { 416 Edge e = _down(n); 417 return e != INVALID ? direct(e, true) : INVALID; 676 return Parent::down(n); 418 677 } 419 678 420 /// \brief Gives back the arc goes up from the node.679 /// \brief Index map of the grid graph 421 680 /// 422 /// Gives back the arc goes up from the node. If there is not 423 /// outgoing arc then it gives back \c INVALID. 424 Arc up(Node n) const { 425 Edge e = _up(n); 426 return e != INVALID ? direct(e, false) : INVALID; 681 /// Just returns an IndexMap for the grid graph. 682 IndexMap indexMap() const { 683 return IndexMap(*this); 427 684 } 428 685 429 /// \brief Gives back the arc goes right from the node.686 /// \brief Row map of the grid graph 430 687 /// 431 /// Gives back the arc goes right from the node. If there is not 432 /// outgoing arc then it gives back \c INVALID. 433 Arc right(Node n) const { 434 Edge e = _right(n); 435 return e != INVALID ? direct(e, true) : INVALID; 688 /// Just returns a RowMap for the grid graph. 689 RowMap rowMap() const { 690 return RowMap(*this); 436 691 } 437 692 438 /// \brief Gives back the arc goes left from the node.693 /// \brief Column map of the grid graph 439 694 /// 440 /// Gives back the arc goes left from the node. If there is not 441 /// outgoing arc then it gives back \c INVALID. 442 Arc left(Node n) const { 443 Edge e = _left(n); 444 return e != INVALID ? direct(e, false) : INVALID; 695 /// Just returns a ColMap for the grid graph. 696 ColMap colMap() const { 697 return ColMap(*this); 445 698 } 446 699 447 }; // class GridGraph700 }; 448 701 449 /// \brief Index map of the grid graph450 ///451 /// Just returns an IndexMap for the grid graph.452 inline GridGraph::IndexMap indexMap(const GridGraph& graph) {453 return GridGraph::IndexMap(graph);454 }455 456 /// \brief Row map of the grid graph457 ///458 /// Just returns a RowMap for the grid graph.459 inline GridGraph::RowMap rowMap(const GridGraph& graph) {460 return GridGraph::RowMap(graph);461 }462 463 /// \brief Column map of the grid graph464 ///465 /// Just returns a ColMap for the grid graph.466 inline GridGraph::ColMap colMap(const GridGraph& graph) {467 return GridGraph::ColMap(graph);468 }469 702 } 470 471 #endif // GRID_GRAPH_H 703 #endif -
test/graph_test.cc
diff --git a/test/graph_test.cc b/test/graph_test.cc
a b 126 126 } 127 127 // { // Checking FullGraph 128 128 // checkConcept<Graph, FullGraph>(); 129 // checkGraphIterators<FullGraph>(); 129 130 // } 130 131 { // Checking GridGraph 131 132 checkConcept<Graph, GridGraph>(); … … 186 187 check(!g.valid(g.arcFromId(-1)), "Wrong validity check"); 187 188 } 188 189 189 void checkGridGraph(const GridGraph& g, int w, int h) { 190 check(g.width() == w, "Wrong width"); 191 check(g.height() == h, "Wrong height"); 190 void checkGridGraph(int width, int height) { 191 typedef GridGraph Graph; 192 GRAPH_TYPEDEFS(Graph); 193 Graph G(width, height); 192 194 193 for (int i = 0; i < w; ++i) { 194 for (int j = 0; j < h; ++j) { 195 check(g.col(g(i, j)) == i, "Wrong col"); 196 check(g.row(g(i, j)) == j, "Wrong row"); 195 check(G.width() == width, "Wrong column number"); 196 check(G.height() == height, "Wrong row number"); 197 198 for (int i = 0; i < width; ++i) { 199 for (int j = 0; j < height; ++j) { 200 check(G.col(G(i, j)) == i, "Wrong column"); 201 check(G.row(G(i, j)) == j, "Wrong row"); 202 check(G.pos(G(i, j)).x == i, "Wrong column"); 203 check(G.pos(G(i, j)).y == j, "Wrong row"); 197 204 } 198 205 } 199 206 200 for (int i = 0; i < w; ++i) {201 for (int j = 0; j < h - 1; ++j) {202 check( g.source(g.down(g(i, j))) == g(i, j), "Wrong down");203 check( g.target(g.down(g(i, j))) == g(i, j + 1), "Wrong down");207 for (int j = 0; j < height; ++j) { 208 for (int i = 0; i < width - 1; ++i) { 209 check(G.source(G.right(G(i, j))) == G(i, j), "Wrong right"); 210 check(G.target(G.right(G(i, j))) == G(i + 1, j), "Wrong right"); 204 211 } 205 check( g.down(g(i, h - 1)) == INVALID, "Wrong down");212 check(G.right(G(width - 1, j)) == INVALID, "Wrong right"); 206 213 } 207 214 208 for (int i = 0; i < w; ++i) {209 for (int j = 1; j < h; ++j) {210 check( g.source(g.up(g(i, j))) == g(i, j), "Wrong up");211 check( g.target(g.up(g(i, j))) == g(i, j - 1), "Wrong up");215 for (int j = 0; j < height; ++j) { 216 for (int i = 1; i < width; ++i) { 217 check(G.source(G.left(G(i, j))) == G(i, j), "Wrong left"); 218 check(G.target(G.left(G(i, j))) == G(i - 1, j), "Wrong left"); 212 219 } 213 check( g.up(g(i, 0)) == INVALID, "Wrong up");220 check(G.left(G(0, j)) == INVALID, "Wrong left"); 214 221 } 215 222 216 for (int j = 0; j < h; ++j) {217 for (int i = 0; i < w - 1; ++i) {218 check( g.source(g.right(g(i, j))) == g(i, j), "Wrong right");219 check( g.target(g.right(g(i, j))) == g(i + 1, j), "Wrong right");223 for (int i = 0; i < width; ++i) { 224 for (int j = 0; j < height - 1; ++j) { 225 check(G.source(G.up(G(i, j))) == G(i, j), "Wrong up"); 226 check(G.target(G.up(G(i, j))) == G(i, j + 1), "Wrong up"); 220 227 } 221 check( g.right(g(w - 1, j)) == INVALID, "Wrong right");228 check(G.up(G(i, height - 1)) == INVALID, "Wrong up"); 222 229 } 223 230 224 for (int j = 0; j < h; ++j) {225 for (int i = 1; i < w; ++i) {226 check( g.source(g.left(g(i, j))) == g(i, j), "Wrong left");227 check( g.target(g.left(g(i, j))) == g(i - 1, j), "Wrong left");231 for (int i = 0; i < width; ++i) { 232 for (int j = 1; j < height; ++j) { 233 check(G.source(G.down(G(i, j))) == G(i, j), "Wrong down"); 234 check(G.target(G.down(G(i, j))) == G(i, j - 1), "Wrong down"); 228 235 } 229 check( g.left(g(0, j)) == INVALID, "Wrong left");236 check(G.down(G(i, 0)) == INVALID, "Wrong down"); 230 237 } 231 238 232 checkGraphNodeList( g, w*h);233 checkGraph ArcList(g, 2*(2*w*h-w-h));234 checkGraph EdgeList(g, 2*w*h-w-h);239 checkGraphNodeList(G, width * height); 240 checkGraphEdgeList(G, width * (height - 1) + (width - 1) * height); 241 checkGraphArcList(G, 2 * (width * (height - 1) + (width - 1) * height)); 235 242 236 checkGraphOutArcList(g, g(0,0), 2); 237 checkGraphOutArcList(g, g(0,1), 3); 238 checkGraphOutArcList(g, g(w-2,h-2), 4); 243 for (NodeIt n(G); n != INVALID; ++n) { 244 int nb = 4; 245 if (G.col(n) == 0) --nb; 246 if (G.col(n) == width - 1) --nb; 247 if (G.row(n) == 0) --nb; 248 if (G.row(n) == height - 1) --nb; 239 249 240 checkGraphInArcList(g, g(0,0), 2); 241 checkGraphInArcList(g, g(0,1), 3); 242 checkGraphInArcList(g, g(w-2,h-2), 4); 250 checkGraphOutArcList(G, n, nb); 251 checkGraphInArcList(G, n, nb); 252 checkGraphIncEdgeList(G, n, nb); 253 } 243 254 244 checkGraphIncEdgeList(g, g(0,0), 2); 245 checkGraphIncEdgeList(g, g(0,1), 3); 246 checkGraphIncEdgeList(g, g(w-2,h-2), 4); 255 checkArcDirections(G); 247 256 248 checkGraphConArcList( g, 2*(2*w*h-w-h));249 checkGraphConEdgeList( g, 2*w*h-w-h);257 checkGraphConArcList(G, 2 * (width * (height - 1) + (width - 1) * height)); 258 checkGraphConEdgeList(G, width * (height - 1) + (width - 1) * height); 250 259 251 checkArcDirections(g); 260 checkNodeIds(G); 261 checkArcIds(G); 262 checkEdgeIds(G); 263 checkGraphNodeMap(G); 264 checkGraphArcMap(G); 265 checkGraphEdgeMap(G); 252 266 253 checkNodeIds(g);254 checkArcIds(g);255 checkEdgeIds(g);256 checkGraphNodeMap(g);257 checkGraphArcMap(g);258 checkGraphEdgeMap(g);259 267 } 260 268 261 269 void checkGraphs() { … … 273 281 // checkGraphEdgeList(g, 10); 274 282 // } 275 283 { // Checking GridGraph 276 GridGraph g(5, 6); 277 checkGridGraph(g, 5, 6); 284 checkGridGraph(5, 8); 285 checkGridGraph(8, 5); 286 checkGridGraph(5, 5); 287 checkGridGraph(0, 0); 288 checkGridGraph(1, 1); 278 289 } 279 290 } 280 291