我正在从文件中读取一些坐标,并尝试通过将其跳入3x3网格来为它们分配单元格值(0-2)。对于某些值,代码将分配负单元格值,例如x = 268或x = 269。我要去哪里错了?
我有以下文件output.txt:
76 62
77 62
78 62
79 62
81 62
83 62
86 62
etc
分配单元格的代码:
int x_points[99];
int y_points[99];
int i=0;
int x,y;
int max_x, max_y;
int min_x, min_y;
while(out.good())
{
out>>x;
out>>y;
if(i==0)
{
max_x=x;
min_x=x;
min_y=y;
max_y=y;
}
else if (x>max_x)
{
max_x=x;
}
else
if(x < min_x)
{
min_x=x;
}
else if (y>max_y)
{
max_y=y;
}
else
if(y < min_y)
{
min_y=y;
}
x_points[i]=x;
y_points[i]=y;
i++;
}
for(i=0; i<99; i++)
cout<<x_points[i]<<","<<y_points[i]<<"\n";
int cells_x[99];
int cells_y[99];
float x_width;
float y_width;
int divide = 3;
//To find out the cells. Divide it by 20
x_width=(max_x-min_x)/divide;
y_width=(max_y-min_y)/divide;
cout<<"\nx_width:"<<x_width;
cout<<"y_width:"<<y_width<<"\n";
int x1;
int y1;
for(i=0; i<99; i++)
{
x1=x_points[i]-min_x;
y1=y_points[i]-min_y;
for(int j=0; j<divide; j++)
{
if(j*x_width<=x1 && x1<((j+1)*x_width))
cells_x[i]=j;
if(j*y_width<=y1 && y1<((j+1)*y_width))
cells_y[i]=j;
}
cout<<cells_x[i]<<" "<<i<<" "<<cells_y[i]<<"\n";
}
最佳答案
我看到的第一个问题是您尝试查找x和y的最大值和最小值的地方:
if(i==0)
{
max_x=x;
min_x=x;
min_y=y;
max_y=y;
}
else if (x>max_x)
{
max_x=x;
}
else if(x < min_x)
{
min_x=x;
}
else if (y>max_y) /* <-- This should not have an else! */
{
max_y=y;
}
else if(y < min_y)
{
min_y=y;
}
如前所述,当x为新的最大值或最小值时,它可防止分析y值。这将导致程序其余部分出现问题,因为max_y和min_y实际上不包含max和min。
接下来是计算x_width和y_width:
x_width=(max_x-min_x)/divide; // should be x_width=(max_x-min_x + 1)/divide;
y_width=(max_y-min_y)/divide; // y_width=(max_y-min_y + 1)/divide;
如果max_x = 8,并且min_x = 0,则您的代码将导致x_width = 8/3,或大约2.6666666666666666666666666666667。但是0-8可以分为3组,每组3个。加1可通过计算点数而不是线的长度来纠正此问题。
它还可以防止宽度为0,如果max_x == min_x,则宽度为0。宽度0会在下一节中引起麻烦:
for(int j=0; j<divide; j++)
{
/* an x_width of 0 will cause this to never evaluate to true */
/* x1 cannot ever be >= to 0 AND < 0 */
if(j*x_width<=x1 && x1<((j+1)*x_width))
cells_x[i]=j;
if(j*y_width<=y1 && y1<((j+1)*y_width))
cells_y[i]=j;
}
如果x_width为零,那么您将永远不会将值分配给cells_x [i],这意味着仍将其设置为其初始化值,该值可能为负数。
关于c++ - 将像元分配给3 x 3网格中的坐标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9822526/