Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2018, 23:09   #1
helu
 
Регистрация: 02.10.2018
Сообщений: 9
По умолчанию Язык Си.Самопересечение многоугольника.

Проверить многоугольник на самопересечение. Вот мой код, но он не работает. Может кто поможет разобраться в чём дело(
Код:
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<locale.h>
int area(int ax, int ay, int bx, int by, int cx, int cy)
{
	return (bx - ax)*(cy - ay) - (by - ay)*(cx - ax);
}

bool is_cross1(int a, int b, int c, int d)
{
	int tmp, max, min;
	if (a > b)
	{
		tmp = a;
		a = b;
		b = tmp;
	}
	if (c > d)
	{
		tmp = c;
		c = d;
		d = tmp;
	}
	if (a > c)
		max = a;
	else
		max = c;
	if (b < d)
		min = b;
	else
		min = d;

	return max <= min;
}
bool is_cross(int ax, int ay, int bx, int by, int cx, int cy, int dx, int dy)
{
	return is_cross1(ax, bx, cx, dx) && is_cross1(ay, by, cy, dy) &&
		(area(ax, ay, bx, by, cx, cy) * area(ax, ay, bx, by, dx, dy) <= 0) &&
		(area(cx, cy, dx, dy, ax, ay) * area(cx, cy, dx, dy, bx, by) <= 0);
}

bool is_cross_polygon(int x[], int y[],int num)
{
	int ax, ay, bx, by, cx, cy, dx, dy;
	for (int i = 0; i < num - 1; i++)
	{
		ax = x[i];
		ay = y[i];
		bx = x[i + 1];
		by = y[i + 1];
		for (int j = i + 2; j < num - 1; j++)
		{
			cx = x[j];
			cy = y[j];
			dx = x[j + 1];
			dy = y[j + 1];
			if (is_cross(ax, ay, bx, by, cx, cy, dx, dy))
			{
				printf("Пересекается");
				return true;
			}
		}
	}
	printf("Нe Пересекается");
	return false;
}
int main(void)
{
	setlocale(LC_ALL, "Rus");
	int x[100], y[100];
	int num = 0;
	int i = 0;
	printf("Введите количество сторон многоугольника\n");
	scanf_s("%d", &num);
	for (i = 0; i < num; i++)
	{
		printf("Введите координаты точек\n");
		scanf_s("%d %d", &x[i], &y[i]);
	}
         bool flag = is_cross;
		is_cross_polygon(x, y,num);
		_getch();
		return 0;
	}
Пожалуйста, оформляйте Ваш код согласно правилам.

Последний раз редактировалось Вадим Мошев; 04.12.2018 в 01:42.
helu вне форума Ответить с цитированием
Старый 04.12.2018, 00:59   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

А оно должно работать?

Цитата:
Сообщение от helu Посмотреть сообщение
bool flag = is_cross;
Что это? Булу присваиваете указатель на функцию или что?

Что за площади? Почему они вдруг меньше нуля могут оказаться?
Вы не можете проверить пересекаются ли две прямые? Два отрезка?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм для многоугольника dklinge Помощь студентам 9 16.10.2015 00:01
Проверка на самопересечение в "Змейке" Agiliter Общие вопросы по Java, Java SE, Kotlin 2 23.02.2014 17:41
площадь многоугольника Shenan C# (си шарп) 1 25.05.2012 22:15
Рисование многоугольника в C# vandrouny C# (си шарп) 3 11.10.2010 23:30
Задача с периметром многоугольника Abakan Общие вопросы C/C++ 1 02.01.2009 19:06