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