Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка окружностей на пересечение 
:(
    Опции темы
factura
Дата 10.1.2014, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.1.2014

Репутация: нет
Всего: нет



Дан файл, содержащий сведения об окружностях (радиус и координаты центра). Переписать в файл G все уединенные окружности, т.е. окружности, не имеющие пересечений с другими окружностями. Реализовать на двоичных файлах с помощью структур данных (struct). 
Со структурой и файлом разобрались, а вот как проверить окружность на пересечение никак не до тумкаем, задача не сложная просто мы уже с другом запарились, кучу задач переделали, уже мозги кипят...
PM MAIL   Вверх
maxim1000
Дата 10.1.2014, 22:11 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



Если расстояние между центрами меньше разницы радиусов, одна окружность внутри другой.

Если расстояние между центрами больше суммы радиусов, окружности не пересекаются и ни одна не находится внутри другой.

Иначе они пересекаются.


--------------------
qqq
PM WWW   Вверх
bata
Дата 16.1.2014, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 12.1.2014

Репутация: нет
Всего: нет



Задание: Дан файл, содержащий сведения об окружностях (радиус и координаты центра). Переписать в файл G все уединенные окружности, т.е. окружности, не имеющие пересечений с другими окружностями. Реализовать на двоичных файлах с помощью структур данных (struct). В общем то запись в файл и чтение из него затруднений не вызвали Но я всё думаю как рациональнее проверить окружности на пересечение в массиве

FILE f,g;

Код

struct Round
{
double X,Y;
double radius;
};

Round UED(Round x1,Round x2,Round y1,Round y2,Round r1,Round r2)
{
Round len.radius= sqrt((x2.X - x1.X) * (x2.X - x1.X) + (y2.Y - y1.Y) * (y2.Y -y1.Y));
    if (len.radius > r1.radius + r2.radius)
      return len;
}

void main()
{
system("color F0");
setlocale(LC_ALL,"Russian");
int n;
printf("Введите количество окружностей: ");
scanf("%d",&n);
if(n<2)
printf("Это не о чём не говорит\n");
Round O;
f=fopen("data.okr","wb");
for(int i=0;i<n;i++)
{
  printf("Введите координаты центра окружности: ");
  scanf("%lg%lg",&O.X,&O.Y);
  printf("Введите длину радиуса окружности: ");
  scanf("%lg",&O.radius);
  fwrite(&O,sizeof(Round),1,f);
}
 printf("Данные внесены\n");
fclose(f);
Round *okr;
okr=new Round[n];
int i=0;
fopen("data.okr","rb");
while(true)
{

    fread(&okr[i],sizeof(Round),1,f);
     if(feof(f))
         break;
     printf("\nкоординаты центра окружности: %lg\t %lg ",okr[i].X,okr[i].Y);
     printf(" \nдлина радиуса окружности: %lg",okr[i].radius);
     i++;
}
fclose(f);
_getch();
}

По требованию препода данные в функцию
Код


Round UED(Round x1,Round x2,Round y1,Round y2,Round r1,Round r2)
 { Round len.radius= sqrt((x2.X - x1.X) * (x2.X - x1.X) + (y2.Y - y1.Y) * (y2.Y -y1.Y));
 if (len.radius > r1.radius + r2.radius)
 return len;
 } 

Должны подаваться через массив, не уж то 3 цикла заводить???
PM MAIL   Вверх
feodorv
Дата 18.1.2014, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(bata @  16.1.2014,  19:04 Найти цитируемый пост)
f=fopen("data.okr","rb");



Цитата(bata @  16.1.2014,  19:04 Найти цитируемый пост)
Должны подаваться через массив, не уж то 3 цикла заводить??? 

Имелось в виду:
Код
bool UED( Round *list, int circle1, int circle2)
{
  ...
}

А у Вас в UED передаются данные 6 окружностей (вот зачем?), а возвращается вообще не пойми что (и это компилируется?).
О том, как правильно реализовать UED, хорошо написал maxim1000.


Сама функция UED нигде не используется, а ведь должно быть что-то вроде такого:
Код
for( int i =0; i < n; ++i)
{
  bool isUed = true;
  
  for( int j = 0; j < n; ++j)
    if( i != j )
      if( !UED( okr, i, j) )
      {
         isUed = False;
         break;
      }

  if( isUed ) 
  {
    /* 
      Вывод в файл G данных окружности okr[i], 
      так как она не пересекается с другими окружностями 
    */
  }
}



Цитата(bata @  16.1.2014,  19:04 Найти цитируемый пост)
FILE f,g;

Зачем объявлено g, если используется всё равно только f? 

Это сообщение отредактировал(а) feodorv - 18.1.2014, 02:51


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0419 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.