bool _stdcall ComputeConvexHull(const mist::array3<short> *originImage, int targetLabel, int seedLabel, mist::array3<short>* output) { if (originImage == nullptr) return false; int seedIJK[3] = { 0 }; size_t seedId(0); mist::array3<short> image(*originImage); for (size_t i = 0; i < image.size(); ++i) { if (image[i] == seedLabel) seedId = i; if (image[i] != targetLabel) image[i] = 0; } tmatsu::artery::Tree tree; ComputeIJK(seedId, seedIJK, originImage->size1(), originImage->size2(), originImage->size3()); TreeConstruct(image, tree, tmatsu::Point(seedIJK[0], seedIJK[1], seedIJK[2])); for (auto iter = tree.begin(); iter != tree.end(); ++iter) { if (!iter.node()->eldest_child) { auto pt = iter->value.end_pt; (*output)(pt.x, pt.y, pt.z) = 10; } } return true; mist::euclidean::thinning26(image, *output); return true; mist::array3<short> image_prev(image); mist::erosion(image, 1); (*output) = image_prev - image; return true; }
int handle_input () { SDL_Event e; SDL_WaitEvent (&e); switch (e.type) { /* * thanks to Ted Mielczarek <*****@*****.**> for this, fixes the X * Async request errors */ case SDL_USEREVENT: if (e.user.code == SHOW_IMAGE) image_freshen (); break; case SDL_KEYDOWN: switch (tolower (e.key.keysym.sym)) { case 'x': case 'q': case SDLK_ESCAPE: return 0; break; case SDLK_SPACE: timer_toggle (); break; case SDLK_RETURN: image_freshen (); timer_stop (); break; case SDLK_RIGHT: timer_stop (); image_next (0); break; case SDLK_LEFT: timer_stop (); image_prev (0); break; case 'z': timer_stop (); toggle_state (ZOOM); image_freshen (); break; case 'f': timer_stop (); toggle_state (FULLSCREEN); if (get_state_int (FULLSCREEN)) screen = SDL_SetVideoMode (vid_width (), vid_height (), vid_depth (), SDL_FULLSCREEN | SDL_DOUBLEBUF); image_freshen (); break; #if 0 case '+': case '=': scale += .1; image_freshen (); break; case '-': scale -= .1; image_freshen (); break; #endif default: /* * do nothing */ break; } break; case SDL_QUIT: return 0; break; } return 1; }