#include <stdio.h>//находит максимум/минимум неправильно
#define SIZE 100
#define PNUM 16
int find_arr_size (int* arr, int* arr_size) //ограничение на количество вершин в файле = SIZE, определяем реальное количество вершин
{
int i = 0;
arr_size = SIZE;
for (i = 0 ; i < SIZE ; i++)
{
if ((arr[i] == 0) && (arr[i+1] == 0) && (arr[i+2] == 0) && (arr[i+3] == 0))
{
arr_size = i - 1;
break;
}
}
return arr_size;
}
int findmaxx (int arr[], int arr_size) //максимальное значение х
{
int number, maximum, i;
number = maximum = 0;
for (i = 0 ; i < 2 * arr_size ; i++)
{
number = arr[i];
if (i % 2 == 0)
{
if (number > maximum)
{
maximum = number;
}
}
}
return maximum;
}
int findminx (int arr[], int arr_size) //минимальное значение х
{
int number, minimum, i;
number = minimum = 0;
for (i = 0 ; i < 2 * arr_size ; i++)
{
number = arr[i];
if (i % 2 == 0)
{
if (number < minimum)
{
minimum = number;
}
}
}
return minimum;
}
int findmaxy (int x, int arr[], int arr_size) //максимальный у для заданного х, пихать надо массив со ВСЕМИ точками
{
int number, maximum, i;
number = maximum = 0;
for (i = 0 ; i < 2 * arr_size ; i++)
{
if (i % 2 == 0) // элементы с четными индексами - иксы
{
if (arr[i] == x) // берем все точки с необходимым иксом и ищем там самую большую
{
number = arr[i+1];
if (number > maximum)
{
maximum = number;
}
}
}
}
return maximum;
}
int findminy (int x, int arr[], int arr_size) //минимальный у для заданного х, пихать надо массив со ВСЕМИ точками
{
int number, minimum, i;
number = minimum = 0;
for (i = 0 ; i < 2 * arr_size ; i++)
{
if (i % 2 == 0)
{
if (arr[i] == findmaxy(x, arr, arr_size))
{
number = arr[i+1];
if (number < minimum)
{
minimum = number;
}
}
}
}
return minimum;
}
int calculate_area (int arr[], int arr_size) //подсчет площади столбиками, дырки пропускает
{
int maxx = findmaxx(arr, arr_size);
int minx = findminx(arr, arr_size);
int i;
int area = 0;
for (i = 0; i < (maxx-minx)+1 ; i++)
{
area += findmaxy(i, arr, arr_size) - findminy(i, arr, arr_size);
}
return area;
}
int main()
{
FILE *figure;
figure = fopen("figure.txt", "r");
int arr[SIZE] = {0};
int arr_size = 0;
int i, j, k, s;
i = 0;
int arrcomplete[PNUM] = {0}; // тут в итоге будут ВСЕ точки
int ymax, ymin, amount, number; //amount - количество промежуточных по горизонтали точек
ymax = ymin = amount = 0;
while (fscanf(figure, "%d", &arr[i]) != EOF) //получили координаты вершин
{
//printf("%d ", arr[i]);
i++;
}
fclose(figure);
arr_size = find_arr_size(arr, arr_size); //знаем количество вершин
i = j = k = s = 0;
printf("\n started");
//вот этот кусок работает неправильно, тут мы кладем в массив arrcomplete все точки
for (i = 0; i < 2 * arr_size ; i++)
{
//printf("i=%d ", i);
for (j = 0 ; j < 2 * arr_size ; j++)
{
//printf("j=%d ", j);
if ((arr[i] == arr[j]) && (arr[i] % 2 == 1) && (arr[j] % 2 == 1) && (arr[i-1] != arr[j-1])) // все пары точек с одинаковыми У
{
if (arr[i-1] > arr[j-1]) //для каждой пары смотрим, у кого х больше
{
ymax = arr[i-1];
ymin = arr[j-1];
}
else
{
ymax = arr[j-1];
ymin = arr[i-1];
}
for (k = 0 ; k < (ymax - ymin) ; k++) //прогоняем все иксы в этом промежутке, включая сами точки
{
number = k + ymin; //х точки пробегает от ymin до ymax
for (s = 0 ; s < PNUM ; s++) //проверяем, нет ли такой точки уже
{
if (arrcomplete[s] == number) //если есть, зануляем данный х (просто так х никогда не равен -1)
{
number = -1;
}
if (number != -1) //новая точка! увеличиваем кол-во точек и записываем эту
{
arrcomplete[amount] = number;
amount++;
//printf("FOUND");
}
}
}
printf("\ny: %d xs: %d %d", arr[i], arr[i-1], arr[j-1]); //
}
}
}
printf("\n ended");
printf("\nAMOUNT: %d", amount); // для тестируемой фигуры это число всех точек 42
printf("\narea: %d", calculate_area(arrcomplete, arr_size + amount)); //уже для всего массива. должна быть 38
return 0;
}
//координаты тестовой фигуры:
/*
0 5
0 0
3 2
3 5
5 2
5 4
5 0
5 1
8 1
8 2
8 4
8 6
9 4
9 2
12 6
12 4
*/