我正在从文件中读取一些坐标,并尝试通过将其跳入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/

10-11 22:46
查看更多