Hi,
I'm trying to understand how to use the DistanceQueryInterface.
Does anyone have an example of this?
Thanks
Hi,
I'm trying to understand how to use the DistanceQueryInterface.
Does anyone have an example of this?
Thanks
hello
For your next threads, please help us keeping things organised and clean.
This example show how to use the Interface.
The declaration is in distancequery.h
In this file you find this MAXON_DECLARATION
that define what you have to use to create your ref.
MAXON_DECLARATION(Class<DistanceQueryRef>, DistanceCalculator, "net.maxon.geom.interface.distancequery.distancecalculator");
so you can use :
maxon::DistanceQueryRef distanceQueryRef = maxon::DistanceCalculator().Create() iferr_return;
iferr_scope;
// ------- Create a mesh
const maxon::Int32 polyCnt{ 500 };
PolygonObject *mesh = PolygonObject::Alloc(polyCnt * 4, polyCnt );
if (mesh == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
maxon::LinearCongruentialRandom<maxon::Float32> random;
CPolygon *polyAdrW = mesh->GetPolygonW();
Vector* padrW = mesh->GetPointW();
const Float polySize{ 10 };
for (maxon::Int i = 0; i < polyCnt; i++)
{
CPolygon poly;
maxon::Vector pointA(i * polySize, 0, 0);
maxon::Vector pointB(i * polySize, 0, polySize);
maxon::Vector pointC(i * polySize + polySize, 0, polySize);
maxon::Vector pointD(i * polySize + polySize, 0, 0);
const maxon::Int pointIndice = i * 4;
padrW[pointIndice] = pointA;
padrW[pointIndice + 1] = pointB;
padrW[pointIndice + 2] = pointC;
padrW[pointIndice + 3] = pointD;
poly.a = pointIndice;
poly.b = pointIndice + 1;
poly.c = pointIndice + 2;
poly.d = pointIndice + 3;
polyAdrW[i] = poly;
}
doc->InsertObject(mesh, nullptr, nullptr);
// Creates the reference.
maxon::DistanceQueryRef distanceQueryRef = maxon::DistanceCalculator().Create() iferr_return;
// Inits the mesh
distanceQueryRef.Init(mesh, true) iferr_return;
maxon::PrimitiveInformation result;
const maxon::Int samplePointCnt = polyCnt;
//----------------------------------------------------------------------------------------
/// sample using standard loop
maxon::TimeValue start = maxon::TimeValue(maxon::TimeValue::NOW);
for (maxon::Int i = 0; i < samplePointCnt; ++i)
{
const maxon::Vector pos{ i * polySize + polySize * 0.5, 0, 0 };
distanceQueryRef.GetClosestMeshPrimitive(pos, result);
if (result.type == maxon::PRIMITIVETYPE::POLYGON)
ApplicationOutput("pos @, polyIndex @ ", pos, result.GetRealPolyIndex());
else
ApplicationOutput("not a polygon");
}
ApplicationOutput("time to sample the points @ with MP", start.Stop());
//----------------------------------------------------------------------------------------
/// sample using parallelFor
start = maxon::TimeValue(maxon::TimeValue::NOW);
maxon::BaseArray< maxon::PrimitiveInformation> resultArray;
resultArray.Resize(samplePointCnt) iferr_return;
maxon::ParallelFor::Dynamic(0, samplePointCnt,
[&resultArray, &polySize, &distanceQueryRef](maxon::Int i)
{
maxon::PrimitiveInformation result;
const maxon::Vector pos{ i * polySize + polySize * 0.5, 0, 0 };
distanceQueryRef.GetClosestMeshPrimitive(pos, result);
if (result.type == maxon::PRIMITIVETYPE::POLYGON)
ApplicationOutput("pos @, polyIndex @ ", pos, result.GetRealPolyIndex());
else
ApplicationOutput("not a polygon");
resultArray[i] = result;
}
);
ApplicationOutput("time to sample the points @ with MP", start.Stop());
for (auto& value : resultArray)
{
if (value.type == maxon::PRIMITIVETYPE::POLYGON)
ApplicationOutput("polyIndex @ ", value.GetRealPolyIndex());
else
ApplicationOutput("not a polygon");
}
Cheers,
Manuel
MAXON SDK Specialist
hello
For your next threads, please help us keeping things organised and clean.
This example show how to use the Interface.
The declaration is in distancequery.h
In this file you find this MAXON_DECLARATION
that define what you have to use to create your ref.
MAXON_DECLARATION(Class<DistanceQueryRef>, DistanceCalculator, "net.maxon.geom.interface.distancequery.distancecalculator");
so you can use :
maxon::DistanceQueryRef distanceQueryRef = maxon::DistanceCalculator().Create() iferr_return;
iferr_scope;
// ------- Create a mesh
const maxon::Int32 polyCnt{ 500 };
PolygonObject *mesh = PolygonObject::Alloc(polyCnt * 4, polyCnt );
if (mesh == nullptr)
return maxon::OutOfMemoryError(MAXON_SOURCE_LOCATION);
maxon::LinearCongruentialRandom<maxon::Float32> random;
CPolygon *polyAdrW = mesh->GetPolygonW();
Vector* padrW = mesh->GetPointW();
const Float polySize{ 10 };
for (maxon::Int i = 0; i < polyCnt; i++)
{
CPolygon poly;
maxon::Vector pointA(i * polySize, 0, 0);
maxon::Vector pointB(i * polySize, 0, polySize);
maxon::Vector pointC(i * polySize + polySize, 0, polySize);
maxon::Vector pointD(i * polySize + polySize, 0, 0);
const maxon::Int pointIndice = i * 4;
padrW[pointIndice] = pointA;
padrW[pointIndice + 1] = pointB;
padrW[pointIndice + 2] = pointC;
padrW[pointIndice + 3] = pointD;
poly.a = pointIndice;
poly.b = pointIndice + 1;
poly.c = pointIndice + 2;
poly.d = pointIndice + 3;
polyAdrW[i] = poly;
}
doc->InsertObject(mesh, nullptr, nullptr);
// Creates the reference.
maxon::DistanceQueryRef distanceQueryRef = maxon::DistanceCalculator().Create() iferr_return;
// Inits the mesh
distanceQueryRef.Init(mesh, true) iferr_return;
maxon::PrimitiveInformation result;
const maxon::Int samplePointCnt = polyCnt;
//----------------------------------------------------------------------------------------
/// sample using standard loop
maxon::TimeValue start = maxon::TimeValue(maxon::TimeValue::NOW);
for (maxon::Int i = 0; i < samplePointCnt; ++i)
{
const maxon::Vector pos{ i * polySize + polySize * 0.5, 0, 0 };
distanceQueryRef.GetClosestMeshPrimitive(pos, result);
if (result.type == maxon::PRIMITIVETYPE::POLYGON)
ApplicationOutput("pos @, polyIndex @ ", pos, result.GetRealPolyIndex());
else
ApplicationOutput("not a polygon");
}
ApplicationOutput("time to sample the points @ with MP", start.Stop());
//----------------------------------------------------------------------------------------
/// sample using parallelFor
start = maxon::TimeValue(maxon::TimeValue::NOW);
maxon::BaseArray< maxon::PrimitiveInformation> resultArray;
resultArray.Resize(samplePointCnt) iferr_return;
maxon::ParallelFor::Dynamic(0, samplePointCnt,
[&resultArray, &polySize, &distanceQueryRef](maxon::Int i)
{
maxon::PrimitiveInformation result;
const maxon::Vector pos{ i * polySize + polySize * 0.5, 0, 0 };
distanceQueryRef.GetClosestMeshPrimitive(pos, result);
if (result.type == maxon::PRIMITIVETYPE::POLYGON)
ApplicationOutput("pos @, polyIndex @ ", pos, result.GetRealPolyIndex());
else
ApplicationOutput("not a polygon");
resultArray[i] = result;
}
);
ApplicationOutput("time to sample the points @ with MP", start.Stop());
for (auto& value : resultArray)
{
if (value.type == maxon::PRIMITIVETYPE::POLYGON)
ApplicationOutput("polyIndex @ ", value.GetRealPolyIndex());
else
ApplicationOutput("not a polygon");
}
Cheers,
Manuel
MAXON SDK Specialist