region_container* get_polygon(const mxArray * input) { region_container* p = NULL; double *r = (double*)mxGetPr(input); int l = mxGetN(input); if (l % 2 == 0 && l > 6) { p = region_create_polygon(l / 2); for (int i = 0; i < p->data.polygon.count; i++) { p->data.polygon.x[i] = r[i*2]; p->data.polygon.y[i] = r[i*2+1]; } } else if (l == 4) { region_container* t = NULL; t = region_create_rectangle(r[0], r[1], r[2], r[3]); p = region_convert(t, POLYGON); region_release(&t); } return p; }
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { region_type format; region_container* p; region_container* c; if( nrhs != 2 ) mexErrMsgTxt("Two vector arguments (region and format) required."); if( nlhs != 1 ) mexErrMsgTxt("Exactly one output argument required."); if (mxGetClassID(prhs[0]) != mxDOUBLE_CLASS) mexErrMsgTxt("First input argument must be of type double"); if ( mxGetNumberOfDimensions(prhs[0]) > 2 || mxGetM(prhs[0]) > 1 ) mexErrMsgTxt("First input argument must be a vector"); char* codestr = get_string(prhs[1]); if (!get_region_code(codestr, format)) { free(codestr); mexErrMsgTxt("Not a valid format"); } free(codestr); p = array_to_region(prhs[0]); if (!p) mexErrMsgTxt("Not a valid region vector"); c = region_convert(p, format); if (!c) { if (p) region_release(&p); mexErrMsgTxt("Unable to convert region"); } plhs[0] = region_to_array(c); if (c) region_release(&c); if (p) region_release(&p); }