The interface GetCenter gives us the center of bounding box rather than barycenter of model.
Here is source code from VTK9.2.0.
double* vtkProp3D::GetCenter()
{
this->GetBounds();
this->Center[0] = (this->Bounds[1] + this->Bounds[0]) / 2.0;
this->Center[1] = (this->Bounds[3] + this->Bounds[2]) / 2.0;
this->Center[2] = (this->Bounds[5] + this->Bounds[4]) / 2.0;
return this->Center;
}
// Get the bounds for this Prop3D as (Xmin,Xmax,Ymin,Ymax,Zmin,Zmax).
void vtkProp3D::GetBounds(double bounds[6])
{
this->GetBounds();
for (int i = 0; i < 6; i++)
{
bounds[i] = this->Bounds[i];
}
}
//------------------------------------------------------------------------------
// Get the bounds for this Actor as (Xmin,Xmax,Ymin,Ymax,Zmin,Zmax).
double* vtkActor::GetBounds()
{
int i, n;
double bbox[24], *fptr;
vtkDebugMacro(<< "Getting Bounds");
// get the bounds of the Mapper if we have one
if (!this->Mapper)
{
return this->Bounds;
}
const double* bounds = this->Mapper->GetBounds();
// Check for the special case when the mapper's bounds are unknown
if (!bounds)
{
return nullptr;
}
// Check for the special case when the actor is empty.
if (!vtkMath::AreBoundsInitialized(bounds))
{
memcpy(this->MapperBounds, bounds, 6 * sizeof(double));
vtkMath::UninitializeBounds(this->Bounds);
this->BoundsMTime.Modified();
return this->Bounds;
}
// Check if we have cached values for these bounds - we cache the
// values returned by this->Mapper->GetBounds() and we store the time
// of caching. If the values returned this time are different, or
// the modified time of this class is newer than the cached time,
// then we need to rebuild.
if ((memcmp(this->MapperBounds, bounds, 6 * sizeof(double)) != 0) ||
(this->GetMTime() > this->BoundsMTime) || this->CoordinateSystem != vtkProp3D::WORLD)
{
vtkDebugMacro(<< "Recomputing bounds...");
memcpy(this->MapperBounds, bounds, 6 * sizeof(double));
// fill out vertices of a bounding box
bbox[0] = bounds[1];
bbox[1] = bounds[3];
bbox[2] = bounds[5];
bbox[3] = bounds[1];
bbox[4] = bounds[2];
bbox[5] = bounds[5];
bbox[6] = bounds[0];
bbox[7] = bounds[2];
bbox[8] = bounds[5];
bbox[9] = bounds[0];
bbox[10] = bounds[3];
bbox[11] = bounds[5];
bbox[12] = bounds[1];
bbox[13] = bounds[3];
bbox[14] = bounds[4];
bbox[15] = bounds[1];
bbox[16] = bounds[2];
bbox[17] = bounds[4];
bbox[18] = bounds[0];
bbox[19] = bounds[2];
bbox[20] = bounds[4];
bbox[21] = bounds[0];
bbox[22] = bounds[3];
bbox[23] = bounds[4];
// make sure matrix (transform) is up-to-date
this->ComputeMatrix();
// and transform into actors coordinates
fptr = bbox;
for (n = 0; n < 8; n++)
{
double homogeneousPt[4] = { fptr[0], fptr[1], fptr[2], 1.0 };
this->Matrix->MultiplyPoint(homogeneousPt, homogeneousPt);
fptr[0] = homogeneousPt[0] / homogeneousPt[3];
fptr[1] = homogeneousPt[1] / homogeneousPt[3];
fptr[2] = homogeneousPt[2] / homogeneousPt[3];
fptr += 3;
}
// now calc the new bounds
this->Bounds[0] = this->Bounds[2] = this->Bounds[4] = VTK_DOUBLE_MAX;
this->Bounds[1] = this->Bounds[3] = this->Bounds[5] = -VTK_DOUBLE_MAX;
for (i = 0; i < 8; i++)
{
for (n = 0; n < 3; n++)
{
if (bbox[i * 3 + n] < this->Bounds[n * 2])
{
this->Bounds[n * 2] = bbox[i * 3 + n];
}
if (bbox[i * 3 + n] > this->Bounds[n * 2 + 1])
{
this->Bounds[n * 2 + 1] = bbox[i * 3 + n];
}
}
}
this->BoundsMTime.Modified();
}
return this->Bounds;
}