使用std :: list :: iterator变量跟踪循环访问列表中的最近点。当您到达列表的末尾时,它将包含最近的点并可用于擦除该项目。
void erase_closest_point(const list<Point>& pointList, const Point& point)
{
if (!pointList.empty())
{
list<Point>::iterator closestPoint = pointList.begin();
float closestDistance = sqrt(pow(point.x - closestPoint->x, 2) +
pow(point.y - closestPoint->y, 2));
// for each point in the list
for (list<Point>::iterator it = closestPoint + 1;
it != pointList.end(); ++it)
{
const float distance = sqrt(pow(point.x - it->x, 2) +
pow(point.y - it->y, 2));
// is the point closer than the previous best?
if (distance < closestDistance)
{
// replace it as the new best
closestPoint = it;
closestDistance = distance
}
}
pointList.erase(closestPoint);
}
}
在给定点的半径内建立一个点列表是类似的。请注意,通过引用将空半径列表传递给函数。通过引用将列表添加到列表将消除在按值返回向量时复制所有点的需要。
void find_points_within_radius(vector<Point>& radiusListOutput,
const list<Point>& pointList,
const Point& center, float radius)
{
// for each point in the list
for (list<Point>::iterator it = pointList.begin();
it != pointList.end(); ++it)
{
const float distance = sqrt(pow(center.x - it->x, 2) +
pow(center.y - it->y, 2));
// if the distance from the point is within the radius
if (distance > radius)
{
// add the point to the new list
radiusListOutput.push_back(*it);
}
}
}
再次使用副本,如果:
struct RadiusChecker {
RadiusChecker(const Point& center, float radius)
: center_(center), radius_(radius) {}
bool operator()(const Point& p)
{
const float distance = sqrt(pow(center_.x - p.x, 2) +
pow(center_.y - p.y, 2));
return distance < radius_;
}
private:
const Point& center_;
float radius_;
};
void find_points_within_radius(vector<Point>& radiusListOutput,
const list<Point>& pointList,
const Point& center, float radius)
{
radiusListOutput.reserve(pointList.size());
remove_copy_if(pointList.begin(), pointList.end(),
radiusListOutput.begin(),
RadiusChecker(center, radius));
}
注意,开方可以,如果你需要额外的性能,因为幅度的平方的作品一样好这些比较中移除。另外,如果您真的想要提高性能,则需要考虑允许场景分区的数据结构,如quadtree。第一个问题与collision detection密切相关,并且存在大量关于该主题的有价值的信息。
@Nathan Fellman,我不在学校。我正在努力学习C++,并决定编写一个绘图程序。所以,我猜想自己的作业。 – KingNestor 2009-02-11 21:26:51