From 9cf33dcd27d0c1b6c99bfbbd088d21ae1b75f572 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Leonardo=20Fl=C3=B3rez-Valencia?= Date: Mon, 9 Oct 2017 15:56:44 -0500 Subject: [PATCH] ... --- CMakeLists.txt | 12 +- cmake/cpPlgUninstall.cmake.in | 27 ++ data/axial_CT_slice.bmp | Bin 0 -> 66614 bytes lib/fpa/CMakeLists.txt | 2 +- lib/fpa/Common/Image/PathReader.h | 85 ------ lib/fpa/Common/Image/PathReader.hxx | 172 ----------- lib/fpa/Common/Image/PathWriter.h | 69 ----- lib/fpa/Common/Image/PathWriter.hxx | 111 ------- lib/fpa/Common/Image/SkeletonReader.h | 85 ------ lib/fpa/Common/Image/SkeletonReader.hxx | 208 -------------- lib/fpa/Common/Image/SkeletonWriter.h | 74 ----- lib/fpa/Common/Image/SkeletonWriter.hxx | 161 ----------- ...{OriginalRandomWalker.h => RandomWalker.h} | 31 +- ...ginalRandomWalker.hxx => RandomWalker.hxx} | 83 +++--- lib/fpa/Config.h.in | 68 +---- lib/fpa/DataStructures/Graph.h | 167 ----------- lib/fpa/DataStructures/Graph.hxx | 270 ------------------ .../Image/MinimumSpanningTree.h | 77 ----- .../Image/MinimumSpanningTree.hxx | 71 ----- lib/fpa/DataStructures/Image/Path.h | 104 ------- lib/fpa/DataStructures/Image/Path.hxx | 215 -------------- lib/fpa/DataStructures/Image/Skeleton.h | 68 ----- lib/fpa/DataStructures/Image/Skeleton.hxx | 98 ------- lib/fpa/DataStructures/MinimumSpanningTree.h | 74 ----- .../DataStructures/MinimumSpanningTree.hxx | 236 --------------- lib/fpa/VTK/Image/PathToPolyDataFilter.h | 70 ----- lib/fpa/VTK/Image/PathToPolyDataFilter.hxx | 133 --------- lib/fpa/VTK/Image/SkeletonToPolyDataFilter.h | 71 ----- .../VTK/Image/SkeletonToPolyDataFilter.hxx | 154 ---------- 29 files changed, 89 insertions(+), 2907 deletions(-) create mode 100644 cmake/cpPlgUninstall.cmake.in create mode 100644 data/axial_CT_slice.bmp delete mode 100644 lib/fpa/Common/Image/PathReader.h delete mode 100644 lib/fpa/Common/Image/PathReader.hxx delete mode 100644 lib/fpa/Common/Image/PathWriter.h delete mode 100644 lib/fpa/Common/Image/PathWriter.hxx delete mode 100644 lib/fpa/Common/Image/SkeletonReader.h delete mode 100644 lib/fpa/Common/Image/SkeletonReader.hxx delete mode 100644 lib/fpa/Common/Image/SkeletonWriter.h delete mode 100644 lib/fpa/Common/Image/SkeletonWriter.hxx rename lib/fpa/Common/{OriginalRandomWalker.h => RandomWalker.h} (86%) rename lib/fpa/Common/{OriginalRandomWalker.hxx => RandomWalker.hxx} (90%) delete mode 100644 lib/fpa/DataStructures/Graph.h delete mode 100644 lib/fpa/DataStructures/Graph.hxx delete mode 100644 lib/fpa/DataStructures/Image/MinimumSpanningTree.h delete mode 100644 lib/fpa/DataStructures/Image/MinimumSpanningTree.hxx delete mode 100644 lib/fpa/DataStructures/Image/Path.h delete mode 100644 lib/fpa/DataStructures/Image/Path.hxx delete mode 100644 lib/fpa/DataStructures/Image/Skeleton.h delete mode 100644 lib/fpa/DataStructures/Image/Skeleton.hxx delete mode 100644 lib/fpa/DataStructures/MinimumSpanningTree.h delete mode 100644 lib/fpa/DataStructures/MinimumSpanningTree.hxx delete mode 100644 lib/fpa/VTK/Image/PathToPolyDataFilter.h delete mode 100644 lib/fpa/VTK/Image/PathToPolyDataFilter.hxx delete mode 100644 lib/fpa/VTK/Image/SkeletonToPolyDataFilter.h delete mode 100644 lib/fpa/VTK/Image/SkeletonToPolyDataFilter.hxx diff --git a/CMakeLists.txt b/CMakeLists.txt index 6031b51..4f4f232 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,7 @@ endforeach(_p) find_package(cpPlugins CONFIG REQUIRED) ## == Find eigen3 (http://eigen.tuxfamily.org) -find_package(Eigen3 CONFIG) +find_package(Eigen3 QUIET CONFIG) if(Eigen3_FOUND) include(${EIGEN3_USE_FILE}) endif(Eigen3_FOUND) @@ -37,15 +37,5 @@ subdirs(lib examples appli) ## == Installation commands include(${cpPlugins_INSTALL_FILE}) -## == Uninstall target -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" - IMMEDIATE @ONLY - ) -add_custom_target( - uninstall - COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) - ## eof - $RCSfile$ diff --git a/cmake/cpPlgUninstall.cmake.in b/cmake/cpPlgUninstall.cmake.in new file mode 100644 index 0000000..34c9330 --- /dev/null +++ b/cmake/cpPlgUninstall.cmake.in @@ -0,0 +1,27 @@ +## ========================================================================= +## @author Leonardo Florez-Valencia (florez-l@javeriana.edu.co) +## ========================================================================= + +if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") +endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + +file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") +foreach(file ${files}) + message(STATUS "Uninstalling $ENV{DESTDIR}${file}") + if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + exec_program( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + if(NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") + endif(NOT "${rm_retval}" STREQUAL 0) + else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") + message(STATUS "File $ENV{DESTDIR}${file} does not exist.") + endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") +endforeach(file) + +## eof - $RCSfile$ diff --git a/data/axial_CT_slice.bmp b/data/axial_CT_slice.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1ca6b3b38c38086d958ae8ae0f59659748e46cf1 GIT binary patch literal 66614 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ⅆQ{>vwG5yL<2c-sAW5+_~p)`<`9f?mm*kB%4x-x+xA7 zSvJ<&H*n9%WG2xUOD7~L7Ek0-gK;T;Vni%j@fGuT92#|+wXyczN%=~PZS+24_f_x27Zg~8*JFp`UzF2?PjV=LzV~X|< z^bK^yK&rDlnNr-ziK(z$HmOZbkkJ)xB1Ty)q6B7BiYyg#8F4HzR!GFhG$l0{>+J73 z8p{fa;hsc1Bc!_y?A>-j-d(bA&Z_NqAKI~D`>u6M7qqo4nzL-<&sR+Q1zI<@t=Q2! z)VY1*_S<*vT>Hl5Yq!05_s;d#U9)oQt!r0oxaG#1w(Z%zaeMo|-R+$R?ra}S9qsCD z-?@Fuwtf8_nN(&tA?9N}NthexIUFAuJldH;LVQFV5tBV#{TWs0>^`t_*Vc`z+pgU? zpwu6ZGM&AB@!_7XzP^29YBDw~7x~0g6hg}aj!Tq+!g+lv@JpWOXaMJdoR#x=Ac~ry z#D`U0JU);(*3}tLj^u=sof#1+Vk(gwx@*a`OXe@VVaeugx9;4rqqlGWmX)pSo)vff z>O|QKOWpjd*X%fwIM&`iIMjP!hwc>^wH*Q_Ge*L-)Yqsp#x@}ii-_VIv zZ~wq>K^V^FGqH}lcE!_))bV6m=YBSVSNOfoIxl+l5%+an< zckSA>W!a_^X*Si=4(~nEKA7z7jhz@Ms0G3BnO(KH2dS?Dix9?G^Py9SySBsRA}6LS zD58#4of9crAXLmqh0&qjcsi3l+0!Qj@x+KM3i$mN=b;H&@#}2jv zhF4s_GyV%N{6(&4&5$h?EM2y8!>+#WBe5dN$M$U6cA#VD@8S34&ebef-Yu>bK`I@CS>^Zb;SzFuU zn|^Wocg0H_gbQor-0N?;dBg7gd)hNmoy8Bfciz2y)5V93Bw{X=S0x#F^km=B7zoP|lf_It zk0FDZOa_&;L7A(9&ICzQ4U|v!4kZrk*|c%Z+V!iJuHD;yiJjl#8<+mH1?DVVIDh`a zB{wc!vu)RY{J^Z*yRUuUu5DZIxbyhX(BME%|FNzEM-J}Y6H7xjb#K`S1ElhaFf2+? z9ZQeobpxw1B&t?K8bW41YaqkM*n>vsbC1ZFAxOqDf`(BJ=mk4Kw(rW&P!LuMS)j?x zgNzkm7S}?Q1*p-e=)^9jL?DfvNSw?HBLbfYk#J;yL@WsTaPRK8=~m2iO5!k=N0||s zViogpiBg!#=2D5FBX`}g@uqc`OqE$Q@9OIowjA6GegBF%S6+Gb{JD$gFI%^5mpm0D zI=Xv0+V||<*D*9a*neox?tOdr_Z%6BCvt$)YLVkO-1mLABIgZ@j1>R`klBd&43Q$T zL#Y_JrkIlv3p|Hnn@M@-aUDsjA_)pn%m65U2vo;0az&!Z3N@gJJVAksRcu~HDh^Fu z2cjg%(vSevOfrcYv!~2NLJnL`^?}`Y4JxIIloMsB%g_)E4ssdQuR+xrKP#glzU`V+_Z?Z4xe zO*^)|xg#banK*t_uKJ!CdPu9fq97Lm^Erl!t}4Vb9N#eQaRwc(sE8USh1ArF0A+G6 zN0`F&un26cWFm=_9BLb?psOR2UesmP&{L3Bh*O=eaRE4vk`Z!30TCT|WhJSSB8l{P z&uBFwxv{SOhk7#9QACLVCEpT`P&ShjU8Y)&K~0nq+JC9lKVeDBFPPJI%{7bWT`{Mv zZSKPP3$9zdbj7MQH?G=#_~_t~qk{uOG8h{iOm^+wxpC$8{ksniE3D>vXJ&#*BLHI< z0F{hE%CjOQSd&zSpiKS9N0?Cs`mR(|s9Pm@5ultEN(q@FmE&v{=P@CwU9}4~D5wAx zgnYpm5n6YiWbCM>`}dutjB_MsQVAi2%j2F<;A+~YGH}6A*KiSx4)pKd)7h2ueW*LO z1+vhl*&Hxofe{_~fzk7_V#m^!hkTKXvHwL27p-{X`a9OYVfmU}9S85pj0uBrIXfKh z>)f$^%Z3ey2NDu8%k{E4>Nh z$(mBJi>abxOD02^F$t@b^YM_E)p*u)N3w;n;oelP2qn4RmAo9qG_|fjMc*l{09Y+qu!wJu>lpUFdhAvRwEjc8fB)>90=*KoMZRJP3 z_|1g@FmLXh<+paWuUWc!)BfHQV+H`4t_<{cAK12a{q94Dl0tcUYIbrq48o{Z^YtP! ze49fF`yf~HibaJ+WehPCCE(~`1LtMWBt=nyiq2HESSvvh8&J`8o=EB?QY&jl6)`NT z$VjJSDP=HA6-fBQ_s>o`7}>TTq~096XHX^%X3A(^$L=8(aAsra*xrueLtTmPj?TU5 z>a@eko-MPADT!X_hxMKx8~8HJX{Ej_e6b6(zRa6{&GPLB1`lspv!x>@$OOrNOGo$I zz5A}cod*TAi1L$-%IwVfW}y33&!@~{Ky^6ck-@;23RPULjnkYWYLu!z#{e-YCo8g~ zD45!Wcs8+Gjbk7|#z}dcW@J;-944k=A=`ToS5dXVniG$_r|uhABnYvQjzn@;ZOn#K zPO`V-SXKopb>YB{_WquZ*wC@T!*`8^k&Z~iQ=rT9vUy1d=a=vcH_FVv=Gs-ejt%$j z-nuWA(TYULDJZ>fSNow|okOxynY=fOSfzQY9x#&xlpxCo*eO9C7#Ip^+Yt~!wxc0h z30#5;8I{UX-sD75v>Xd**3?vFV9%DsoCZdd5``j;sKb>p6H6xt6&*}Yoqu<;*|dP^ zrgRm+L`)zc#%7ymOT8Vj>|i2;Y$o>HaiFJje{b*6*wNmcA!Z8R`N+4i`BT;Aa#(ut zR;@V~{l2!gwkxk*vUGi)q~!X$2jc}pQVYr6eRuBc8cZEMp_H6@bEX;b>3h#a$Y2&T zumnq5SPvbKh!DzYuO@RFGFw7Tk8na^d`Qt`RU!JAtm8(RVxj=%1ujbFbEce3LvD)_ zbreKJQJ3N)vRRvb;E}Twn7$W8!n*ea>*>2Kvi%=hz?bl8I@_t6thA)FXD2^ zvn5FoOA`R+H34H$g_w#K0|Rkdkb$D;ntwX9&x~VebMD^9kPM|E99Eg_5Z%-ggUNXN zj@5Sw`dG57KYnCzu=7w)Pse~Jf}_8}%uBNH%CTmK!nV1qHXm`vRZs*5 z1w&nX+qZAnzNZh`9;lpeRD+4POa;WQ)}z2R!n%`FsflY*K4TzcxejmLpJSM+j1iFv z0!6Ao2-ajVD+rWO6%iLp0uD<8P~{?3tw2Fe5x8UVF_u#-it2B9uuKRryjox|yB@&Q zXd-8oJpaA`h%!j#<@mlgwawqt-5)zKJa8=CeW3GTfA{8>rbE3VE>3(cW#r1XIZLiu zdh;7rZ`#?X!7Pw9*Ua^_w;$Yodv_eVtYTFrOF=X{>3EJ8O*O*+! z#2Duae$AlG`s8G8Aeok@BIea?HJ=_yB*w-D@1A$X+RdH)!%}Z|yyxhFS7h(c^Wy}# z7IWsdU9)E6#@jp7`QagzQaaXu_{fp&j+46IaGa`Dt6G$l%ghbSw(mKNyS9x?B5BN) z3s{5lsAzg6MmZ@En=vw`SQLjP8)6q4A=5NXMa;AFvO>!>L=A{N2nwR_nNyKo6bV6Z zJ^#oV8|DPf4a&f1&PK(NtYWAhmUMk|sHZ=D;z(T158S$8?Uv(%C(=g`{(SZOUz@p$ z=gnEPXwKa0x8Bu0m>$cWEC4w>aPUZCC>BRkjnIp#;Z(g6PBeYYkmnK0Q=^9OmT)mA zLt7D%LrFH1wLA&{A{JJPj?FE^N{VTDjfT&dZ4~pwwQFQpG#wXMHAg8k4U%e=hqdBR zo<@yF&dxB8U`28oQ_7fAw=&1G%+y8{ttiC@+I!=NyN3GvPaIDiJUX1dWcu&rb1@#$ zV&1ZaZF8=@ap|&M{rw3=RF$#VK+l2w-I7$qEO4nmJ|0d?RHvFVO~d7=5<*jPqLSrO zCKX5(7F29kIhJ)v1kk{oV-!}QB8zgXN^vwpWRKaH`4~YpqkD`f$crE#6pUHb(9@Ag z_{7`aTh&GzQvoc}$wp4X9FO)TgRq#v1gnY8U0YiR7rF%D;L(?ra9%OjESPi6@(t^@ zc4u><24H5OtFNzf;G~S~AaET6*F5Z;ZhCG|#Wts>&IGPaNGsXYw+X8HSk2pYtnwOF zT6b9HASyX*Oe_i+yNoa^+ZF?30{3Z25{nvlY(yDV1zJ_oz!}GBr7_)@eE07aQrdXc zuLh!B+B1MT96MPIEK!=YYp|ki!cr}Y0-O^y47~{GfzP2?qM}lpa%?5# z69Jf3Q7x#7qS?e@T!$qt2}noG5d{o1z?+UDF)A0RBiUii2hrOmr<>>1R9GSQgpb*Y z&AWl4Bt{^}(K13t?#RAfYi`^BvfAb4Gyli&y*XFTo4a_?RSRysSR_)$9f05-~0+sxxO5WS1w<8?VPqbt*FSHIrFbsys>9sNGitq$3XtX;qG{jAqZ`U z@M`4y9;eL5)SrlGwbq*bDP!3TA&TyJu45K0V#okl)rMnul|lmgx*m=L268&{kwu2_ z1S(Kg2AajZKv&dJowa0xV7zwkgYQ58;Je;F>zM>Ql~9z_anC?QYnN=!5pfJaY4o1H zn{PSta@M?JR&Kt1)0R!k7u|U6+^cU`wfO2AHnpErWr)N~J`)?t6r6A(v<)}HT4Sc< zVO4kTE!#oG*6SgtMFazYv18G%abC{QW4#vu5xqH)1OE;yMoEXJbbmTX6 z@9WQS?V7c>+;;1xO`8_Yzi#>JMN2of9~*{BK}?P06Y){Oo*fT8hd4wM{ib6pDi0e@ zHLUuWM?9Kz5GnSEIBZ=UOy&0BoK z$_+cWU3>Lab8lFF%ih6}5k(X-Cx_C4Sd`t0)AICfWC9pi(5lp?9Gz%Y2asmNsZLag zQ)`+Hyn^IGg0l=V#Ufu*Il<_&FyzBzk1$PtM2UT zOJ`G(Dy8GGM9vCq-zhi7ZHg7wW|3u9qA1dt1--IO>Tls*J=A$=GK8#F0!U@!oZz5h zGeVh139!|igG5myIBBJY2=NaoS{j@`2Ni3j82q z1;IR|_ zR?5t=y)w=_k>hd3qO*ZBQ}eLej8MH|qre?6XS2{R6BzJNU@}hD9XU_edw1k_ZnrD+d;)I6KXp&Y}A=y``j-z&NY2P8kO^*s$-m#q;J}yL#oa^#_k9B{4OSgPGCX$qYd%p|!~I7$Mb$ zqPZ>I)nL9IRDv`20<|{HcoEeqw&sS_M%}`$UG^Q@)@|F!NF}ETLeH^$9UvN&9m2fa z5Nb|A6&bL=D;8?_GV)G8eEz<(RgPgvWfce=$2K)0s^p(#rvIg^-@0awZ#044XgW?ta(zSb*i_RtYc)oQ zEX$mm7G#Vf5O~#UMWH^HJQ;Cb6pZnpZp%d_I?ZjuYo0pu=tF1E2A<6&OY%5qIe^4| zWx~}zl?@wKUAu7krmfrCWAT)blLSf5rUsML(NL)rRU^(UyE5sSR#*#4cGTn&4ZV`j zJilx+$oyF|2XXC8y&9RAD#*wqf*h|J_`a(6kz?oBj5CZC-^mq$B!Wg{O3ZhBMtJkS zsdqix^i819NCH-%$)%w8pK8u4<;p$nTi&>I#rj+K_GG0@Dmj`5=|MrxU{^OBWR)Gu z9S>^bjF9n0Gvw9NzJ?9J%VpcC8jc6-I_1sr>I0{I26aenfEkv-)V+=IX+5cXWiEjr zBt9@Bgxw%7Vcme(Mg*|>`FB3hDEpIMI_ojfovPe(-79_g-vGM@x;HLeuz3B>1ILm= zGMUQBh5jy;W6yJ2o!)l{FMDA%h=R%LICtukRg1b-dCJ4cqKE|3zE!zDG-hXf1Iuzy zQEggK$pkScnwp?tV(YR5WtG@2hPXQ^6e=nF=k`w*A}k+iLAbP z-HJt5FW=jLPdt{)YEn)f9vajr_sVuO?x-;IIOlx499628#U`g6?(oKhSM@pcJkh8& z0_05BX|-A9)(Dz08zrpbLp&*LqX`7c3=Y(`fg>iQZ~nJ9yV}zs^OKqbJI3= zYZb=;4kSTXtp$y#$oESs4yX|oLO+L_1}TkKgHjYxrUNc%!suv;a$ANF&p5c@R(OF; zImqt1l_p=DBG~8jfC`4Nf(qy5pQV z71qw2KON{0=SXAPbM3QDKMV>a@R2+w*;uVV6pS~fkzSu-Y7n&QzGoCkQ?Q4tmC3V# z%u9g^nE%p)r~fi6SiWS=b=wE>1#zTMl=DJtD5E--$j8ebt47r+&t~5A%(%+WR2iu@ z?>`&PMtY@QuFf<9-&6uD)$a?K;rY$8UJT5lw65qSj4I7qt!&CVHVI;3xy%9xit?~f zEl<^&0c~kXuigs(D_OjL)g8yvVo}LTs*)LwXCVk9M5%3K-zoWi6#AzosAx33Ad1Fq zZ*rztVw5=(p6gXCN0w&po0ujjeDLjM8N2DE?+0#S6j?5Hfr4yPf;g&MSa11|zFsvk z32b!oS3c6K$egx$+xH$#jfxlot&mG*6y!MdNQ16}a2OekOq?RjCu){Zzs87RpLy$K zRI5~+k`j%(yb?CX!*Ja8sXaZVYC$eWafyqH6Eqwbh`MK~I=~*Wxk)QC=SvY~otJg! z@YP}NiurHo8c2#6ftUnjM^5G~hr?39s6$kv?9s9_Gec#Qm7uC41rR%Eo^IBn`n~s7 zq{vnqlc&#|tyja6#ll*Hd(LpKiW$@^j@PKOl!Uoel2Z05TPuZ);LKU)vd){niY(u- zx3?!&KoA>Ph!2er&qJ6Iw-j1BGhhHc@RbwulC^EYmzp~9y)CY zvskSX=-GI3Iv}~6;rW<3V$q-_XaL`aMZjH{qP0rqry~1ng+*`bN~H$l3iBArkEBlu zwnbf^uqX;Vm+H2|s^=SFwQPr>?FP7fHlk(Ap03;VX2St;1$u^P&o*qQ zNGlxkoLmBW*{*nRIa4f@P15LotyuiCykU=^sG_8z638TyX-R?%m8&+j#~E@0F9`kW z?5SX)W>w$9VTHPp9lT}c{CzdNRG5 zr)Fcf+^CqL&6{pxri`gq@exqeqGE-CgDMu`0AnPQqWI4x+WlrY7*j0uWCA*Nx>snW zD+$m7#5HBaY!5-?pAKpLbT~0v8E@3XT0L~9@2xf(RmWuYDK9it&m6BeFe(QOL8CZ2 zN>87SjOlt^5p4u^|7ITYpOMZ!(IrAglvA;USjcHyQFT>Ssis;s)0pR-JL@~uFgg>^ zASgM$S9$nsr5;Yz3G}O#h~`yqs(gy7ei;G@D>;G8o-?Irst)h|NnwuHGAHv2gi>zw zMBgaXRT;KQN8nazE@;@6S(!f7th&f9k2g()TGhyAUg%Fw1yS89`JPgWkW4135kods zq`X5d$j+SyIq%ljvdu4Ls0h*mk_Ni_B@87}YL(ECRn6oMAqK0>&V*&6(eZ|3N1W8h zy=q8!(3q~(gW7aOGN%K`rt8cqW8~#>fdgr^j$ZotuXPf6O_p_G;GQfdsDMMmV1$~M zg9C=W>O^&F+}CAZ55kF%mBXkUmV6n{oSr>XZ`562Pu2jPZA|-Ksi??Kgbu&f?frRT zecAkIW^f=UW2_Vmp90P)D@P!xSd+6(E__RfG(W1;3FPDT5a6f|=-GPnzUgY{f$@jV zQq?>2NX;*2PlDfIK=xH5GX`X#@7PHIRH$R_J4}Zhqe)K3XV2BC>XmKTsQXb^M3^?b zj6z*L(PUHS8q}UrjWZ#opn587yt<0zZw^T<3PUFpXmeFTI!97b1da_NTf`GJCm0WG z&Vz`smU`_q>Ix>*sn>a<(YUYK6bnr88}xGXOJ9p%Rfru+5>E9(5#$gQ1WCgsKJF^m zu`o0tFP9yMhJnNVYB1ICbU^%5le07T-|tuCG3}mLTygld1y!;`$3_@;4aqF27>tQ3 z!z_$^(+!!9#38_0Iq+)ZK`Zos|F|dx3UGMi!81|Vc-e&V*FL!u1D!`D1~jA=DdY$k zEbvX;_WjUdp)G5O@QAR;38x60IPX|)!!1|M=jVQLQfRCEv%xU_rXTC=Fa=#9pcOOl}6`ZD(bj35W3Oy5;kozU10n7t#;UcZskh_j9coj5)xnE_+F8v|D#q_8u z#5z>;LIG;68j&(DdsLIOx&s_8Dq5**V&47R=-OQtu~snBL82rZP%a`}ma*$vV*)8_ zl3PK7Vz7S&tK6j-$UC0z5>-&JA`zErx+E()HXIj;g|dHHRi%HMNf#LswaK@`8jXBuBc<;XwyDk@xaKA!}F4L&l{{Pd9e-T!~#L - -namespace fpa -{ - namespace Common - { - namespace Image - { - /** - */ - template< class _TPath > - class PathReader - : public itk::ProcessObject - { - public: - // Basic types - typedef PathReader Self; - typedef itk::ProcessObject Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TPath TPath; - - public: - itkNewMacro( Self ); - itkTypeMacro( PathReader, itk::ProcessObject ); - - itkGetConstMacro( FileName, std::string ); - itkSetMacro( FileName, std::string ); - - public: - TPath* GetOutput( ); - TPath* GetOutput( unsigned int i ); - - virtual void GraftOutput( itk::DataObject* out ); - virtual void GraftOutput( - const typename Superclass::DataObjectIdentifierType& key, - itk::DataObject* out - ); - virtual void GraftNthOutput( unsigned int i, itk::DataObject* out ); - virtual itk::DataObject::Pointer MakeOutput( - itk::ProcessObject::DataObjectPointerArraySizeType i - ) override; - - virtual void Update( ) override - { this->GenerateData( ); } - - protected: - PathReader( ); - virtual ~PathReader( ); - - virtual void GenerateData( ) override; - - // Do nothing - virtual void GenerateOutputInformation( ) override - { } - - private: - // Purposely not implemented - PathReader( const Self& ); - void operator=( const Self& ); - - protected: - std::string m_FileName; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION -#endif // __fpa__Common__Image__PathReader__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Common/Image/PathReader.hxx b/lib/fpa/Common/Image/PathReader.hxx deleted file mode 100644 index e66af4f..0000000 --- a/lib/fpa/Common/Image/PathReader.hxx +++ /dev/null @@ -1,172 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__Common__Image__PathReader__hxx__ -#define __fpa__Common__Image__PathReader__hxx__ - -// ------------------------------------------------------------------------- -template< class _TPath > -_TPath* fpa::Common::Image::PathReader< _TPath >:: -GetOutput( ) -{ - return( - itkDynamicCastInDebugMode< TPath* >( this->GetPrimaryOutput( ) ) - ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -_TPath* fpa::Common::Image::PathReader< _TPath >:: -GetOutput( unsigned int i ) -{ - return( - itkDynamicCastInDebugMode< TPath* >( - this->itk::ProcessObject::GetOutput( i ) - ) - ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -void fpa::Common::Image::PathReader< _TPath >:: -GraftOutput( itk::DataObject* out ) -{ - this->GraftNthOutput( 0, out ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -void fpa::Common::Image::PathReader< _TPath >:: -GraftOutput( - const typename Superclass::DataObjectIdentifierType& key, - itk::DataObject* out - ) -{ - if( out == NULL ) - { - itkExceptionMacro( - << "Requested to graft output that is a NULL pointer" - ); - - } // fi - itk::DataObject* output = this->itk::ProcessObject::GetOutput( key ); - output->Graft( out ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -void fpa::Common::Image::PathReader< _TPath >:: -GraftNthOutput( unsigned int i, itk::DataObject* out ) -{ - if( i >= this->GetNumberOfIndexedOutputs( ) ) - { - itkExceptionMacro( - << "Requested to graft output " << i - << " but this filter only has " - << this->GetNumberOfIndexedOutputs( ) - << " indexed Outputs." - ); - - } // fi - this->GraftOutput( this->MakeNameFromOutputIndex( i ), out ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -itk::DataObject::Pointer fpa::Common::Image::PathReader< _TPath >:: -MakeOutput( itk::ProcessObject::DataObjectPointerArraySizeType i ) -{ - return( TPath::New( ).GetPointer( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -fpa::Common::Image::PathReader< _TPath >:: -PathReader( ) - : Superclass( ) -{ - typename TPath::Pointer out = - static_cast< TPath* >( this->MakeOutput( 0 ).GetPointer( ) ); - this->itk::ProcessObject::SetNumberOfRequiredInputs( 0 ); - this->itk::ProcessObject::SetNumberOfRequiredOutputs( 1 ); - this->itk::ProcessObject::SetNthOutput( 0, out.GetPointer( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -fpa::Common::Image::PathReader< _TPath >:: -~PathReader( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TPath > -void fpa::Common::Image::PathReader< _TPath >:: -GenerateData( ) -{ - std::string buffer; - std::ifstream file_stream( this->m_FileName.c_str( ) ); - if( !file_stream ) - { - itkExceptionMacro( - << "Error reading skeleton from \"" << this->m_FileName << "\"" - ); - return; - - } // fi - file_stream.seekg( 0, std::ios::end ); - buffer.reserve( ( unsigned int )( file_stream.tellg( ) ) ); - file_stream.seekg( 0, std::ios::beg ); - buffer.assign( - ( std::istreambuf_iterator< char >( file_stream ) ), - std::istreambuf_iterator< char >( ) - ); - file_stream.close( ); - - std::istringstream in( buffer ); - unsigned int dim; - in >> dim; - if( dim != TPath::Dimension ) - { - itkExceptionMacro( - << "Mismatched path dimension: " << dim - << " != " << TPath::Dimension - ); - return; - - } // fi - - // Read spatial parameters - typename TPath::TSpacing spa; - typename TPath::TDirection dir; - typename TPath::TPoint ori; - for( unsigned int d = 0; d < dim; ++d ) - in >> spa[ d ]; - for( unsigned int d = 0; d < dim; ++d ) - for( unsigned int e = 0; e < dim; ++e ) - in >> dir[ d ][ e ]; - for( unsigned int d = 0; d < dim; ++d ) - in >> ori[ d ]; - - // Read path - TPath* path = this->GetOutput( ); - path->SetSpacing( spa ); - path->SetOrigin( ori ); - path->SetDirection( dir ); - - unsigned long pathSize; - in >> pathSize; - for( unsigned long id = 0; id < pathSize; ++id ) - { - typename TPath::TIndex idx; - for( unsigned int d = 0; d < dim; ++d ) - in >> idx[ d ]; - path->AddVertex( idx ); - - } // rof -} - -#endif // __fpa__Common__Image__PathReader__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Common/Image/PathWriter.h b/lib/fpa/Common/Image/PathWriter.h deleted file mode 100644 index 621161e..0000000 --- a/lib/fpa/Common/Image/PathWriter.h +++ /dev/null @@ -1,69 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__Common__Image__PathWriter__h__ -#define __fpa__Common__Image__PathWriter__h__ - -#include - -namespace fpa -{ - namespace Common - { - namespace Image - { - /** - */ - template< class _TPath > - class PathWriter - : public itk::ProcessObject - { - public: - // Basic types - typedef PathWriter Self; - typedef itk::ProcessObject Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TPath TPath; - - public: - itkNewMacro( Self ); - itkTypeMacro( PathWriter, itk::ProcessObject ); - - itkGetConstMacro( FileName, std::string ); - itkSetMacro( FileName, std::string ); - - public: - const TPath* GetInput( ) const; - void SetInput( const TPath* path ); - virtual void Update( ) override; - - protected: - PathWriter( ); - virtual ~PathWriter( ); - - virtual void GenerateData( ) override; - - private: - // Purposely not implemented - PathWriter( const Self& ); - void operator=( const Self& ); - - protected: - std::string m_FileName; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION -#endif // __fpa__Common__Image__PathWriter__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Common/Image/PathWriter.hxx b/lib/fpa/Common/Image/PathWriter.hxx deleted file mode 100644 index fc3d840..0000000 --- a/lib/fpa/Common/Image/PathWriter.hxx +++ /dev/null @@ -1,111 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__Common__Image__PathWriter__hxx__ -#define __fpa__Common__Image__PathWriter__hxx__ - -#include - -// ------------------------------------------------------------------------- -template< class _TPath > -const _TPath* fpa::Common::Image::PathWriter< _TPath >:: -GetInput( ) const -{ - return( - dynamic_cast< const TPath* >( - this->itk::ProcessObject::GetInput( 0 ) - ) - ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -void fpa::Common::Image::PathWriter< _TPath >:: -SetInput( const _TPath* path ) -{ - this->itk::ProcessObject::SetNthInput( 0, const_cast< TPath* >( path ) ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -void fpa::Common::Image::PathWriter< _TPath >:: -Update( ) -{ - TPath* input = const_cast< TPath* >( this->GetInput( ) ); - if( input != NULL ) - { - input->UpdateOutputInformation( ); - input->UpdateOutputData( ); - this->GenerateData( ); - this->ReleaseInputs( ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TPath > -fpa::Common::Image::PathWriter< _TPath >:: -PathWriter( ) - : Superclass( ), - m_FileName( "" ) -{ - this->SetNumberOfRequiredInputs( 1 ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -fpa::Common::Image::PathWriter< _TPath >:: -~PathWriter( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TPath > -void fpa::Common::Image::PathWriter< _TPath >:: -GenerateData( ) -{ - const TPath* path = this->GetInput( ); - - // Write base information - std::stringstream out1, out2; - out1 << TPath::Dimension << std::endl; - typename TPath::TSpacing spa = path->GetSpacing( ); - for( unsigned int d = 0; d < TPath::Dimension; ++d ) - out1 << spa[ d ] << " "; - out1 << std::endl; - typename TPath::TDirection dir = path->GetDirection( ); - for( unsigned int d = 0; d < TPath::Dimension; ++d ) - for( unsigned int e = 0; e < TPath::Dimension; ++e ) - out1 << dir[ d ][ e ] << " "; - out1 << std::endl; - typename TPath::TPoint ori = path->GetOrigin( ); - for( unsigned int d = 0; d < TPath::Dimension; ++d ) - out1 << ori[ d ] << " "; - out1 << std::endl; - - // Write path - unsigned int size = path->GetSize( ); - out2 << size << std::endl; - for( unsigned int i = 0; i < path->GetSize( ); ++i ) - { - typename TPath::TIndex v = path->GetVertex( i ); - for( unsigned int d = 0; d < TPath::Dimension; ++d ) - out2 << v[ d ] << " "; - - } // rof - - // Real write - std::ofstream file_stream( this->m_FileName.c_str( ), std::ofstream::binary ); - if( !file_stream ) - itkExceptionMacro( - << "Unable to write skeleton to \"" - << this->m_FileName - << "\"" - ); - file_stream.write( out1.str( ).c_str( ), out1.str( ).size( ) ); -} - -#endif // __fpa__Common__Image__PathWriter__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Common/Image/SkeletonReader.h b/lib/fpa/Common/Image/SkeletonReader.h deleted file mode 100644 index cc64aae..0000000 --- a/lib/fpa/Common/Image/SkeletonReader.h +++ /dev/null @@ -1,85 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__Common__Image__SkeletonReader__h__ -#define __fpa__Common__Image__SkeletonReader__h__ - -#include - -namespace fpa -{ - namespace Common - { - namespace Image - { - /** - */ - template< class _TSkeleton > - class SkeletonReader - : public itk::ProcessObject - { - public: - // Basic types - typedef SkeletonReader Self; - typedef itk::ProcessObject Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TSkeleton TSkeleton; - - public: - itkNewMacro( Self ); - itkTypeMacro( SkeletonReader, itk::ProcessObject ); - - itkGetConstMacro( FileName, std::string ); - itkSetMacro( FileName, std::string ); - - public: - TSkeleton* GetOutput( ); - TSkeleton* GetOutput( unsigned int i ); - - virtual void GraftOutput( itk::DataObject* out ); - virtual void GraftOutput( - const typename Superclass::DataObjectIdentifierType& key, - itk::DataObject* out - ); - virtual void GraftNthOutput( unsigned int i, itk::DataObject* out ); - virtual itk::DataObject::Pointer MakeOutput( - itk::ProcessObject::DataObjectPointerArraySizeType i - ) override; - - virtual void Update( ) override - { this->GenerateData( ); } - - protected: - SkeletonReader( ); - virtual ~SkeletonReader( ); - - virtual void GenerateData( ) override; - - // Do nothing - virtual void GenerateOutputInformation( ) override - { } - - private: - // Purposely not implemented - SkeletonReader( const Self& ); - void operator=( const Self& ); - - protected: - std::string m_FileName; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION -#endif // __fpa__Common__Image__SkeletonReader__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Common/Image/SkeletonReader.hxx b/lib/fpa/Common/Image/SkeletonReader.hxx deleted file mode 100644 index ee886c5..0000000 --- a/lib/fpa/Common/Image/SkeletonReader.hxx +++ /dev/null @@ -1,208 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__Common__Image__SkeletonReader__hxx__ -#define __fpa__Common__Image__SkeletonReader__hxx__ - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -_TSkeleton* fpa::Common::Image::SkeletonReader< _TSkeleton >:: -GetOutput( ) -{ - return( - itkDynamicCastInDebugMode< TSkeleton* >( this->GetPrimaryOutput( ) ) - ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -_TSkeleton* fpa::Common::Image::SkeletonReader< _TSkeleton >:: -GetOutput( unsigned int i ) -{ - return( - itkDynamicCastInDebugMode< TSkeleton* >( - this->itk::ProcessObject::GetOutput( i ) - ) - ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -void fpa::Common::Image::SkeletonReader< _TSkeleton >:: -GraftOutput( itk::DataObject* out ) -{ - this->GraftNthOutput( 0, out ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -void fpa::Common::Image::SkeletonReader< _TSkeleton >:: -GraftOutput( - const typename Superclass::DataObjectIdentifierType& key, - itk::DataObject* out - ) -{ - if( out == NULL ) - { - itkExceptionMacro( - << "Requested to graft output that is a NULL pointer" - ); - - } // fi - itk::DataObject* output = this->itk::ProcessObject::GetOutput( key ); - output->Graft( out ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -void fpa::Common::Image::SkeletonReader< _TSkeleton >:: -GraftNthOutput( unsigned int i, itk::DataObject* out ) -{ - if( i >= this->GetNumberOfIndexedOutputs( ) ) - { - itkExceptionMacro( - << "Requested to graft output " << i - << " but this filter only has " - << this->GetNumberOfIndexedOutputs( ) - << " indexed Outputs." - ); - - } // fi - this->GraftOutput( this->MakeNameFromOutputIndex( i ), out ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -itk::DataObject::Pointer -fpa::Common::Image::SkeletonReader< _TSkeleton >:: -MakeOutput( itk::ProcessObject::DataObjectPointerArraySizeType i ) -{ - return( TSkeleton::New( ).GetPointer( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -fpa::Common::Image::SkeletonReader< _TSkeleton >:: -SkeletonReader( ) - : Superclass( ) -{ - typename TSkeleton::Pointer out = - static_cast< TSkeleton* >( this->MakeOutput( 0 ).GetPointer( ) ); - this->itk::ProcessObject::SetNumberOfRequiredInputs( 0 ); - this->itk::ProcessObject::SetNumberOfRequiredOutputs( 1 ); - this->itk::ProcessObject::SetNthOutput( 0, out.GetPointer( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -fpa::Common::Image::SkeletonReader< _TSkeleton >:: -~SkeletonReader( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -void fpa::Common::Image::SkeletonReader< _TSkeleton >:: -GenerateData( ) -{ - typedef typename TSkeleton::TPath _TPath; - typedef typename _TPath::TIndex _TIndex; - typedef typename _TPath::TSpacing _TSpacing; - typedef typename _TPath::TPoint _TPoint; - typedef typename _TPath::TDirection _TDirection; - - std::string buffer; - std::ifstream file_stream( this->m_FileName.c_str( ) ); - if( !file_stream ) - { - itkExceptionMacro( - << "Error reading skeleton from \"" << this->m_FileName << "\"" - ); - return; - - } // fi - file_stream.seekg( 0, std::ios::end ); - buffer.reserve( ( unsigned int )( file_stream.tellg( ) ) ); - file_stream.seekg( 0, std::ios::beg ); - buffer.assign( - ( std::istreambuf_iterator< char >( file_stream ) ), - std::istreambuf_iterator< char >( ) - ); - file_stream.close( ); - - std::istringstream in( buffer ); - unsigned int dim; - in >> dim; - if( dim != TSkeleton::Dimension ) - { - itkExceptionMacro( - << "Mismatched skeletons dimension: " << dim - << " != " << TSkeleton::Dimension - ); - return; - - } // fi - - // Read spatial parameters - _TSpacing spa; - _TDirection dir; - _TPoint ori; - for( unsigned int d = 0; d < dim; ++d ) - in >> spa[ d ]; - for( unsigned int d = 0; d < dim; ++d ) - for( unsigned int e = 0; e < dim; ++e ) - in >> dir[ d ][ e ]; - for( unsigned int d = 0; d < dim; ++d ) - in >> ori[ d ]; - - // Read end-points, just to ignore - unsigned int n; - in >> n; - for( unsigned int i = 0; i < n; ++i ) - { - _TIndex idx; - for( unsigned int d = 0; d < dim; ++d ) - in >> idx[ d ]; - - } // rof - - // Read bifurcations, just to ignore - in >> n; - for( unsigned int i = 0; i < n; ++i ) - { - _TIndex idx; - for( unsigned int d = 0; d < dim; ++d ) - in >> idx[ d ]; - - } // rof - - // Read paths - TSkeleton* out = this->GetOutput( ); - unsigned int nPaths; - in >> nPaths; - for( unsigned int p = 0; p < nPaths; ++p ) - { - typename _TPath::Pointer path = _TPath::New( ); - path->SetSpacing( spa ); - path->SetOrigin( ori ); - path->SetDirection( dir ); - - unsigned long pathSize; - in >> pathSize; - for( unsigned long id = 0; id < pathSize; ++id ) - { - _TIndex idx; - for( unsigned int d = 0; d < dim; ++d ) - in >> idx[ d ]; - path->AddVertex( idx ); - - } // rof - out->AddBranch( path ); - - } // rof -} - -#endif // __fpa__Common__Image__SkeletonReader__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Common/Image/SkeletonWriter.h b/lib/fpa/Common/Image/SkeletonWriter.h deleted file mode 100644 index 6348daf..0000000 --- a/lib/fpa/Common/Image/SkeletonWriter.h +++ /dev/null @@ -1,74 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__Common__Image__SkeletonWriter__h__ -#define __fpa__Common__Image__SkeletonWriter__h__ - -#include - -namespace fpa -{ - namespace Common - { - namespace Image - { - /** - */ - template< class _TSkeleton > - class SkeletonWriter - : public itk::ProcessObject - { - public: - // Basic types - typedef SkeletonWriter Self; - typedef itk::ProcessObject Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TSkeleton TSkeleton; - typedef typename TSkeleton::TEdges TEdges; - typedef typename TSkeleton::TMatrix TMatrix; - typedef typename TSkeleton::TMatrixRow TMatrixRow; - typedef typename TSkeleton::TPath TPath; - typedef typename TSkeleton::TVertex TVertex; - - public: - itkNewMacro( Self ); - itkTypeMacro( SkeletonWriter, itk::ProcessObject ); - - itkGetConstMacro( FileName, std::string ); - itkSetMacro( FileName, std::string ); - - public: - const TSkeleton* GetInput( ) const; - void SetInput( const TSkeleton* skeleton ); - virtual void Update( ) override; - - protected: - SkeletonWriter( ); - virtual ~SkeletonWriter( ); - - virtual void GenerateData( ) override; - - private: - // Purposely not implemented - SkeletonWriter( const Self& ); - void operator=( const Self& ); - - protected: - std::string m_FileName; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION -#endif // __fpa__Common__Image__SkeletonWriter__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Common/Image/SkeletonWriter.hxx b/lib/fpa/Common/Image/SkeletonWriter.hxx deleted file mode 100644 index 4f392ed..0000000 --- a/lib/fpa/Common/Image/SkeletonWriter.hxx +++ /dev/null @@ -1,161 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__Common__Image__SkeletonWriter__hxx__ -#define __fpa__Common__Image__SkeletonWriter__hxx__ - -#include - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -const _TSkeleton* fpa::Common::Image::SkeletonWriter< _TSkeleton >:: -GetInput( ) const -{ - return( - dynamic_cast< const TSkeleton* >( - this->itk::ProcessObject::GetInput( 0 ) - ) - ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -void fpa::Common::Image::SkeletonWriter< _TSkeleton >:: -SetInput( const _TSkeleton* skeleton ) -{ - this->itk::ProcessObject::SetNthInput( - 0, const_cast< TSkeleton* >( skeleton ) - ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -void fpa::Common::Image::SkeletonWriter< _TSkeleton >:: -Update( ) -{ - TSkeleton* input = const_cast< TSkeleton* >( this->GetInput( ) ); - if( input != NULL ) - { - input->UpdateOutputInformation( ); - input->UpdateOutputData( ); - this->GenerateData( ); - this->ReleaseInputs( ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -fpa::Common::Image::SkeletonWriter< _TSkeleton >:: -SkeletonWriter( ) - : Superclass( ), - m_FileName( "" ) -{ - this->SetNumberOfRequiredInputs( 1 ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -fpa::Common::Image::SkeletonWriter< _TSkeleton >:: -~SkeletonWriter( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -void fpa::Common::Image::SkeletonWriter< _TSkeleton >:: -GenerateData( ) -{ - const TSkeleton* sk = this->GetInput( ); - typename TMatrix::const_iterator mIt = sk->BeginEdgesRows( ); - typename TMatrixRow::const_iterator rIt = mIt->second.begin( ); - typename TEdges::const_iterator eIt = rIt->second.begin( ); - const TPath* path = *eIt; - - // Write base information - std::stringstream out1, out2; - out1 << TSkeleton::Dimension << std::endl; - typename TPath::TSpacing spa = path->GetSpacing( ); - for( unsigned int d = 0; d < TSkeleton::Dimension; ++d ) - out1 << spa[ d ] << " "; - out1 << std::endl; - typename TPath::TDirection dir = path->GetDirection( ); - for( unsigned int d = 0; d < TSkeleton::Dimension; ++d ) - for( unsigned int e = 0; e < TSkeleton::Dimension; ++e ) - out1 << dir[ d ][ e ] << " "; - out1 << std::endl; - typename TPath::TPoint ori = path->GetOrigin( ); - for( unsigned int d = 0; d < TSkeleton::Dimension; ++d ) - out1 << ori[ d ] << " "; - out1 << std::endl; - - // End points - std::vector< TVertex > end_points = sk->GetEndPoints( ); - out1 << end_points.size( ) << std::endl; - typename std::vector< TVertex >::const_iterator epIt = end_points.begin( ); - for( ; epIt != end_points.end( ); ++epIt ) - { - for( unsigned int d = 0; d < TSkeleton::Dimension; ++d ) - out1 << ( *epIt )[ d ] << " "; - out1 << std::endl; - - } // rof - - // Bifurcations - std::vector< TVertex > bifurcations = sk->GetBifurcations( ); - out1 << bifurcations.size( ) << std::endl; - typename std::vector< TVertex >::const_iterator bIt = bifurcations.begin( ); - for( ; bIt != bifurcations.end( ); ++bIt ) - { - for( unsigned int d = 0; d < TSkeleton::Dimension; ++d ) - out1 << ( *bIt )[ d ] << " "; - out1 << std::endl; - - } // rof - - // Write paths - unsigned long pathCount = 0; - mIt = sk->BeginEdgesRows( ); - for( ; mIt != sk->EndEdgesRows( ); ++mIt ) - { - typename TMatrixRow::const_iterator rIt = mIt->second.begin( ); - for( ; rIt != mIt->second.end( ); ++rIt ) - { - typename TEdges::const_iterator eIt = rIt->second.begin( ); - for( ; eIt != rIt->second.end( ); ++eIt ) - { - TPath* path = *eIt; - pathCount++; - unsigned int size = path->GetSize( ); - out2 << size << std::endl; - for( unsigned int i = 0; i < path->GetSize( ); ++i ) - { - TVertex v = path->GetVertex( i ); - for( unsigned int d = 0; d < TSkeleton::Dimension; ++d ) - out2 << v[ d ] << " "; - - } // rof - out2 << std::endl; - - } // rof - - } // rof - - } // rof - out1 << pathCount << std::endl << out2.str( ); - - // Real write - std::ofstream file_stream( this->m_FileName.c_str( ), std::ofstream::binary ); - if( !file_stream ) - itkExceptionMacro( - << "Unable to write skeleton to \"" - << this->m_FileName - << "\"" - ); - file_stream.write( out1.str( ).c_str( ), out1.str( ).size( ) ); -} - -#endif // __fpa__Common__Image__SkeletonWriter__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/Common/OriginalRandomWalker.h b/lib/fpa/Common/RandomWalker.h similarity index 86% rename from lib/fpa/Common/OriginalRandomWalker.h rename to lib/fpa/Common/RandomWalker.h index 0c3a9f8..6a4afa5 100644 --- a/lib/fpa/Common/OriginalRandomWalker.h +++ b/lib/fpa/Common/RandomWalker.h @@ -2,8 +2,8 @@ // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= -#ifndef __fpa__Common__OriginalRandomWalker__h__ -#define __fpa__Common__OriginalRandomWalker__h__ +#ifndef __fpa__Common__RandomWalker__h__ +#define __fpa__Common__RandomWalker__h__ #include #include @@ -20,7 +20,7 @@ namespace fpa /** */ template< class _TImage, class _TLabels, class _TScalar = float > - class OriginalRandomWalker + class RandomWalker : public itk::ImageToImageFilter< _TImage, _TLabels > { public: @@ -28,7 +28,7 @@ namespace fpa typedef _TLabels TLabels; typedef _TScalar TScalar; - typedef OriginalRandomWalker Self; + typedef RandomWalker Self; typedef itk::ImageToImageFilter< TImage, TLabels > Superclass; typedef itk::SmartPointer< Self > Pointer; typedef itk::SmartPointer< const Self > ConstPointer; @@ -68,7 +68,7 @@ namespace fpa public: itkNewMacro( Self ); itkTypeMacro( - fpa::Common::OriginalRandomWalker, itk::ImageToImageFilter + fpa::Common::RandomWalker, itk::ImageToImageFilter ); itkGetConstObjectMacro( EdgeFunction, TEdgeFunction ); @@ -78,14 +78,9 @@ namespace fpa fpaFilterInputMacro( InputLabels, TLabels ); fpaFilterOutputMacro( OutputProbabilities, TScalarImage ); - /* TODO - public: - void AddSeed( const TIndex& seed, const TLabel& label ); - */ - protected: - OriginalRandomWalker( ); - virtual ~OriginalRandomWalker( ); + RandomWalker( ); + virtual ~RandomWalker( ); virtual void GenerateData( ) override; @@ -155,17 +150,11 @@ namespace fpa private: // Purposely not implemented - OriginalRandomWalker( const Self& other ); + RandomWalker( const Self& other ); Self& operator=( const Self& other ); protected: - /* TODO - std::vector< TIndex > m_Seeds; - std::vector< TLabel > m_Labels; - */ - typename TEdgeFunction::Pointer m_EdgeFunction; - itk::SimpleFastMutexLock m_Mutex; }; @@ -174,7 +163,7 @@ namespace fpa } // ecapseman #ifndef ITK_MANUAL_INSTANTIATION -# include +# include #endif // ITK_MANUAL_INSTANTIATION -#endif // __fpa__Common__OriginalRandomWalker__h__ +#endif // __fpa__Common__RandomWalker__h__ // eof - $RCSfile$ diff --git a/lib/fpa/Common/OriginalRandomWalker.hxx b/lib/fpa/Common/RandomWalker.hxx similarity index 90% rename from lib/fpa/Common/OriginalRandomWalker.hxx rename to lib/fpa/Common/RandomWalker.hxx index 2d3dc73..a798735 100644 --- a/lib/fpa/Common/OriginalRandomWalker.hxx +++ b/lib/fpa/Common/RandomWalker.hxx @@ -2,29 +2,19 @@ // @author Leonardo Florez Valencia // @email florez-l@javeriana.edu.co // ========================================================================= -#ifndef __fpa__Common__OriginalRandomWalker__hxx__ -#define __fpa__Common__OriginalRandomWalker__hxx__ +#ifndef __fpa__Common__RandomWalker__hxx__ +#define __fpa__Common__RandomWalker__hxx__ #include #include -#include - -// ------------------------------------------------------------------------- -/* TODO - template< class _TImage, class _TLabels, class _TScalar > - void fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: - AddSeed( const TIndex& seed, const TLabel& label ) - { - this->m_Seeds.push_back( seed ); - this->m_Labels.push_back( label ); - this->Modified( ); - } -*/ +#ifdef USE_Eigen3 +# include +#endif // USE_Eigen3 // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > -fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: -OriginalRandomWalker( ) +fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: +RandomWalker( ) : Superclass( ) { fpaFilterInputConfigureMacro( InputLabels, TLabels ); @@ -33,16 +23,17 @@ OriginalRandomWalker( ) // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > -fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: -~OriginalRandomWalker( ) +fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: +~RandomWalker( ) { } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > -void fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +void fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: GenerateData( ) { +#ifdef USE_Eigen3 // Useful typedefs typedef Eigen::Triplet< TScalar > _TTriplet; typedef std::vector< _TTriplet > _TTriplets; @@ -133,13 +124,15 @@ GenerateData( ) // Fill outputs itkDebugMacro( << "Filling output..." ); this->_Output( x, St, invLabels ); +#endif // USE_Eigen3 } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > -_TScalar fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +_TScalar fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _L( const TIndex& i, const TIndex& j ) { +#ifdef USE_Eigen3 if( i == j ) { TRegion r = this->GetInput( )->GetRequestedRegion( ); @@ -160,14 +153,18 @@ _L( const TIndex& i, const TIndex& j ) } else return( -( this->m_EdgeFunction->Evaluate( i, j ) ) ); +#else // USE_Eigen3 + return( _TScalar( 0 ) ); +#endif // USE_Eigen3 } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > template< class _TTriplets > -void fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +void fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _Boundary( _TTriplets& B, std::map< TLabel, unsigned long >& labels ) { +#ifdef USE_Eigen3 B.clear( ); // Set up the multithreaded processing @@ -190,15 +187,17 @@ _Boundary( _TTriplets& B, std::map< TLabel, unsigned long >& labels ) // Execute threader threads->SingleMethodExecute( ); +#endif // USE_Eigen3 } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > template< class _TTriplets > ITK_THREAD_RETURN_TYPE -fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _BoundaryCbk( void* arg ) { +#ifdef USE_Eigen3 _TBoundaryThreadStruct* thrStr; itk::ThreadIdType total, thrId, thrCount; itk::MultiThreader::ThreadInfoStruct* thrInfo = @@ -215,19 +214,21 @@ _BoundaryCbk( void* arg ) reinterpret_cast< _TTriplets* >( thrStr->Triplets ), thrStr->Labels ); +#endif // USE_Eigen3 return( ITK_THREAD_RETURN_VALUE ); } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > template< class _TTriplets > -void fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +void fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _ThreadedBoundary( const TRegion& region, const itk::ThreadIdType& id, _TTriplets* B, std::map< TLabel, unsigned long >* labels ) { +#ifdef USE_Eigen3 typedef itk::ImageRegionConstIteratorWithIndex< TLabels > _TIt; typedef typename std::map< TLabel, unsigned long >::value_type _TMapValue; typedef typename std::map< unsigned long, TLabel >::value_type _TInvValue; @@ -250,14 +251,16 @@ _ThreadedBoundary( } // fi } // rof +#endif // USE_Eigen3 } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > template< class _TTriplets > -void fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +void fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _Laplacian( _TTriplets& A, _TTriplets& R, const _TTriplets& B ) { +#ifdef USE_Eigen3 A.clear( ); R.clear( ); @@ -282,15 +285,17 @@ _Laplacian( _TTriplets& A, _TTriplets& R, const _TTriplets& B ) // Execute threader threads->SingleMethodExecute( ); +#endif // USE_Eigen3 } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > template< class _TTriplets > ITK_THREAD_RETURN_TYPE -fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _LaplacianCbk( void* arg ) { +#ifdef USE_Eigen3 _TLaplacianThreadStruct* thrStr; itk::ThreadIdType total, thrId, thrCount; itk::MultiThreader::ThreadInfoStruct* thrInfo = @@ -308,18 +313,20 @@ _LaplacianCbk( void* arg ) reinterpret_cast< _TTriplets* >( thrStr->R ), reinterpret_cast< const _TTriplets* >( thrStr->B ) ); +#endif // USE_Eigen3 return( ITK_THREAD_RETURN_VALUE ); } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > template< class _TTriplets > -void fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +void fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _ThreadedLaplacian( const TRegion& region, const itk::ThreadIdType& id, _TTriplets* A, _TTriplets* R, const _TTriplets* B ) { +#ifdef USE_Eigen3 typedef itk::ImageRegionConstIteratorWithIndex< TImage > _TIt; typedef typename _TTriplets::value_type _TTriplet; @@ -383,16 +390,18 @@ _ThreadedLaplacian( } // rof } // rof +#endif // USE_Eigen3 } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > template< class _TMatrix, class _TTriplets > -void fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +void fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _Output( const _TMatrix& X, const _TTriplets& S, const std::vector< TLabel >& invLabels ) { +#ifdef USE_Eigen3 // Set up the multithreaded processing _TOutputThreadStruct thrStr; thrStr.Filter = this; @@ -416,15 +425,17 @@ _Output( // Execute threader threads->SingleMethodExecute( ); +#endif // USE_Eigen3 } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > template< class _TMatrix, class _TTriplets > ITK_THREAD_RETURN_TYPE -fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _OutputCbk( void* arg ) { +#ifdef USE_Eigen3 _TOutputThreadStruct* thrStr; itk::ThreadIdType total, thrId, thrCount; itk::MultiThreader::ThreadInfoStruct* thrInfo = @@ -442,19 +453,21 @@ _OutputCbk( void* arg ) reinterpret_cast< const _TTriplets* >( thrStr->S ), thrStr->InvLabels ); +#endif // USE_Eigen3 return( ITK_THREAD_RETURN_VALUE ); } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > template< class _TMatrix, class _TTriplets > -void fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +void fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _ThreadedOutput( const TRegion& region, const itk::ThreadIdType& id, const _TMatrix* X, const _TTriplets* S, const std::vector< TLabel >* invLabels ) { +#ifdef USE_Eigen3 // Fill outputs const TLabels* in_labels = this->GetInputLabels( ); TLabels* out_labels = this->GetOutput( ); @@ -496,12 +509,13 @@ _ThreadedOutput( } // fi } // rof +#endif // USE_Eigen3 } // ------------------------------------------------------------------------- template< class _TImage, class _TLabels, class _TScalar > unsigned long -fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _1D( const TIndex& idx, const TRegion& region ) { unsigned long i = idx[ 0 ]; @@ -520,7 +534,7 @@ _1D( const TIndex& idx, const TRegion& region ) template< class _TImage, class _TLabels, class _TScalar > template< class _TTriplets > unsigned long -fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _SeedIndex( const unsigned long& i, const _TTriplets& t ) { unsigned long s = 0; @@ -546,7 +560,7 @@ _SeedIndex( const unsigned long& i, const _TTriplets& t ) template< class _TImage, class _TLabels, class _TScalar > template< class _TTriplets > unsigned long -fpa::Common::OriginalRandomWalker< _TImage, _TLabels, _TScalar >:: +fpa::Common::RandomWalker< _TImage, _TLabels, _TScalar >:: _NearSeedIndex( const unsigned long& i, const _TTriplets& t ) { long s = 0; @@ -569,5 +583,6 @@ _NearSeedIndex( const unsigned long& i, const _TTriplets& t ) return( i - d ); } -#endif // __fpa__Common__OriginalRandomWalker__hxx__ +#endif // __fpa__Common__RandomWalker__hxx__ + // eof - $RCSfile$ diff --git a/lib/fpa/Config.h.in b/lib/fpa/Config.h.in index f93fb23..0e2f039 100644 --- a/lib/fpa/Config.h.in +++ b/lib/fpa/Config.h.in @@ -4,8 +4,8 @@ #ifndef __fpa__Config__h__ #define __fpa__Config__h__ +#include #include -#include #if @Eigen3_FOUND@ == 1 # define USE_Eigen3 @@ -24,71 +24,5 @@ typedef __t__::TInternalTraits::TSeeds TSeeds; \ typedef __t__::TInternalTraits::TVertex TVertex -// ------------------------------------------------------------------------- -#define fpaFilterInputMacro( __n__, __t__ ) \ - private: \ - unsigned int m_##__n__##Idx; \ - public: \ - __t__* Get##__n__( ) \ - { \ - return( \ - dynamic_cast< __t__* >( \ - this->itk::ProcessObject::GetInput( \ - this->m_##__n__##Idx \ - ) ) ); \ - } \ - const __t__* Get##__n__( ) const \ - { \ - return( \ - dynamic_cast< const __t__* >( \ - this->itk::ProcessObject::GetInput( \ - this->m_##__n__##Idx \ - ) ) ); \ - } \ - void Set##__n__( const __t__* i ) \ - { \ - this->itk::ProcessObject::SetNthInput( \ - this->m_##__n__##Idx, \ - const_cast< __t__* >( i ) \ - ); \ - } - -// ------------------------------------------------------------------------- -#define fpaFilterInputConfigureMacro( __n__, __t__ ) \ - this->m_##__n__##Idx = this->GetNumberOfRequiredInputs( ); \ - this->itk::ProcessObject::SetNumberOfRequiredInputs( \ - this->m_##__n__##Idx + 1 \ - ) - -// ------------------------------------------------------------------------- -#define fpaFilterOutputMacro( __n__, __t__ ) \ - private: \ - unsigned int m_##__n__##Idx; \ - public: \ - __t__* Get##__n__( ) \ - { \ - return( \ - dynamic_cast< __t__* >( \ - this->itk::ProcessObject::GetOutput( \ - this->m_##__n__##Idx \ - ) ) ); \ - } \ - const __t__* Get##__n__( ) const \ - { \ - return( \ - dynamic_cast< const __t__* >( \ - this->itk::ProcessObject::GetOutput( \ - this->m_##__n__##Idx \ - ) ) ); \ - } - -// ------------------------------------------------------------------------- -#define fpaFilterOutputConfigureMacro( __n__, __t__ ) \ - this->m_##__n__##Idx = this->GetNumberOfRequiredOutputs( ); \ - this->itk::ProcessObject::SetNumberOfRequiredOutputs( \ - this->m_##__n__##Idx + 1 \ - ); \ - this->SetNthOutput( this->m_##__n__##Idx, __t__::New( ) ) - #endif // __fpa__Config__h__ // eof - $RCSfile$ diff --git a/lib/fpa/DataStructures/Graph.h b/lib/fpa/DataStructures/Graph.h deleted file mode 100644 index 76a617a..0000000 --- a/lib/fpa/DataStructures/Graph.h +++ /dev/null @@ -1,167 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__DataStructures__Graph__h__ -#define __fpa__DataStructures__Graph__h__ - -#include -#include -#include -#include -#include - -namespace fpa -{ - namespace DataStructures - { - /** \brief A generic graph with templated index types. - * - * @param _TVertex Vertex type. - * @param _TCost Cost type. - * @param _TIndex Index type (it should be a strict weak ordering type). - */ - template< class _TVertex, class _TCost, class _TIndex = unsigned long, class _TIndexCompare = std::less< _TIndex > > - class Graph - : public itk::DataObject - { - public: - typedef Graph Self; - typedef itk::DataObject Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TVertex TVertex; - typedef _TCost TCost; - typedef _TIndex TIndex; - typedef _TIndexCompare TIndexCompare; - - // Base types - typedef std::map< TIndex, TVertex, TIndexCompare > TVertices; - typedef std::vector< TCost > TEdges; - typedef std::map< TIndex, TEdges, TIndexCompare > TMatrixRow; - typedef std::map< TIndex, TMatrixRow, TIndexCompare > TMatrix; - - public: - itkNewMacro( Self ); - itkTypeMacro( Graph, itk::DataObject ); - - public: - /*! \brief Iterators over vertices. - * These allow you to iterate over all of graph's vertices. - * - * Typical iteration should be done as: - * - * TGraph g; - * ... - * TGraph::TVertices::[const_]iterator vIt = g.BeginVertices( ); - * for( ; vIt != g.EndVertices( ); ++vIt ) - * { - * vIt->first; --> this is the vertex's index <-- - * vIt->second; --> this is the vertex's value <-- - * } - */ - inline typename TVertices::iterator BeginVertices( ) - { return( this->m_Vertices.begin( ) ); } - inline typename TVertices::iterator EndVertices( ) - { return( this->m_Vertices.end( ) ); } - inline typename TVertices::const_iterator BeginVertices( ) const - { return( this->m_Vertices.begin( ) ); } - inline typename TVertices::const_iterator EndVertices( ) const - { return( this->m_Vertices.end( ) ); } - - /*! \brief Iterators over edges. - * These allow you to iterate over all of graph's edges. - * - * Typical iteration should be done as: - * - * TGraph g; - * ... - * TGraph::TMatrix::[const_]iterator mIt = g.BeginEdgesRows( ); - * for( ; mIt != g.EndEdgesRows( ); ++mIt ) - * { - * mIt->first; --> this is the row index. <-- - * TGraph::TMatrixRow::[const_]iterator rIt = mIt->second.begin( ); - * for( ; rIt != mIt->second.end( ); ++rIt ) - * { - * rIt->first; --> this is the column index. - * TGraph::TEdges::[const_]iterator eIt = rIt->second.begin( ); - * for( ; eIt != rIt->second.end( ); ++eIt ) - * *eIt; --> this is the cost between mIt->first and rIt->first - * } - * } - */ - inline typename TMatrix::iterator BeginEdgesRows( ) - { return( this->m_Matrix.begin( ) ); } - inline typename TMatrix::iterator EndEdgetsRows( ) - { return( this->m_Matrix.end( ) ); } - inline typename TMatrix::const_iterator BeginEdgesRows( ) const - { return( this->m_Matrix.begin( ) ); } - inline typename TMatrix::const_iterator EndEdgesRows( ) const - { return( this->m_Matrix.end( ) ); } - - /*! \brief Clear all vertices and edges. - */ - void Clear( ); - - /*! \brief Clear all edges. - */ - inline void ClearEdges( ) - { this->m_Matrix.clear( ); } - - /*! \brief Vertex manipulation methods. - * Names are self-explanatory. - */ - inline bool HasVertexIndex( const TIndex& i ) const - { return( this->m_Vertices.find( i ) != this->m_Vertices.end( ) ); } - inline void SetVertex( const TIndex& index, TVertex& vertex ) - { this->m_Vertices[ index ] = vertex; } - inline TVertex& GetVertex( const TIndex& index ) - { return( this->m_Vertices[ index ] ); } - inline const TVertex& GetVertex( const TIndex& index ) const - { return( this->m_Vertices[ index ] ); } - bool RenameVertex( const TIndex& old_index, const TIndex& new_index ); - void RemoveVertex( const TIndex& index ); - - /*! \brief Edge manipulation methods. - * Names are self-explanatory. - */ - inline void AddEdge( const TIndex& orig, const TIndex& dest, const TCost& cost ) - { this->m_Matrix[ orig ][ dest ].push_back( cost ); } - TEdges& GetEdges( const TIndex& orig, const TIndex& dest ); - const TEdges& GetEdges( const TIndex& orig, const TIndex& dest ) const; - bool HasEdge( const TIndex& orig, const TIndex& dest ) const; - void RemoveEdge( const TIndex& orig, const TIndex& dest, const TCost& cost ); - void RemoveEdges( const TIndex& orig, const TIndex& dest ); - - /*! \brief Returns graph's sinks. - * - * A sink is a special vertex which does not have any "exiting" edges. - * - * @return Sinks ordered by their index. - */ - std::set< TIndex, TIndexCompare > GetSinks( ) const; - - protected: - Graph( ); - virtual ~Graph( ); - - private: - // Purposely not implemented - Graph( const Self& other ); - Self& operator=( const Self& other ); - - protected: - TVertices m_Vertices; - TMatrix m_Matrix; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION -#endif // __fpa__DataStructures__Graph__h__ -// eof - $RCSfile$ diff --git a/lib/fpa/DataStructures/Graph.hxx b/lib/fpa/DataStructures/Graph.hxx deleted file mode 100644 index 4d348d5..0000000 --- a/lib/fpa/DataStructures/Graph.hxx +++ /dev/null @@ -1,270 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__DataStructures__Graph__hxx__ -#define __fpa__DataStructures__Graph__hxx__ - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -void fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -Clear( ) -{ - this->m_Vertices.clear( ); - this->m_Matrix.clear( ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -bool fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -RenameVertex( const TIndex& old_index, const TIndex& new_index ) -{ - typename TVertices::iterator old_v = this->m_Vertices.find( old_index ); - typename TVertices::iterator new_v = this->m_Vertices.find( new_index ); - if( old_v != this->m_Vertices.end( ) && new_v == this->m_Vertices.end( ) ) - { - // Replace vertex - this->m_Vertices[ new_index ] = old_v->second; - this->m_Vertices.erase( old_index ); - - // Duplicate edges - typename TMatrix::iterator mIt = this->m_Matrix.begin( ); - typename TMatrix::iterator found_row = this->m_Matrix.end( ); - for( ; mIt != this->m_Matrix.end( ); ++mIt ) - { - if( mIt->first == old_index ) - found_row = mIt; - - typename TMatrixRow::iterator rIt = mIt->second.begin( ); - for( ; rIt != mIt->second.end( ); ++rIt ) - { - if( mIt->first == old_index ) - this->m_Matrix[ new_index ][ rIt->first ] = rIt->second; - else if( rIt->first == old_index ) - this->m_Matrix[ mIt->first ][ new_index ] = rIt->second; - - } // rof - - } // rof - - // Delete old edges - if( found_row != this->m_Matrix.end( ) ) - this->m_Matrix.erase( found_row ); - - mIt = this->m_Matrix.begin( ); - for( ; mIt != this->m_Matrix.end( ); ++mIt ) - { - typename TMatrixRow::iterator rIt = mIt->second.begin( ); - while( rIt != mIt->second.end( ) ) - { - if( rIt->first == old_index ) - { - mIt->second.erase( rIt ); - rIt = mIt->second.begin( ); - } - else - ++rIt; - - } // elihw - - } // rof - return( true ); - } - else - return( false ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -void fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -RemoveVertex( const TIndex& index ) -{ - typename TVertices::iterator i = this->m_Vertices.find( index ); - if( i != this->m_Vertices.end( ) ) - { - // Delete vertex - this->m_Vertices.erase( i ); - - // Delete edges starting from given vertex - typename TMatrix::iterator mIt = this->m_Matrix.find( index ); - if( mIt != this->m_Matrix.end( ) ) - this->m_Matrix.erase( mIt ); - - // Delete edges arriving to given vertex - mIt = this->m_Matrix.begin( ); - for( ; mIt != this->m_Matrix.end( ); ++mIt ) - { - typename TMatrixRow::iterator rIt = mIt->second.begin( ); - while( rIt != mIt->second.end( ) ) - { - if( rIt->first == index ) - { - mIt->second.erase( rIt ); - rIt = mIt->second.begin( ); - } - else - ++rIt; - - } // elihw - - } // rof - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -typename -fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -TEdges& -fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -GetEdges( const TIndex& orig, const TIndex& dest ) -{ - static TEdges null_edges; - typename TMatrix::iterator o = this->m_Matrix.find( orig ); - if( o != this->m_Matrix.find( orig ) ) - { - typename TMatrixRow::iterator d = o->second.find( dest ); - if( d == o->second.end( ) ) - { - null_edges.clear( ); - return( null_edges ); - } - else - return( d->second ); - } - else - { - null_edges.clear( ); - return( null_edges ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -const typename -fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -TEdges& -fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -GetEdges( const TIndex& orig, const TIndex& dest ) const -{ - static const TEdges null_edges; - typename TMatrix::iterator o = this->m_Matrix.find( orig ); - if( o != this->m_Matrix.find( orig ) ) - { - typename TMatrixRow::iterator d = o->second.find( dest ); - if( d == o->second.end( ) ) - return( null_edges ); - else - return( d->second ); - } - else - return( null_edges ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -bool fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -HasEdge( const TIndex& orig, const TIndex& dest ) const -{ - typename TMatrix::const_iterator mIt = this->m_Matrix.find( orig ); - if( mIt != this->m_Matrix.end( ) ) - return( mIt->second.find( dest ) != mIt->second.end( ) ); - else - return( false ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -void fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -RemoveEdge( const TIndex& orig, const TIndex& dest, const TCost& cost ) -{ - typename TMatrix::iterator m = this->m_Matrix.find( orig ); - if( m != this->m_Matrix.end( ) ) - { - typename TMatrixRow::iterator r = m->second.find( dest ); - if( r != m->second.end( ) ) - { - typename TEdges::iterator e = r->second.end( ); - for( - typename TEdges::iterator i = r->second.begin( ); - i != r->second.end( ) && e == r->second.end( ); - ++i - ) - if( *i == cost ) - e = i; - if( e != r->second.end( ) ) - { - r->second.erase( e ); - if( r->second.size( ) == 0 ) - { - m->second.erase( r ); - if( m->second.size( ) == 0 ) - this->m_Matrix.erase( m ); - - } // fi - - } // fi - - } // fi - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -void fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -RemoveEdges( const TIndex& orig, const TIndex& dest ) -{ - typename TMatrix::iterator m = this->m_Matrix.find( orig ); - if( m != this->m_Matrix.end( ) ) - { - typename TMatrixRow::iterator r = m->second.find( dest ); - if( r != m->second.end( ) ) - { - m->second.erase( r ); - if( m->second.size( ) == 0 ) - this->m_Matrix.erase( m ); - - } // fi - - } // fi - -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -std::set< _TIndex, _TIndexCompare > -fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -GetSinks( ) const -{ - std::set< _TIndex, _TIndexCompare > sinks; - - typename TVertices::iterator vIt = this->m_Vertices.begin( ); - for( ; vIt != this->m_Vertices.end( ); ++vIt ) - sinks.insert( vIt->first ); - typename TMatrix::iterator mIt = this->m_Matrix.begin( ); - for( ; mIt != this->m_Matrix.end( ); ++mIt ) - sinks.erase( mIt->first ); - - return( sinks ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -Graph( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _TCost, class _TIndex, class _TIndexCompare > -fpa::DataStructures::Graph< _TVertex, _TCost, _TIndex, _TIndexCompare >:: -~Graph( ) -{ -} - -#endif // __fpa__DataStructures__Graph__hxx__ -// eof - $RCSfile$ diff --git a/lib/fpa/DataStructures/Image/MinimumSpanningTree.h b/lib/fpa/DataStructures/Image/MinimumSpanningTree.h deleted file mode 100644 index 5adcbad..0000000 --- a/lib/fpa/DataStructures/Image/MinimumSpanningTree.h +++ /dev/null @@ -1,77 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__DataStructures__Image__MinimumSpanningTree__h__ -#define __fpa__DataStructures__Image__MinimumSpanningTree__h__ - -#include -#include -#include - -namespace fpa -{ - namespace DataStructures - { - namespace Image - { - /** - */ - template< unsigned int _VDim > - class MinimumSpanningTree - : public fpa::DataStructures::MinimumSpanningTree< itk::Index< _VDim >, itk::Image< itk::Offset< _VDim >, _VDim > > - { - public: - typedef itk::Index< _VDim > TVertex; - typedef itk::Image< itk::Offset< _VDim >, _VDim > TDataStructuresImage; - - typedef MinimumSpanningTree Self; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - typedef fpa::DataStructures::MinimumSpanningTree< TVertex, TDataStructuresImage > Superclass; - - typedef typename Superclass::TCollision TCollision; - typedef typename Superclass::TCollisionsRow TCollisionsRow; - typedef typename Superclass::TCollisions TCollisions; - typedef typename Superclass::TVertices TVertices; - - typedef fpa::DataStructures::Image::Path< _VDim > TPath; - - public: - itkNewMacro( Self ); - itkTypeMacro( - fpa::DataStructures::Image::MinimumSpanningTree, - fpa::DataStructures::MinimumSpanningTree - ); - - public: - virtual TVertex GetParent( const TVertex& v ) const override; - virtual void SetParent( const TVertex& v, const TVertex& p ) override; - - void GetPath( typename TPath::Pointer& path, const TVertex& a ) const; - void GetPath( - typename TPath::Pointer& path, - const TVertex& a, const TVertex& b - ) const; - - protected: - MinimumSpanningTree( ); - virtual ~MinimumSpanningTree( ); - - private: - MinimumSpanningTree( const Self& other ); - Self& operator=( const Self& other ); - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION -#endif // __fpa__DataStructures__Image__MinimumSpanningTree__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/DataStructures/Image/MinimumSpanningTree.hxx b/lib/fpa/DataStructures/Image/MinimumSpanningTree.hxx deleted file mode 100644 index 29a547c..0000000 --- a/lib/fpa/DataStructures/Image/MinimumSpanningTree.hxx +++ /dev/null @@ -1,71 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__DataStructures__Image__MinimumSpanningTree__hxx__ -#define __fpa__DataStructures__Image__MinimumSpanningTree__hxx__ - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -typename fpa::DataStructures::Image::MinimumSpanningTree< _VDim >:: -TVertex fpa::DataStructures::Image::MinimumSpanningTree< _VDim >:: -GetParent( const TVertex& v ) const -{ - return( v + this->GetPixel( v ) ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::MinimumSpanningTree< _VDim >:: -SetParent( const TVertex& v, const TVertex& p ) -{ - this->SetPixel( v, p - v ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::MinimumSpanningTree< _VDim >:: -GetPath( typename TPath::Pointer& path, const TVertex& a ) const -{ - TVertices v = this->GetAxis( a ); - if( path.IsNull( ) ) - path = TPath::New( ); - path->SetReferenceImage( this ); - typename TVertices::const_iterator vIt = v.begin( ); - for( ; vIt != v.end( ); ++vIt ) - path->AddVertex( *vIt ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::MinimumSpanningTree< _VDim >:: -GetPath( - typename TPath::Pointer& path, const TVertex& a, const TVertex& b - ) const -{ - TVertices v = this->GetAxis( a, b ); - if( path.IsNull( ) ) - path = TPath::New( ); - path->SetReferenceImage( this ); - typename TVertices::const_iterator vIt = v.begin( ); - for( ; vIt != v.end( ); ++vIt ) - path->AddVertex( *vIt ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -fpa::DataStructures::Image::MinimumSpanningTree< _VDim >:: -MinimumSpanningTree( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -fpa::DataStructures::Image::MinimumSpanningTree< _VDim >:: -~MinimumSpanningTree( ) -{ -} - -#endif // __fpa__DataStructures__Image__MinimumSpanningTree__hxx__ -// eof - $RCSfile$ diff --git a/lib/fpa/DataStructures/Image/Path.h b/lib/fpa/DataStructures/Image/Path.h deleted file mode 100644 index 3194f90..0000000 --- a/lib/fpa/DataStructures/Image/Path.h +++ /dev/null @@ -1,104 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__DataStructures__Image__Path__h__ -#define __fpa__DataStructures__Image__Path__h__ - -#include -#include - -namespace fpa -{ - namespace DataStructures - { - namespace Image - { - /** - */ - template< unsigned int _VDim > - class Path - : public itk::PolyLineParametricPath< _VDim > - { - public: - typedef Path Self; - typedef itk::PolyLineParametricPath< _VDim > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - itkStaticConstMacro( Dimension, unsigned int, _VDim ); - - typedef itk::ImageBase< _VDim > TImageBase; - typedef typename TImageBase::SpacingType TSpacing; - typedef typename TImageBase::PointType TPoint; - typedef typename TImageBase::DirectionType TDirection; - typedef typename Superclass::ContinuousIndexType TContinuousIndex; - typedef typename TContinuousIndex::IndexType TIndex; - - public: - itkNewMacro( Self ); - itkTypeMacro( Path, itk::PolyLineParametricPath ); - - itkGetConstReferenceMacro( Spacing, TSpacing ); - itkGetConstReferenceMacro( Origin, TPoint ); - itkGetConstReferenceMacro( Direction, TDirection ); - itkGetConstReferenceMacro( InverseDirection, TDirection ); - - itkSetMacro( Origin, TPoint ); - - public: - unsigned long GetSize( ) const; - TContinuousIndex GetContinuousVertex( unsigned long i ) const; - TIndex GetVertex( unsigned long i ) const; - TPoint GetPoint( unsigned long i ) const; - - virtual void SetSpacing( const TSpacing& spac ); - virtual void SetSpacing( const double spac[ _VDim ] ); - virtual void SetSpacing( const float spac[ _VDim ] ); - virtual void SetOrigin( const double ori[ _VDim ] ); - virtual void SetOrigin( const float ori[ _VDim ] ); - virtual void SetDirection( const TDirection& dir ); - - template< class _TRefImage > - inline void SetReferenceImage( const _TRefImage* image ) - { - this->SetSpacing( image->GetSpacing( ) ); - this->SetOrigin( image->GetOrigin( ) ); - this->SetDirection( image->GetDirection( ) ); - } - - virtual void Graft( itk::DataObject* o ); - - protected: - Path( ); - virtual ~Path( ); - - virtual void _ComputeIndexToPhysicalPointMatrices( ); - - private: - // Purposely not implemented - Path( const Self& other ); - Self& operator=( const Self& other ); - - protected: - TSpacing m_Spacing; - TPoint m_Origin; - TDirection m_Direction; - TDirection m_InverseDirection; - TDirection m_IndexToPhysicalPoint; - TDirection m_PhysicalPointToIndex; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__DataStructures__Image__Path__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/DataStructures/Image/Path.hxx b/lib/fpa/DataStructures/Image/Path.hxx deleted file mode 100644 index 7fc32cf..0000000 --- a/lib/fpa/DataStructures/Image/Path.hxx +++ /dev/null @@ -1,215 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= - -#ifndef __fpa__DataStructures__Image__Path__hxx__ -#define __fpa__DataStructures__Image__Path__hxx__ - -#include -#include - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -unsigned long fpa::DataStructures::Image::Path< _VDim >:: -GetSize( ) const -{ - return( this->GetVertexList( )->Size( ) ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -typename fpa::DataStructures::Image::Path< _VDim >:: -TContinuousIndex fpa::DataStructures::Image::Path< _VDim >:: -GetContinuousVertex( unsigned long i ) const -{ - return( this->GetVertexList( )->GetElement( i ) ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -typename fpa::DataStructures::Image::Path< _VDim >:: -TIndex fpa::DataStructures::Image::Path< _VDim >:: -GetVertex( unsigned long i ) const -{ - TContinuousIndex cidx = this->GetContinuousVertex( i ); - TIndex idx; - for( unsigned int d = 0; d < _VDim; ++d ) - idx[ d ] = cidx[ d ]; - return( idx ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -typename fpa::DataStructures::Image::Path< _VDim >:: -TPoint fpa::DataStructures::Image::Path< _VDim >:: -GetPoint( unsigned long i ) const -{ - typedef typename TPoint::CoordRepType _TCoordRep; - TPoint pnt; - TContinuousIndex idx = this->GetVertex( i ); - for( unsigned int r = 0; r < _VDim; ++r ) - { - _TCoordRep sum = itk::NumericTraits< _TCoordRep >::ZeroValue( ); - for( unsigned int c = 0; c < _VDim; ++c ) - sum += this->m_IndexToPhysicalPoint( r, c ) * idx[ c ]; - pnt[ r ] = sum + this->m_Origin[ r ]; - - } // rof - return( pnt ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::Path< _VDim >:: -SetSpacing( const TSpacing& spac ) -{ - if( this->m_Spacing != spac ) - { - this->m_Spacing = spac; - this->_ComputeIndexToPhysicalPointMatrices( ); - this->Modified( ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::Path< _VDim >:: -SetSpacing( const double spac[ _VDim ] ) -{ - this->SetSpacing( TSpacing( spac ) ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::Path< _VDim >:: -SetSpacing( const float spac[ _VDim ] ) -{ - TSpacing s; - for( unsigned int d = 0; d < _VDim; ++d ) - s[ d ] = spac[ d ]; - this->SetSpacing( s ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::Path< _VDim >:: -SetOrigin( const double ori[ _VDim ] ) -{ - this->SetOrigin( TPoint( ori ) ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::Path< _VDim >:: -SetOrigin( const float ori[ _VDim ] ) -{ - this->SetOrigin( TPoint( ori ) ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::Path< _VDim >:: -SetDirection( const TDirection& dir ) -{ - bool modified = false; - for( unsigned int r = 0; r < _VDim; r++ ) - { - for( unsigned int c = 0; c < _VDim; c++ ) - { - if( - itk::Math::NotExactlyEquals( - this->m_Direction[ r ][ c ], dir[ r ][ c ] - ) - ) - { - this->m_Direction[ r ][ c ] = dir[ r ][ c ]; - modified = true; - } // fi - - } // rof - - } // rof - if( modified ) - { - this->_ComputeIndexToPhysicalPointMatrices( ); - this->m_InverseDirection = this->m_Direction.GetInverse( ); - this->Modified( ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::Path< _VDim >:: -Graft( itk::DataObject* o ) -{ - this->Superclass::Graft( o ); - Self* other = dynamic_cast< Self* >( o ); - if( other != NULL ) - { - this->m_DefaultInputStepSize = other->m_DefaultInputStepSize; - this->Initialize( ); - for( unsigned long i = 0; i < other->GetSize( ); ++i ) - this->AddVertex( other->GetContinuousVertex( i ) ); - this->m_Spacing = other->m_Spacing; - this->m_Origin = other->m_Origin; - this->m_Direction = other->m_Direction; - this->m_InverseDirection = other->m_InverseDirection; - this->m_IndexToPhysicalPoint = other->m_IndexToPhysicalPoint; - this->m_PhysicalPointToIndex = other->m_PhysicalPointToIndex; - - } // fi -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -fpa::DataStructures::Image::Path< _VDim >:: -Path( ) - : Superclass( ) -{ - this->m_Spacing.Fill( 1.0 ); - this->m_Origin.Fill( 0.0 ); - this->m_Direction.SetIdentity( ); - this->m_InverseDirection.SetIdentity( ); - this->m_IndexToPhysicalPoint.SetIdentity( ); - this->m_PhysicalPointToIndex.SetIdentity( ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -fpa::DataStructures::Image::Path< _VDim >:: -~Path( ) -{ -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::Path< _VDim >:: -_ComputeIndexToPhysicalPointMatrices( ) -{ - TDirection scale; - scale.Fill( 0.0 ); - for( unsigned int i = 0; i < _VDim; i++ ) - { - if( this->m_Spacing[ i ] == 0.0 ) - itkExceptionMacro( - "A spacing of 0 is not allowed: Spacing is " << this->m_Spacing - ); - scale[ i ][ i ] = this->m_Spacing[ i ]; - - } // rof - - if( vnl_determinant( this->m_Direction.GetVnlMatrix( ) ) == 0.0 ) - itkExceptionMacro( - << "Bad direction, determinant is 0. Direction is " - << this->m_Direction - ); - this->m_IndexToPhysicalPoint = this->m_Direction * scale; - this->m_PhysicalPointToIndex = this->m_IndexToPhysicalPoint.GetInverse( ); - this->Modified( ); -} - -#endif // __fpa__DataStructures__Image__Path__hxx__ -// eof - $RCSfile$ diff --git a/lib/fpa/DataStructures/Image/Skeleton.h b/lib/fpa/DataStructures/Image/Skeleton.h deleted file mode 100644 index f51295a..0000000 --- a/lib/fpa/DataStructures/Image/Skeleton.h +++ /dev/null @@ -1,68 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__DataStructures__Image__Skeleton__h__ -#define __fpa__DataStructures__Image__Skeleton__h__ - -#include -#include -#include - -namespace fpa -{ - namespace DataStructures - { - namespace Image - { - /** - */ - template< unsigned int _VDim > - class Skeleton - : public fpa::DataStructures::Graph< typename fpa::DataStructures::Image::Path< _VDim >::TIndex, typename fpa::DataStructures::Image::Path< _VDim >::Pointer, typename fpa::DataStructures::Image::Path< _VDim >::TIndex, typename fpa::DataStructures::Image::Path< _VDim >::TIndex::LexicographicCompare > - { - public: - typedef fpa::DataStructures::Image::Path< _VDim > TPath; - typedef typename TPath::TIndex TIndex; - typedef typename TIndex::LexicographicCompare TIndexCompare; - typedef typename TPath::Pointer TPathPointer; - - itkStaticConstMacro( Dimension, unsigned int, _VDim ); - - typedef fpa::DataStructures::Graph< TIndex, TPathPointer, TIndex, TIndexCompare > Superclass; - typedef Skeleton Self; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - public: - itkNewMacro( Self ); - itkTypeMacro( Skeleton, fpa::Image::Graph ); - - public: - void AddBranch( TPath* path ); - const TPath* GetBranch( const TIndex& a, const TIndex& b ) const; - - std::vector< TIndex > GetEndPoints( ) const; - std::vector< TIndex > GetBifurcations( ) const; - - protected: - Skeleton( ); - virtual ~Skeleton( ); - - private: - // Purposely not implemented - Skeleton( const Self& other ); - Self& operator=( const Self& other ); - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION -#endif // __fpa__DataStructures__Image__Skeleton__h__ -// eof - $RCSfile$ diff --git a/lib/fpa/DataStructures/Image/Skeleton.hxx b/lib/fpa/DataStructures/Image/Skeleton.hxx deleted file mode 100644 index c3316da..0000000 --- a/lib/fpa/DataStructures/Image/Skeleton.hxx +++ /dev/null @@ -1,98 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__DataStructures__Image__Skeleton__hxx__ -#define __fpa__DataStructures__Image__Skeleton__hxx__ - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -void fpa::DataStructures::Image::Skeleton< _VDim >:: -AddBranch( TPath* path ) -{ - // Check inputs - if( path == NULL ) - return; - unsigned long size = path->GetSize( ); - if( size == 0 ) - return; - TIndex a = path->GetVertex( 0 ); - TIndex b = path->GetVertex( size - 1 ); - if( this->HasEdge( a, b ) ) - return; - - // Add path - this->SetVertex( a, a ); - this->SetVertex( b, b ); - this->AddEdge( a, b, path ); - this->AddEdge( b, a, path ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -const typename fpa::DataStructures::Image::Skeleton< _VDim >:: -TPath* fpa::DataStructures::Image::Skeleton< _VDim >:: -GetBranch( const TIndex& a, const TIndex& b ) const -{ - static const TPath* null_path = NULL; - if( this->HasEdge( a, b ) ) - return( this->GetEdges( a, b ).front( ) ); - else - return( null_path ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -std::vector< typename fpa::DataStructures::Image::Skeleton< _VDim >::TIndex > -fpa::DataStructures::Image::Skeleton< _VDim >:: -GetEndPoints( ) const -{ - std::vector< TIndex > res; - typename Superclass::TMatrix::const_iterator mIt = this->BeginEdgesRows( ); - for( ; mIt != this->EndEdgesRows( ); ++mIt ) - { - unsigned long count = mIt->second.size( ); - if( count == 1 ) - res.push_back( mIt->first ); - - } // rof - return( res ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -std::vector< typename fpa::DataStructures::Image::Skeleton< _VDim >::TIndex > -fpa::DataStructures::Image::Skeleton< _VDim >:: -GetBifurcations( ) const -{ - std::vector< TIndex > res; - typename Superclass::TMatrix::const_iterator mIt = this->BeginEdgesRows( ); - for( ; mIt != this->EndEdgesRows( ); ++mIt ) - { - unsigned long count = mIt->second.size( ); - if( count > 1 ) - res.push_back( mIt->first ); - - } // rof - return( res ); -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -fpa::DataStructures::Image::Skeleton< _VDim >:: -Skeleton( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< unsigned int _VDim > -fpa::DataStructures::Image::Skeleton< _VDim >:: -~Skeleton( ) -{ -} - -#endif // __fpa__DataStructures__Image__Skeleton__hxx__ - -// eof - $RCSfile$ diff --git a/lib/fpa/DataStructures/MinimumSpanningTree.h b/lib/fpa/DataStructures/MinimumSpanningTree.h deleted file mode 100644 index 7d6ce1d..0000000 --- a/lib/fpa/DataStructures/MinimumSpanningTree.h +++ /dev/null @@ -1,74 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__DataStructures__MinimumSpanningTree__h__ -#define __fpa__DataStructures__MinimumSpanningTree__h__ - -#include - -namespace fpa -{ - namespace DataStructures - { - /** - */ - template< class _TVertex, class _Superclass > - class MinimumSpanningTree - : public _Superclass - { - public: - typedef MinimumSpanningTree Self; - typedef _Superclass Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef _TVertex TVertex; - typedef std::pair< TVertex, bool > TCollision; - typedef std::vector< TCollision > TCollisionsRow; - typedef std::vector< TCollisionsRow > TCollisions; - typedef std::vector< TVertex > TVertices; - - protected: - typedef std::vector< unsigned long > _TRow; - typedef std::vector< _TRow > _TMatrix; - - public: - itkTypeMacro( fpa::Base::MinimumSpanningTree, _Superclass ); - - public: - const TCollisions& GetCollisions( ) const; - void SetCollisions( const TCollisions& collisions ); - - void ClearSeeds( ); - void AddSeed( const TVertex& seed, unsigned long fId ); - - virtual TVertex GetParent( const TVertex& v ) const = 0; - virtual void SetParent( const TVertex& v, const TVertex& p ) = 0; - - virtual TVertices GetAxis( const TVertex& a ) const; - virtual TVertices GetAxis( const TVertex& a, const TVertex& b ) const; - - protected: - MinimumSpanningTree( ); - virtual ~MinimumSpanningTree( ); - - private: - MinimumSpanningTree( const Self& other ); - Self& operator=( const Self& other ); - - protected: - TCollisions m_Collisions; - _TMatrix m_FrontPaths; - std::vector< TVertex > m_Seeds; - }; - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION -#endif // __fpa__DataStructures__MinimumSpanningTree__h__ -// eof - $RCSfile$ diff --git a/lib/fpa/DataStructures/MinimumSpanningTree.hxx b/lib/fpa/DataStructures/MinimumSpanningTree.hxx deleted file mode 100644 index c7083d9..0000000 --- a/lib/fpa/DataStructures/MinimumSpanningTree.hxx +++ /dev/null @@ -1,236 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__DataStructures__MinimumSpanningTree__hxx__ -#define __fpa__DataStructures__MinimumSpanningTree__hxx__ - -// ------------------------------------------------------------------------- -template< class _TVertex, class _Superclass > -const typename fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -TCollisions& fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -GetCollisions( ) const -{ - return( this->m_Collisions ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _Superclass > -void fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -SetCollisions( const TCollisions& collisions ) -{ - static const unsigned long _inf = - std::numeric_limits< unsigned long >::max( ); - if( this->m_Collisions == collisions ) - return; - - this->m_Collisions = collisions; - - // Prepare a front graph - unsigned long N = this->m_Collisions.size( ); - _TMatrix dist( N, _TRow( N, _inf ) ); - this->m_FrontPaths = dist; - for( unsigned long i = 0; i < N; ++i ) - { - for( unsigned long j = 0; j < N; ++j ) - { - if( this->m_Collisions[ i ][ j ].second ) - { - dist[ i ][ j ] = 1; - dist[ j ][ i ] = 1; - this->m_FrontPaths[ i ][ j ] = j; - this->m_FrontPaths[ j ][ i ] = i; - - } // fi - - } // rof - dist[ i ][ i ] = 0; - this->m_FrontPaths[ i ][ i ] = i; - - } // rof - - // Use Floyd-Warshall to compute all possible paths between fronts - for( unsigned long k = 0; k < N; ++k ) - { - for( unsigned long i = 0; i < N; ++i ) - { - for( unsigned long j = 0; j < N; ++j ) - { - // WARNING: you don't want a numeric overflow!!! - unsigned long dik = dist[ i ][ k ]; - unsigned long dkj = dist[ k ][ j ]; - unsigned long sum = _inf; - if( dik < _inf && dkj < _inf ) - sum = dik + dkj; - - // Ok, continue Floyd-Warshall - if( sum < dist[ i ][ j ] ) - { - dist[ i ][ j ] = sum; - this->m_FrontPaths[ i ][ j ] = this->m_FrontPaths[ i ][ k ]; - - } // fi - - } // rof - - } // rof - - } // rof - this->m_Seeds.resize( N ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _Superclass > -void fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -ClearSeeds( ) -{ - this->m_Seeds.clear( ); - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _Superclass > -void fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -AddSeed( const _TVertex& seed, unsigned long fId ) -{ - this->m_Seeds[ fId - 1 ] = seed; - this->Modified( ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _Superclass > -typename fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -TVertices fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -GetAxis( const _TVertex& a ) const -{ - TVertices vertices; - _TVertex it = a; - _TVertex p = this->GetParent( it ); - while( it != p ) - { - vertices.push_back( it ); - it = p; - p = this->GetParent( it ); - - } // elihw - vertices.push_back( it ); - return( vertices ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _Superclass > -typename fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -TVertices fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -GetAxis( const _TVertex& a, const _TVertex& b ) const -{ - static const unsigned long _inf = - std::numeric_limits< unsigned long >::max( ); - - TVertices vertices; - TVertices pa = this->GetAxis( a ); - TVertices pb = this->GetAxis( b ); - if( pa.size( ) > 0 && pb.size( ) > 0 ) - { - // Find front identifiers - unsigned long ia = _inf, ib = _inf; - unsigned long N = this->m_Seeds.size( ); - for( unsigned long i = 0; i < N; ++i ) - { - if( this->m_Seeds[ i ] == pa[ pa.size( ) - 1 ] ) - ia = i; - if( this->m_Seeds[ i ] == pb[ pb.size( ) - 1 ] ) - ib = i; - - } // rof - - // Check if there is a front-jump between given seeds - if( ia != ib ) - { - // Compute front path - std::vector< long > fpath; - fpath.push_back( ia ); - while( ia != ib ) - { - ia = this->m_FrontPaths[ ia ][ ib ]; - fpath.push_back( ia ); - - } // elihw - - // Continue only if both fronts are connected - unsigned int N = fpath.size( ); - if( N > 0 ) - { - // First path: from start vertex to first collision - vertices = this->GetAxis( - a, this->m_Collisions[ fpath[ 0 ] ][ fpath[ 1 ] ].first - ); - - // Intermediary paths - for( unsigned int i = 1; i < N - 1; ++i ) - { - TVertices ipath = - this->GetAxis( - this->m_Collisions[ fpath[ i - 1 ] ][ fpath[ i ] ].first, - this->m_Collisions[ fpath[ i + 1 ] ][ fpath[ i ] ].first - ); - for( long id = 0; id < ipath.size( ); ++id ) - vertices.push_back( ipath[ id ] ); - - } // rof - - // Final path: from last collision to end point - TVertices lpath = - this->GetAxis( - this->m_Collisions[ fpath[ N - 1 ] ][ fpath[ N - 2 ] ].first, b - ); - for( long id = 0; id < lpath.size( ); ++id ) - vertices.push_back( lpath[ id ] ); - - } // fi - } - else - { - // Ignore common part: find common ancestor - long aIt = pa.size( ) - 1; - long bIt = pb.size( ) - 1; - bool cont = true; - while( aIt >= 0 && bIt >= 0 && cont ) - { - cont = ( pa[ aIt ] == pb[ bIt ] ); - aIt--; - bIt--; - - } // elihw - aIt++; - bIt++; - - // Glue both parts - for( long cIt = 0; cIt <= aIt; ++cIt ) - vertices.push_back( pa[ cIt ] ); - for( ; bIt >= 0; --bIt ) - vertices.push_back( pb[ bIt ] ); - - } // fi - - } // fi - return( vertices ); -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _Superclass > -fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -MinimumSpanningTree( ) - : Superclass( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TVertex, class _Superclass > -fpa::DataStructures::MinimumSpanningTree< _TVertex, _Superclass >:: -~MinimumSpanningTree( ) -{ -} - -#endif // __fpa__DataStructures__MinimumSpanningTree__hxx__ -// eof - $RCSfile$ diff --git a/lib/fpa/VTK/Image/PathToPolyDataFilter.h b/lib/fpa/VTK/Image/PathToPolyDataFilter.h deleted file mode 100644 index d6157e0..0000000 --- a/lib/fpa/VTK/Image/PathToPolyDataFilter.h +++ /dev/null @@ -1,70 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__VTK__Image__PathToPolyDataFilter__h__ -#define __fpa__VTK__Image__PathToPolyDataFilter__h__ - -#include - -namespace fpa -{ - namespace VTK - { - namespace Image - { - /** - */ - template< class _TPath > - class PathToPolyDataFilter - : public vtkPolyDataAlgorithm - { - public: - typedef PathToPolyDataFilter Self; - typedef _TPath TPath; - - public: - vtkTypeMacro( PathToPolyDataFilter, vtkPolyDataAlgorithm ); - - public: - static Self* New( ); - - const TPath* GetInput( ) const; - void SetInput( const TPath* path ); - - protected: - PathToPolyDataFilter( ); - virtual ~PathToPolyDataFilter( ); - - int RequestData( - vtkInformation* information, - vtkInformationVector** input, - vtkInformationVector* output - ); - int RequestInformation( - vtkInformation* information, - vtkInformationVector** input, - vtkInformationVector* output - ); - - private: - // Purposely not implemented - PathToPolyDataFilter( const Self& ); - void operator=( const Self& ); - - protected: - const TPath* m_Path; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION -#endif // __fpa__VTK__Image__PathToPolyDataFilter__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/VTK/Image/PathToPolyDataFilter.hxx b/lib/fpa/VTK/Image/PathToPolyDataFilter.hxx deleted file mode 100644 index 4965778..0000000 --- a/lib/fpa/VTK/Image/PathToPolyDataFilter.hxx +++ /dev/null @@ -1,133 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__VTK__Image__PathToPolyDataFilter__hxx__ -#define __fpa__VTK__Image__PathToPolyDataFilter__hxx__ - -#include -#include -#include -#include -#include -#include - -// ------------------------------------------------------------------------- -template< class _TPath > -typename fpa::VTK::Image::PathToPolyDataFilter< _TPath >:: -Self* fpa::VTK::Image::PathToPolyDataFilter< _TPath >:: -New( ) -{ - return( new Self( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -const typename -fpa::VTK::Image::PathToPolyDataFilter< _TPath >:: -TPath* fpa::VTK::Image::PathToPolyDataFilter< _TPath >:: -GetInput( ) const -{ - return( this->m_Path ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -void fpa::VTK::Image::PathToPolyDataFilter< _TPath >:: -SetInput( const TPath* path ) -{ - if( this->m_Path != path ) - { - this->m_Path = path; - this->Modified( ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TPath > -fpa::VTK::Image::PathToPolyDataFilter< _TPath >:: -PathToPolyDataFilter( ) - : vtkPolyDataAlgorithm( ), - m_Path( NULL ) -{ - this->SetNumberOfInputPorts( 0 ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -fpa::VTK::Image::PathToPolyDataFilter< _TPath >:: -~PathToPolyDataFilter( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TPath > -int fpa::VTK::Image::PathToPolyDataFilter< _TPath >:: -RequestData( - vtkInformation* information, - vtkInformationVector** input, - vtkInformationVector* output - ) -{ - static const unsigned int dim = TPath::PathDimension; - if( this->m_Path == NULL ) - return( 0 ); - - // Get output - vtkInformation* info = output->GetInformationObject( 0 ); - vtkPolyData* out = vtkPolyData::SafeDownCast( - info->Get( vtkDataObject::DATA_OBJECT( ) ) - ); - - // Prepare data - out->SetPoints( vtkSmartPointer< vtkPoints >::New( ) ); - out->SetVerts( vtkSmartPointer< vtkCellArray >::New( ) ); - out->SetLines( vtkSmartPointer< vtkCellArray >::New( ) ); - out->SetPolys( vtkSmartPointer< vtkCellArray >::New( ) ); - out->SetStrips( vtkSmartPointer< vtkCellArray >::New( ) ); - vtkSmartPointer< vtkUnsignedIntArray > darray = - vtkSmartPointer< vtkUnsignedIntArray >::New( ); - darray->SetNumberOfComponents( 1 ); - out->GetPointData( )->SetScalars( darray ); - vtkPoints* points = out->GetPoints( ); - vtkCellArray* lines = out->GetLines( ); - - // Assign all data - const TPath* path = this->GetInput( ); - for( unsigned long i = 0; i < path->GetSize( ); ++i ) - { - auto pnt = path->GetPoint( i ); - if( dim == 1 ) - points->InsertNextPoint( pnt[ 0 ], 0, 0 ); - else if( dim == 2 ) - points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], 0 ); - else - points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] ); - darray->InsertNextTuple1( double( i ) ); - if( i > 0 ) - { - lines->InsertNextCell( 2 ); - lines->InsertCellPoint( points->GetNumberOfPoints( ) - 2 ); - lines->InsertCellPoint( points->GetNumberOfPoints( ) - 1 ); - - } // fi - - } // rof - return( 1 ); -} - -// ------------------------------------------------------------------------- -template< class _TPath > -int fpa::VTK::Image::PathToPolyDataFilter< _TPath >:: -RequestInformation( - vtkInformation* information, - vtkInformationVector** input, - vtkInformationVector* output - ) -{ - return( 1 ); -} - -#endif // __fpa__VTK__Image__PathToPolyDataFilterFilter__hxx__ -// eof - $RCSfile$ diff --git a/lib/fpa/VTK/Image/SkeletonToPolyDataFilter.h b/lib/fpa/VTK/Image/SkeletonToPolyDataFilter.h deleted file mode 100644 index f34ae2e..0000000 --- a/lib/fpa/VTK/Image/SkeletonToPolyDataFilter.h +++ /dev/null @@ -1,71 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__VTK__Image__SkeletonToPolyDataFilter__h__ -#define __fpa__VTK__Image__SkeletonToPolyDataFilter__h__ - -#include - -namespace fpa -{ - namespace VTK - { - namespace Image - { - /** - */ - template< class _TSkeleton > - class SkeletonToPolyDataFilter - : public vtkPolyDataAlgorithm - { - public: - typedef SkeletonToPolyDataFilter Self; - typedef _TSkeleton TSkeleton; - - public: - vtkTypeMacro( SkeletonToPolyDataFilter, vtkPolyDataAlgorithm ); - - public: - static Self* New( ); - - const TSkeleton* GetInput( ) const; - void SetInput( const TSkeleton* sk ); - - protected: - SkeletonToPolyDataFilter( ); - virtual ~SkeletonToPolyDataFilter( ); - - int RequestData( - vtkInformation* information, - vtkInformationVector** input, - vtkInformationVector* output - ); - int RequestInformation( - vtkInformation* information, - vtkInformationVector** input, - vtkInformationVector* output - ); - - private: - // Purposely not implemented - SkeletonToPolyDataFilter( const Self& ); - void operator=( const Self& ); - - protected: - const TSkeleton* m_Skeleton; - }; - - } // ecapseman - - } // ecapseman - -} // ecapseman - -#ifndef ITK_MANUAL_INSTANTIATION -# include -#endif // ITK_MANUAL_INSTANTIATION - -#endif // __fpa__VTK__Image__SkeletonToPolyDataFilter__h__ - -// eof - $RCSfile$ diff --git a/lib/fpa/VTK/Image/SkeletonToPolyDataFilter.hxx b/lib/fpa/VTK/Image/SkeletonToPolyDataFilter.hxx deleted file mode 100644 index 6b1aeef..0000000 --- a/lib/fpa/VTK/Image/SkeletonToPolyDataFilter.hxx +++ /dev/null @@ -1,154 +0,0 @@ -// ========================================================================= -// @author Leonardo Florez Valencia -// @email florez-l@javeriana.edu.co -// ========================================================================= -#ifndef __fpa__VTK__Image__SkeletonToPolyDataFilter__hxx__ -#define __fpa__VTK__Image__SkeletonToPolyDataFilter__hxx__ - -#include -#include -#include -#include -#include -#include - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -typename fpa::VTK::Image::SkeletonToPolyDataFilter< _TSkeleton >:: -Self* fpa::VTK::Image::SkeletonToPolyDataFilter< _TSkeleton >:: -New( ) -{ - return( new Self( ) ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -const typename -fpa::VTK::Image::SkeletonToPolyDataFilter< _TSkeleton >:: -TSkeleton* fpa::VTK::Image::SkeletonToPolyDataFilter< _TSkeleton >:: -GetInput( ) const -{ - return( this->m_Skeleton ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -void fpa::VTK::Image::SkeletonToPolyDataFilter< _TSkeleton >:: -SetInput( const TSkeleton* sk ) -{ - if( this->m_Skeleton != sk ) - { - this->m_Skeleton = sk; - this->Modified( ); - - } // fi -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -fpa::VTK::Image::SkeletonToPolyDataFilter< _TSkeleton >:: -SkeletonToPolyDataFilter( ) - : vtkPolyDataAlgorithm( ), - m_Skeleton( NULL ) -{ - this->SetNumberOfInputPorts( 0 ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -fpa::VTK::Image::SkeletonToPolyDataFilter< _TSkeleton >:: -~SkeletonToPolyDataFilter( ) -{ -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -int fpa::VTK::Image::SkeletonToPolyDataFilter< _TSkeleton >:: -RequestData( - vtkInformation* information, - vtkInformationVector** input, - vtkInformationVector* output - ) -{ - typedef typename _TSkeleton::TPath _TPath; - static const unsigned int dim = _TPath::PathDimension; - - if( this->m_Skeleton == NULL ) - return( 0 ); - - // Get output - vtkInformation* info = output->GetInformationObject( 0 ); - vtkPolyData* out = vtkPolyData::SafeDownCast( - info->Get( vtkDataObject::DATA_OBJECT( ) ) - ); - - // Prepare data - out->SetPoints( vtkSmartPointer< vtkPoints >::New( ) ); - out->SetVerts( vtkSmartPointer< vtkCellArray >::New( ) ); - out->SetLines( vtkSmartPointer< vtkCellArray >::New( ) ); - out->SetPolys( vtkSmartPointer< vtkCellArray >::New( ) ); - out->SetStrips( vtkSmartPointer< vtkCellArray >::New( ) ); - vtkSmartPointer< vtkUnsignedIntArray > darray = - vtkSmartPointer< vtkUnsignedIntArray >::New( ); - darray->SetNumberOfComponents( 1 ); - out->GetPointData( )->SetScalars( darray ); - vtkPoints* points = out->GetPoints( ); - vtkCellArray* lines = out->GetLines( ); - - // Assign all data - unsigned int dcount = 0; - typename TSkeleton::TMatrix::const_iterator mIt = this->m_Skeleton->BeginEdgesRows( ); - for( ; mIt != this->m_Skeleton->EndEdgesRows( ); ++mIt ) - { - // TODO: mIt->first; --> this is the row index. <-- - typename TSkeleton::TMatrixRow::const_iterator rIt = mIt->second.begin( ); - for( ; rIt != mIt->second.end( ); ++rIt ) - { - // TODO: rIt->first; --> this is the column index. - typename TSkeleton::TEdges::const_iterator eIt = rIt->second.begin( ); - for( ; eIt != rIt->second.end( ); ++eIt ) - { - _TPath* path = *eIt; - for( unsigned long i = 0; i < path->GetSize( ); ++i ) - { - auto pnt = path->GetPoint( i ); - if( dim == 1 ) - points->InsertNextPoint( pnt[ 0 ], 0, 0 ); - else if( dim == 2 ) - points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], 0 ); - else - points->InsertNextPoint( pnt[ 0 ], pnt[ 1 ], pnt[ 2 ] ); - darray->InsertNextTuple1( double( dcount ) ); - if( i > 0 ) - { - lines->InsertNextCell( 2 ); - lines->InsertCellPoint( points->GetNumberOfPoints( ) - 2 ); - lines->InsertCellPoint( points->GetNumberOfPoints( ) - 1 ); - - } // fi - - } // rof - dcount++; - - } // rof - - } // rof - - } // rof - return( 1 ); -} - -// ------------------------------------------------------------------------- -template< class _TSkeleton > -int fpa::VTK::Image::SkeletonToPolyDataFilter< _TSkeleton >:: -RequestInformation( - vtkInformation* information, - vtkInformationVector** input, - vtkInformationVector* output - ) -{ - return( 1 ); -} - -#endif // __fpa__VTK__Image__SkeletonToPolyDataFilterFilter__hxx__ -// eof - $RCSfile$ -- 2.47.1