/*! * \return Woolz error code. * \ingroup WlzBinaryOps * \brief Make temporary objects as in WlzRCCTOIdx for * WlzRegConCalcRCC(). * \param o Array of objects, o[0] and o[1]. * \param t Array of temporary objects. * \param i Temporary object index. */ static WlzErrorNum WlzRCCMakeT( WlzObject **o, WlzObject **t, WlzRCCTOIdx i) { WlzErrorNum errNum = WLZ_ERR_NONE; if((i >= 0) && (i < WLZ_RCCTOIDX_CNT)) { if(t[i] == NULL) { switch(i) { case WLZ_RCCTOIDX_O0O1U: /* o_0 \cup \o_1 */ t[i] = WlzAssignObject( WlzUnion2(o[0], o[1], &errNum), NULL); break; case WLZ_RCCTOIDX_O0O1I: /* o_0 \cap \o_1 */ t[i] = WlzAssignObject( WlzIntersect2(o[0], o[1], &errNum), NULL); break; case WLZ_RCCTOIDX_O0D: /* o_0^+ */ t[i] = WlzAssignObject( WlzDilation(o[0], (o[0]->type == WLZ_2D_DOMAINOBJ)? WLZ_8_CONNECTED: WLZ_26_CONNECTED, &errNum), NULL); break; case WLZ_RCCTOIDX_O1D: /* o_1^+ */ t[i] = WlzAssignObject( WlzDilation(o[1], (o[1]->type == WLZ_2D_DOMAINOBJ)? WLZ_8_CONNECTED: WLZ_26_CONNECTED, &errNum), NULL); break; case WLZ_RCCTOIDX_O0F: /* o_0^{\bullet} */ t[i] = WlzAssignObject( WlzDomainFill(o[0], &errNum), NULL); break; case WLZ_RCCTOIDX_O1F: /* o_1^{\bullet} */ t[i] = WlzAssignObject( WlzDomainFill(o[1], &errNum), NULL); break; case WLZ_RCCTOIDX_O0DO1U: /* o_0^+ \cup o_1 */ errNum = WlzRCCMakeT(o, t, WLZ_RCCTOIDX_O0D); if(errNum == WLZ_ERR_NONE) { t[i] = WlzAssignObject( WlzUnion2(t[WLZ_RCCTOIDX_O0D], o[1], &errNum), NULL); } break; case WLZ_RCCTOIDX_O0O1DU: /* o_0 \cup o_1^+ */ errNum = WlzRCCMakeT(o, t, WLZ_RCCTOIDX_O1D); if(errNum == WLZ_ERR_NONE) { t[i] = WlzAssignObject( WlzUnion2(o[0], t[WLZ_RCCTOIDX_O1D], &errNum), NULL); } break; case WLZ_RCCTOIDX_O0CO1I: /* o_0^{\circ} \cap o_1 */ case WLZ_RCCTOIDX_O0O1CI: /* FALLTHROUGH o_0 \cap o_1^{\circ} */ { int i0; WlzObject *c = NULL, *x = NULL; i0 = (i == WLZ_RCCTOIDX_O0CO1I)? 0: 1; c = WlzObjToConvexHull(o[i0], &errNum); if((errNum == WLZ_ERR_NONE) || (errNum == WLZ_ERR_DEGENERATE)) { x = WlzAssignObject( WlzConvexHullToObj(c, o[i0]->type, &errNum), NULL); } if(errNum == WLZ_ERR_NONE) { t[i] = WlzAssignObject( WlzIntersect2(o[!i0], x, &errNum), NULL); } (void )WlzFreeObj(c); (void )WlzFreeObj(x); } break; case WLZ_RCCTOIDX_O0FO1U: /* o_0^{\bullet} \cup o_1 */ errNum = WlzRCCMakeT(o, t, WLZ_RCCTOIDX_O0F); if(errNum == WLZ_ERR_NONE) { t[i] = WlzAssignObject( WlzUnion2(t[WLZ_RCCTOIDX_O0F], o[1], &errNum), NULL); } break; case WLZ_RCCTOIDX_O0O1FU: /* o_0 \cup o_1^{\bullet} */ errNum = WlzRCCMakeT(o, t, WLZ_RCCTOIDX_O1F); if(errNum == WLZ_ERR_NONE) { t[i] = WlzAssignObject( WlzUnion2(o[0], t[WLZ_RCCTOIDX_O1F], &errNum), NULL); } break; default: errNum = WLZ_ERR_PARAM_DATA; break; } } } else { errNum = WLZ_ERR_PARAM_DATA; } return(errNum); }
int main(int argc, char **argv) { WlzObject *obj, *tmpObj; WlzValues values; FILE *inFile; char optList[] = "hv"; int option; int verboseFlg=0; WlzErrorNum errNum = WLZ_ERR_NONE; const char *errMsg; /* read the argument list and check for an input file */ opterr = 0; while( (option = getopt(argc, argv, optList)) != EOF ){ switch( option ){ case 'v': verboseFlg = 1; break; case 'h': default: usage(argv[0]); return 1; } } inFile = stdin; if( optind < argc ){ if( (inFile = fopen(*(argv+optind), "r")) == NULL ){ fprintf(stderr, "%s: can't open file %s\n", argv[0], *(argv+optind)); usage(argv[0]); return 1; } } /* read objects and threshold if possible */ while(((obj = WlzAssignObject(WlzReadObj(inFile, NULL), NULL)) != NULL) && (errNum == WLZ_ERR_NONE)) { switch( obj->type ) { case WLZ_2D_DOMAINOBJ: case WLZ_3D_DOMAINOBJ: values.core = NULL; if((tmpObj = WlzDomainFill(obj, &errNum)) != NULL){ if((errNum = WlzWriteObj(stdout, tmpObj)) != WLZ_ERR_NONE) { (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: failed to write object (%s).\n", argv[0], errMsg); return(1); } WlzFreeObj(tmpObj); } break; default: if((errNum = WlzWriteObj(stdout, obj)) != WLZ_ERR_NONE) { (void )WlzStringFromErrorNum(errNum, &errMsg); (void )fprintf(stderr, "%s: failed to write object (%s).\n", argv[0], errMsg); return(1); } break; } WlzFreeObj(obj); } return 0; }