Beispiel #1
0
/* Creates a new file handle with the given ID, which must be
   unique among existing file identifiers.  The new handle is
   associated with a dataset file (initially empty). */
struct file_handle *
fh_create_dataset (struct dataset *ds)
{
  const char *name;
  struct file_handle *handle;

  name = dataset_name (ds);
  if (name[0] == '\0')
    name = _("active dataset");

  handle = create_handle (NULL, xstrdup (name), FH_REF_DATASET);
  handle->ds = ds;
  return handle;
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[])
{
    // Check for proper number of arguments
    if (nrhs!=6) 
    { 
	    mexErrMsgTxt("Six input argument required."); 
    } 
    else if (nlhs>1) 
    {
	    mexErrMsgTxt("Too many output arguments provided."); 
    } 

    // Get access to MATLAB data through C data types
    double *vertices = mxGetPr(prhs[0]);
    unsigned num_vertices = mxGetM(prhs[0]);
    
    double *edges = mxGetPr(prhs[1]);
    unsigned num_edges = mxGetM(prhs[1]);

    double *radii = mxGetPr(prhs[2]);
    unsigned num_radii_values = mxGetM(prhs[2]);
    
    std::string dataset_name(mxArrayToString(prhs[3]));
    
    double pixel_to_um = mxGetScalar(prhs[4]);
    
    double radii_fudge_factor = mxGetScalar(prhs[5]);
    
    if (num_vertices != num_radii_values)
    {
        mexErrMsgTxt("Number of radii values provided differs from the number of vertices specified.");
    }
    
    // Create the output variable that will store the edge lengths and radii required for one of the histograms
    plhs[0] = mxCreateDoubleMatrix(num_edges, 2, mxREAL);
    double *edge_length_radii = mxGetPr(plhs[0]);
    
    // Create and fill a point container
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    for (unsigned vertex=0; vertex<num_vertices; vertex++)
    {
        points->InsertNextPoint(acces_2d(vertices, vertex, 0, num_vertices) * pixel_to_um, 
                                acces_2d(vertices, vertex, 1, num_vertices) * pixel_to_um, 
                                0);
    }
 
    // Create a polydata object and add the points to it.
    vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
    polydata->SetPoints(points);

    // Create the array containing edge lengths 
    vtkSmartPointer<vtkDoubleArray> lengths_array = vtkSmartPointer<vtkDoubleArray>::New();
    lengths_array->SetNumberOfComponents(1);
    lengths_array->SetName("EdgeLengths");
    
    // Allocate memory and add the definition of edges to the polydata object
    polydata->Allocate();
    vtkIdType edge_ends[2];    
    for (unsigned edge_id=0; edge_id<num_edges; edge_id++)
    {
        // The definition of edges comes from MATLAB and and the vertices are one-based indexed. Offset them.
        edge_ends[0] = acces_2d(edges, edge_id, 0, num_edges) - 1; 
        edge_ends[1] = acces_2d(edges, edge_id, 1, num_edges) - 1;
        
        polydata->InsertNextCell(VTK_LINE, 2, edge_ends);
        double edge_length = DistanceTwoVertices(vertices, num_vertices, edge_ends) * pixel_to_um;
        lengths_array->InsertNextValue(edge_length);
        
        acces_2d(edge_length_radii, edge_id, 0, num_edges) = edge_length;
        acces_2d(edge_length_radii, edge_id, 1, num_edges) = radii_fudge_factor * pixel_to_um * (radii[edge_ends[0]] + radii[edge_ends[1]])/2;
    }
    //polydata->GetCellData()->AddArray(lengths_array);
    
    // Create and fill the array containing the plexus radii at each vertex.
    vtkSmartPointer<vtkDoubleArray> radii_array = vtkSmartPointer<vtkDoubleArray>::New();
    radii_array->SetNumberOfComponents(1);
    radii_array->SetName("Radius");    
    for (unsigned vertex_id=0; vertex_id<num_vertices; vertex_id++)
    {
        radii_array->InsertNextValue(radii_fudge_factor * radii[vertex_id] * pixel_to_um);
    }
    polydata->GetPointData()->AddArray(radii_array);
    polydata->GetPointData()->SetActiveScalars("Radius");
     
    WritePolyDataToDisk(polydata, dataset_name + ".vtp");
}