在我的代码中,我获得了存储在名为matrix
. 这些点没有排序,所以我必须对它们进行排序。由于我不知道轮廓是否形成凸包,我必须修改 Graham 扫描。我决定使用以下程序。首先,我使用格雷厄姆扫描到凸包。我保存在一个新向量中的包。然后我从向量中删除凸包的点matrix
。然后我必须只对新向量中的剩余点进行排序,为此我将使用距离和点积。
为此,我启动了 Graham 扫描程序。我把自己定位在这个链接上。
所以这是我到目前为止所拥有的:
int ccw(const std::array<double, 3>& s1, const std::array<double, 3>& s2,const std::array<double, 3>& origin)
{
std::array<double, 3> v1, v2;
int cp_z;
v1[0] = (s1[0] - origin[0]);
v1[1] = (s1[1] - origin[1]);
v2[0] = (s2[0] - origin[0]);
v2[1] = (s2[1] - origin[1]);
cp_z = v1[0] * v2[1] - v1[1] * v2[0];
if(cp_z > 0)
return CCW_LEFT_TURN;
else if(cp_z < 0)
return CCW_RIGHT_TURN;
return CCW_COLINEAR;
}
bool compare_angle(const std::array<double, 3>& s1, const std::array<double, 3>& s2)
{
int res;
std::array<double, 3> p0;
p0[0]=0;
p0[1]=0;
res = ccw(s1, s2, p0);
if(res == CCW_LEFT_TURN)
return true;
else if(res == CCW_COLINEAR) {
double da, db;
da = Distance(p0, s1);
db = Distance(p0, s2);
if(da < db)
return true;
}
return false;
}
void set_p0(std::vector<std::array<double, 3>> matrix)
{
int i;
for(i=1; i<matrix.size(); i++)
{
if(matrix[i][1] < matrix[0][1])
{
swap(matrix[0], matrix[1]);
}
else if(matrix[i][1] == matrix[0][1] && matrix[i][0] < matrix[0][0])
{
swap(matrix[0], matrix[i]);
}
}
}
void GrahamScan(std::vector<std::array<double, 3>> matrix, std::vector<std::array<double, 3>> chull)
{
int i;
bool done;
std::array<double, 3> next2last, last;
set_p0(matrix);
sort(matrix.begin()+1, matrix.end(), compare_angle);
chull.push_back(matrix[0]);
chull.push_back(matrix[1]);
for(i=2; i<matrix.size(); i++)
{
done = false;
while(!done && chull.size() > 1) {
last = chull.back();
next2last = chull[chull.size()-2];
if(ccw(last, matrix[i], next2last) != CCW_LEFT_TURN)
chull.pop_back();
else
done = true;
}
chull.push_back(matrix[i]);
}
}
void GeneratPath(const std::vector<std::vector<LineSegment>> &slicesWithLineSegments, const v3 &aabbSize, const double infill) {
ofstream file ("data.csv");
std::vector<std::array<double, 3>> matrix;
std::vector<std::array<double, 3>> chull;
.
.
.
if(matrix.size()>2)
{
GrahamScan(matrix, chull);
}
}
所以在函数中GeneratPath
我想对点进行排序。为此,我将调用 GrahamScan 函数,它传递两个向量和 。matrix
我首先使用 搜索具有最低 y 值的点。接下来我必须对点进行排序。因此我使用 C++ 提供的排序功能。作为参数,我使用函数。我找到的原始函数如下所示:chull
GrahamScan
set_p0
compare_angle
struct point_angle_comp_p {
point_t p0;
point_angle_comp_p () : p0 (0, 0) { }
point_angle_comp_p (const point_t &p) : p0 (p) { }
bool operator() (const point_t &a, const point_t &b)
{
int res;
res = ccw (a, b, p0);
if (res == CCW_LEFT_TURN)
return true;
else if (res == CCW_COLINEAR) {
double da, db;
da = dist (p0, a);
db = dist (p0, b);
if (da < db)
return true;
}
return false;
}
};
由于我的模板中的函数是基于结构的,因此我不得不为我的目的重写该函数。但是,如果我现在发送程序,我会收到错误消息:表达式:向量迭代器 + 偏移超出范围。
我看不到我在哪里犯了错误,但不幸的是。有人可以在这里帮助我吗?