назначить ячейку координатам в сетке 3 на 3 - PullRequest
0 голосов
/ 22 марта 2012

Я читаю некоторые координаты из файла и пытаюсь присвоить им значения ячеек (0-2), погрузив их в сетку 3х3. Для некоторых значений код присваивает отрицательные значения ячеек, например, для 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";

}

1 Ответ

1 голос
/ 22 марта 2012

Первая проблема, которую я вижу, это когда вы пытаетесь найти максимальные и минимальные значения 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;
}

Как написано, это предотвращает анализ значений y, когда x является новым максимумомили мин.Это вызовет проблемы с остальной частью вашей программы, так как 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 вызывает проблемы в следующем разделе:

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 равно нулю, то вы никогда не будете присваивать значение ячейке_x [i], то есть оно все равно будет установлено в значение инициализации, котороеможет быть отрицательным числом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...