C++ 将单元格指定给3×3栅格中的坐标

C++ 将单元格指定给3×3栅格中的坐标,c++,visual-c++,C++,Visual C++,我正在从一个文件中读取一些坐标,并试图通过将它们放入一个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, mi

我正在从一个文件中读取一些坐标,并试图通过将它们放入一个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";

}
int x_点[99];
积分[99];
int i=0;
int x,y;
int max_x,max_y;
int min_x,min_y;
while(out.good())
{
out>>x;
out>>y;
如果(i==0)
{
max_x=x;
min_x=x;
最小值y=y;
max_y=y;
}
如果(x>max_x),则为else
{
max_x=x;
}
其他的
如果(x<最小值x)
{
min_x=x;
}
否则,如果(y>最大值y)
{
max_y=y;
}
其他的
如果(y对于(i=0;i,我看到的第一个问题是,您试图找到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;
}
如果max_x=8,min_x=0,则代码将导致x_width=8/3,或约为2.666666667。但0-8可以分为3组,每组3个。添加1可通过计算点数而不是直线长度来纠正这一问题

它还可以防止宽度为0,如果max_x==min_x,则会发生这种情况。宽度为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;
}
for(int j=0;j=0和<0*/

如果(j*x_宽度如果代码格式正确,您可能会发现调试代码和发现错误更容易。我不知道如何在stackoverflow中对其进行格式设置。但我会尝试进一步改进我的格式设置。抱歉,但当我运行调试器时,它确实包含相应的值。您能附加您看到的实际输出吗?我已经更正了代码,但我没有我无法解释xwidth=0。非常感谢你的回答。现在应该可以了。如果你喜欢这个问题,你能给出+1吗?
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;
}