[vtkusers] Color PolyData based on VolumeData

Andaharoo Andx_roo at live.com
Sun Dec 2 23:26:42 EST 2018


So, if I understand right, you want to color the scalar/whatever field onto
the poly? Just provide vtkPolyData with scalars and set the polyData's
mapper scalar visibility to on.

If you give it 1 component scalars you can give the mapper a color function
to map them. If you give it 3 component uchar it should just display them as
color (as long as scalar visibility is on). Like so:


// Create the scalars array
vtkDoubleArray* scalars = vtkDoubleArray::New();
scalars->SetName("Scalars");
// For every point in the poly
for (vtkIdType i = 0; i < outputPoly->GetNumberOfPoints(); i++)
{
	double pt[3];
	outputPoly->GetPoint(i, pt);

	scalars->InsertTuple1(i, trilinearSamplePoint(inputImage, pt[0], pt[1],
pt[2], 1, 0));
}
// Add the scalar data to the poly data
outputPoly->GetPointData()->AddArray(scalars);
outputPoly->GetPointData()->SetActiveScalars("Scalars");


This just goes through all the points in the polygon and gets the color from
the image. Getting the color at a point in an image can be done by simply
using the nearest color from the image (nearest neighbor) or better would be
to use trilinear interpolation of the 8 nearest colors which I used in my
example. Also note my code expects float image input:
static const int calcIndex(int x, int y, int z, int width, int height) {
return x + width * (y + height * z); }

static float trilinearSamplePoint(vtkImageData* imageData, float x, float y,
float z, int numComps, int comp)
{
	float* imagePtr = static_cast<float*>(imageData->GetScalarPointer());
	double* spacing = imageData->GetSpacing();
	double* origin = imageData->GetOrigin();
	int* dim = imageData->GetDimensions();

	// We assume point x, y, z is in the image
	int xi = (x - origin[0]) / spacing[0];
	int yi = (y - origin[1]) / spacing[1];
	int zi = (z - origin[2]) / spacing[2];

	// Get the intensities at the 8 nearest neighbors
	float i000 = imagePtr[calcIndex(xi, yi, zi, dim[0], dim[1]) * numComps +
comp];
	float i100 = imagePtr[calcIndex(xi + 1, yi, zi, dim[0], dim[1]) * numComps
+ comp];
	float i110 = imagePtr[calcIndex(xi + 1, yi + 1, zi, dim[0], dim[1] *
numComps + comp)];
	float i010 = imagePtr[calcIndex(xi, yi + 1, zi, dim[0], dim[1]) * numComps
+ comp];

	float i001 = imagePtr[calcIndex(xi, yi, zi + 1, dim[0], dim[1]) * numComps
+ comp];
	float i101 = imagePtr[calcIndex(xi + 1, yi, zi + 1, dim[0], dim[1]) *
numComps + comp];
	float i111 = imagePtr[calcIndex(xi + 1, yi + 1, zi + 1, dim[0], dim[1]) *
numComps + comp];
	float i011 = imagePtr[calcIndex(xi, yi + 1, zi + 1, dim[0], dim[1]) *
numComps + comp];

	// Get the fractional/unit distance from nearest neighbor 000
	float rx = xi * spacing[0] + origin[0]; // Position of node
	rx = (x - rx) / spacing[0]; // (Node - actual point position) / voxel width
	float ry = yi * spacing[1] + origin[1];
	ry = (y - ry) / spacing[1];
	float rz = zi * spacing[2] + origin[2];
	rz = (z - rz) / spacing[2];

	// Now we do the trilinear interpolation
	float ax = i000 + (i100 - i000) * rx;
	float bx = i010 + (i110 - i010) * rx;
	float cy = ax + (bx - ax) * ry;

	float dx = i001 + (i101 - i001) * rx;
	float ex = i011 + (i111 - i011) * rx;
	float fy = dx + (ex - dx) * ry;

	float gz = cy + (fy - cy) * rz;
	return gz;
}




--
Sent from: http://vtk.1045678.n5.nabble.com/VTK-Users-f1224199.html


More information about the vtkusers mailing list