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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как определить координаты самопересечение ломаной 
:(
    Опции темы
factura
Дата 9.1.2014, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дайте алгоритм действий

вот код программы для более ясной картины

Код

#include <conio.h>
#include <stdio.h>
#include <locale.h>
FILE *f,*g;
struct Point
{
int X,Y;
};
void main()
{
setlocale(LC_ALL,"Russian");
printf("ЗАПОЛНЕНИЕ ФАЙЛА\n");
printf("Количество вершин: ");
int n;
Point *line;
f=fopen("data.line","wb");
scanf("%d",&n);
line=new Point[n];
for(int i=0;i<n;i++)
{
printf("Координата №:%d\n",i+1);
printf("--------------\n");
printf("Введите Х:");
scanf("%d",&line[i].X);
printf("Введите Y:");
scanf("%d",&line[i].Y);
printf("--------------\n");
fwrite(&line[i].X,sizeof(line),1,f);
fwrite(&line[i].Y,sizeof(line),1,f);
}
delete[] line;
fclose(f);
printf("____________________________________________________ ____________________________\n");
printf("СЧИТЫВАНИЕ ДАННЫХ ИЗ ФАЙЛА\n");
Point *line2=new Point[n];
f=fopen("data.line","rb");
if(f==NULL)
printf("Файл не содержит данных\n");

for(int i=0;i<n;i++)
{
fread(&line2[i].X,sizeof(line2),1,f);
fread(&line2[i].Y,sizeof(line2),1,f);
printf("\nКоордината №:%d",i+1);
printf("\n--------------");
printf("\nХ=");
printf("%d",line2[i].X);
printf("\nY=");
printf("%d",line2[i].Y);
printf("\n--------------");
}
fclose(f);
printf("\n__________________________________________________ ______________________________");
printf("ОПРЕДЕЛЯЕМ ИМЕЕТ ЛИ ЛОМАНАЯ ЛИНИЯ САМОПЕРЕСЕЧЕНИЯ\n");
g=fopen("Point.pt","wb");
int PX,PY,point;
for(int i=0;i<n;i++)
{

}
fclose(g);


printf("____________________________________________________ ____________________________\n");
_getch();
}
Код




Пытаюсь работать с отрезками
Саму формулу расчёта я знаю, но не знаю как применить это всё к массивам
У меня вариантов уже нет, буду благодарен

Добавлено через 11 минут и 45 секунд
 smile 

Это сообщение отредактировал(а) factura - 9.1.2014, 18:15
PM MAIL   Вверх
factura
Дата 9.1.2014, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 smile 
PM MAIL   Вверх
akizelokro
Дата 10.1.2014, 08:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Например, у тебя отрезок ломаной (0,0)-(1,1). И потом несоседний отрезок ломаной (0,3)-(1,3). массивы размерностями 2x2 и 3х3. Начало массивов в точке (0,0). Перебор по пересечению. Указываешь в массивах, отображающих отрезки, точки ломаной как 1, остальное -0.

for(x=0; x< 2; x++)
  for(y=0; y < 2; y++)
{
  if(massiv1[x,y] && massiv2[x,y])
   // точка пересечения
}
Это в случае точного пересечения. Потому что ты работаешь с целыми числами, а искомая точка пересечения может быть где-то между ними. Там идёт ещё одно условие, что massiv1[x0, y0] == 1, massiv1[x1,y1] == 1 (x0 +1 = x1) не пересекается с massiv2[x0, y2] massiv2[x1, y3], если y0> y2 и  y1 > y3 (или наоборот, y0 < y2 и y1 < y3). Правда, здесь точка пересечения по идее должна быть в координате с нецелым значением x



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
baldina
Дата 10.1.2014, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



Цитата(factura @  9.1.2014,  18:12 Найти цитируемый пост)
Саму формулу расчёта я знаю, но не знаю как применить это всё к массивам

"это применяется" не к массивам, а к отрезкам. простейшее решение - сравнивать каждый отрезок с каждым. у тебя в программе пустой цикл, в котором и надо обнаруживать пересечения, только циклов должно быть два. 
допустим, формулу расчета реализует функция
Код

bool intersect (Point start1,  Point end1, Point start2, Point end2); // start, end - концы отрезка

её нужно вызвать во внутреннем цикле
Код

for (int i=0; i < n-1; ++i) {
  for (int j=0; j < n-1; ++j) {
     if (i != j) // сравниваем только разные отрезки
        if (intersect (line[i], line[i+1], line[j], line[j+1]) {
              // пересечение найдено
        }
  }
}




Это сообщение отредактировал(а) baldina - 10.1.2014, 09:37
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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