コード例 #1
0
std::list<KDPoint> randomPointsInBox(int numPoints, KDPoint min, KDPoint max)
{
	CGAL::Random_points_in_cube_3<KDPoint, Pt_creator> cubeRnd(1.0);
	std::list<KDPoint> randomPointsCube;
	CGAL::copy_n(cubeRnd, numPoints, std::back_inserter(randomPointsCube));

	std::list<KDPoint> randomPoints;
	std::list<KDPoint>::iterator pointsIter;
	for(pointsIter = randomPointsCube.begin(); pointsIter != randomPointsCube.end(); ++pointsIter)
	{
		KDPoint point = *pointsIter;

		KDTransformation translate(CGAL::TRANSLATION, KDVector(1.0, 1.0, 1.0));
		KDTransformation scale(CGAL::SCALING, 0.5);
		point = translate(point);
		point = scale(point);

		KDTransformation scaleToBox((max.x()-min.x()), 0, 0, 0, (max.y()-min.y()), 0, 0, 0, (max.z()-min.z()));
		KDTransformation translateToBox(CGAL::TRANSLATION, KDVector(min.x(), min.y(), min.z()));
		point = scaleToBox(point);
		point = translateToBox(point);

		randomPoints.push_back(point);
	}
	return randomPoints;
}
コード例 #2
0
std::list<KDPoint> randomPointsInConcaveSphere(int numPoints, double innerRadius, double outerRadius)
{
	CGAL::Random_points_in_sphere_3<KDPoint, Pt_creator> sphereRnd(outerRadius - innerRadius);
	std::list<KDPoint> innerRandomPoints;
	CGAL::copy_n(sphereRnd, numPoints, std::back_inserter(innerRandomPoints));

	std::list<KDPoint> randomPoints;
	std::list<KDPoint>::iterator pointsIter;
	for(pointsIter = innerRandomPoints.begin(); pointsIter != innerRandomPoints.end(); ++pointsIter)
	{
		KDPoint point = *pointsIter;
		KDVector vPoint1 = KDVector(point.x(), point.y(), point.z());
		KDVector vPoint1Unit = vPoint1 / CGAL::sqrt(vPoint1.squared_length());
		KDVector vPoint2 = vPoint1Unit * innerRadius;
		KDVector vPoint = vPoint1 + vPoint2;
		randomPoints.push_back(KDPoint(vPoint.x(), vPoint.y(), vPoint.z()));
	}
	return randomPoints;
}
コード例 #3
0
std::list<KDPoint> randomPointsInSphereGaussianDistribution(int numPoints, double radius, double width)
{
	CGAL::Random_points_in_sphere_3<KDPoint, Pt_creator> sphereRnd(1.0);
	std::list<KDPoint> innerRandomPoints;
	CGAL::copy_n(sphereRnd, numPoints, std::back_inserter(innerRandomPoints));

	std::list<KDPoint> randomPoints;
	std::list<KDPoint>::iterator pointsIter;
	for(pointsIter = innerRandomPoints.begin(); pointsIter != innerRandomPoints.end(); ++pointsIter)
	{
		KDPoint point = *pointsIter;
		KDVector vPointR = KDVector(point.x(), point.y(), point.z());
		double r =  CGAL::sqrt(vPointR.squared_length());
		KDVector unitVector = vPointR / r;
		double gaussRadius = std::exp(-(width*r*r));
		KDTransformation scaleGauss(CGAL::SCALING, gaussRadius);
		KDTransformation scaleRadius(CGAL::SCALING, radius);
		KDPoint scaledPoint = scaleGauss(KDPoint(unitVector.x(), unitVector.y(), unitVector.z()));
		scaledPoint = scaleRadius(scaledPoint);
		randomPoints.push_back(scaledPoint);
	}
	return randomPoints;
}
コード例 #4
0
//Call the rejointMesh in RejointMeshes.cpp on the meshes that have distance with targetPoint greater than double distance
// use isExternJoin = true to joint the extern meshes, use isExternJoin = false to joint the internal meshes
std::list<MeshData> rejointMeshesInDistance(std::list<MeshData> &listMeshData, KDPoint targetPoint, double distance, double isExternJoin)
{
	std::list<MeshData> result;
	std::list<MeshData> meshesToJoin;
	double squaredDistance = distance * distance;
	PointCGAL exactTargetPoint(targetPoint.x(), targetPoint.y(), targetPoint.z());

	std::list<MeshData>::iterator meshDataInter;
	for(meshDataInter = listMeshData.begin(); meshDataInter != listMeshData.end(); ++meshDataInter)
	{
		bool meshIsOutOfDistance = true; //Algorithm 1
		//bool meshIsOutOfDistance = false; //Algorithm 2
		std::list<Triangle>::iterator triangleIter;
		for(triangleIter = meshDataInter->first.begin(); triangleIter != meshDataInter->first.end(); ++triangleIter)
		{
			Triangle t = *triangleIter;

			//Algorithm 1: This algorithm excludes from the join the meshes on the radius
			for (int i = 0; i < 3; ++i)
			{
				PointCGAL tv = t.vertex(i);

				//it could be used a logic XNOR but it is not so understable, so I use this condition
				if (isExternJoin)
				{
					if (CGAL::squared_distance(tv, exactTargetPoint) < squaredDistance)
					{
						meshIsOutOfDistance = false;
					}
				}
				else
				{
					if (CGAL::squared_distance(tv, exactTargetPoint) > squaredDistance)
					{
						meshIsOutOfDistance = false;
					}
				}
			}
			if (!meshIsOutOfDistance)
			{
				break;
			}


			/*
			//Algorithm 2: This algorithm includes from the join the meshes on the radius
			//Ideale per pezzi piccoli e dominio dei punti voronoi dentro il raggio,
			// sembra funzionare solo per isExternJoin, TODO: test
			for (int i = 0; i < 3; ++i)
			{
				PointCGAL tv = t.vertex(i);

				if (isExternJoin)
				{
					if (CGAL::squared_distance(tv, exactTargetPoint) > squaredDistance)
					{
						meshIsOutOfDistance = true;
					}
				}
				else
				{
					if (CGAL::squared_distance(tv, exactTargetPoint) < squaredDistance)
					{
						meshIsOutOfDistance = true;
					}
				}
			}
			if (meshIsOutOfDistance)
			{
				break;
			}
			*/

		}

		if (meshIsOutOfDistance)
		{
			meshesToJoin.push_back(*meshDataInter);
		}
		else
		{
			result.push_back(*meshDataInter);
		}
	}

	if (meshesToJoin.size() > 0)
	{
		MeshData rejointMeshes = simpleRejointMeshes(meshesToJoin);
		//MeshData rejointMeshes = rejointMeshes(meshesToJoin);
		result.push_back(rejointMeshes);
	}

	std::cout << "Executed rejointMeshesInDistance: not joined meshes: " << (listMeshData.size() - meshesToJoin.size()) << ", joined meshes: " << meshesToJoin.size() << std::endl;

	return result;

}
コード例 #5
0
std::list<KDPoint> translatePoints(std::list<KDPoint> &listPoints, KDPoint vectorPoint)
{
	std::list<KDPoint> translatedPoints;
	KDTransformation translate(CGAL::TRANSLATION, KDVector(vectorPoint.x(), vectorPoint.y(), vectorPoint.z()));
	std::list<KDPoint>::iterator vectorPointInter;
	for(vectorPointInter = listPoints.begin(); vectorPointInter != listPoints.end(); ++vectorPointInter)
	{
		KDPoint point = *vectorPointInter;
		translatedPoints.push_back(translate(point));
	}
	return translatedPoints;
}
コード例 #6
0
PointCGAL converPointInexactToExact(KDPoint point)
{
	return PointCGAL(CGAL::to_double(point.x()), CGAL::to_double(point.y()), CGAL::to_double(point.z()));
}