Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/55: Рейтинг темы: голосов - 55, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 06.02.2015
Сообщений: 4

Множество точек определяет ломаную. Имеет ли она самопересечения?

04.02.2009, 18:06. Показов 11119. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, пожалуйста, кто-нибудь!

В задачах предполагается, что во входном файле записана последовательность пар чисел, которые можно рассматривать как координаты множества точек на плоскости.
Для представления геометрических объектов нужно использовать структуры.
Во всех задачах в начале входного файла стоит число = количеству ПАР чисел, идущих после этого числа, т.е. размерность вектора структур { double x,y; }, в который эти пары можно поместить.
1. Множество точек определяет ломаную. Имеет ли она самопересечения? Ответ: 1 - да, 0 - нет.
2. Множество точек определяет многоугольник. Для данной точки определить, где она расположена относительно этого многоугольника: внутри, снаружи, на границе. Ответ: 1 - внутри, -1 - снаружи, 0 - на границе.
Круг задается 3 последними числами:
координаты центра
радиус

0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.02.2009, 18:06
Ответы с готовыми решениями:

Множество точек образуют ломаную; определить, имеет ли она самопересечения?
Множество точек образуют ломаную,имеет ли она самопересечения? Задачи на множества точек. Ничего не могу найти по этой теме.

Определить, имеет ли ломаная линия самопересечения
Даны действительные числа х1,у1, х2,у2, хn,уn. Известно, что все они различны. Рассматривается ломанная, которая соединяет эти точки....

Подсчитать число точек самопересечения ломаной
На плоскости дана ломаная, каждое из звеньев которой перпендикулярно биссектрисе одного из углов, образованных координатными осями....

8
32 / 32 / 4
Регистрация: 29.12.2008
Сообщений: 75
05.02.2009, 18:52
В общем, не хочу за тебя просто так писать программу. Скажу только алгоритм выполнения. Думаю, дальше ты справишься.

Задача 1.
Эта задача сводится к тому, что надо определить, пересекаются ли два заданных отрезка. Обозначим координаты концов первого отрезка за (x1a,y1a) и (x1b,y1b). Координаты концов второго - (x2a,y2a) и (x2b,y2b).

Вводим величины
k1 = (y1b-y1a)/(x1b-x1a),
k2 = (y2b-y2a)/(x2b-x2a).

Далее находим

x = (y2a-y1a+k1*x1a-k2*x2a)/(k1-k2)
y = k1*(x-x1a)+y1a

Далее находим значения
d1a = sqrt((x1a-x)^2+(y1a-y)^2)
d1b = sqrt((x1b-x)^2+(y1b-y)^2)
d1 = sqrt((x1b-x1a)^2+(y1b-y1a)^2)

d2a = sqrt((x2a-x)^2+(y2a-y)^2)
d2b = sqrt((x2b-x)^2+(y2b-y)^2)
d2 = sqrt((x2b-x2a)^2+(y2b-y2a)^2)

Отрезки пересекаются, если имеет место равенства:
d1a+d1b = d1
d2a+d2b = d2

(эти два равенства должны выполняться одновременно).

Перебрав все возможные пары звеньев ломанной, можно определить, пересекает ли эта ломанная саму себя.

Добавлено через 20 минут 18 секунд
Задача 2.
Первое, что нужно сделать - это найти площадь всего многоугольника целиком. Для этого разбиваешь его на несколько треугольников, проводя все возможные диагонали из одной вершины. Площадь всего многоугольника находится как сумма площадей всех полученных треугольников.

Площадь треугольника, координаты вершин которого есть (x1,y1), (x2,y2) и (x3,y3) можно найти как
St = abs((x1-x3)(y2-y3) - (y1-y3)(x2-x3))/2.

Обозначим за Sm площадь многоугольника.

Далее соединяем точку, положение которой относительно многоугольника нужно найти также со всеми вершинами многоугольника. Получим несколько треугольников. Находим суммарную площадь всех этих треугольников. Обозначим ее буквой S.

Если S>Sm, то точка лежит вне многоугольника.
Если S=Sm, то точка лежит на границе многоугольника.
Если S<Sm, то точка лежит внутри многоугольника.

Жаль, но все сказанное справедливо только для выпуклого многоугольника. Для невыпуклого вопрос пока остается открытым.

Добавлено через 22 часа 59 минут 36 секунд
Жаль, но все сказанное справедливо только для выпуклого многоугольника. Для невыпуклого вопрос пока остается открытым.
В принципе, и для невыпуклого многоугольника тоже подходит. Но надо правильно рассчитать площадь этого невыпуклого многоугольника.
0
32 / 32 / 4
Регистрация: 29.12.2008
Сообщений: 75
09.02.2009, 18:49
В принципе, и для невыпуклого многоугольника тоже подходит. Но надо правильно рассчитать площадь этого невыпуклого многоугольника.
Для рассчета площади невыпуклого многоугольника можно воспользоваться следующим алгоритмом.

1. Выбрать 1-ю вершину мгногоугольника (номер, естественно, условный).
2. Провести от нее все возможные диагонали. Т.е. разбить многоугольник на треугольники.
3. Вычислить сумму площадей всех получившихся треугольников.
4. Взять 2-ю вершину многоугольника и выполнить для нее действия пунктов 2 и 3.
5. Аналогично поступаем с 3, 4, 5 и т.д. вершинами.

За истинную площадь многоугольника принимаем наименьшую из полученных сумм площадей треугольников.
0
heaRtseAs
22.02.2009, 14:34
мне не совсем понятно, почему алгоритм решения первой задачи верен.
Не могли бы вы объяснить это?

Добавлено через 26 минут 3 секунды
Вы находите, пересекаются ли прямые, которым принадлежат отрезки, а потом оцениваете, где находится точка пересечения? я правильно понимаю?
и еще один, возможно, совсем глупый вопрос, скажите, пожалуйста, в чем основное отличие кодирования структур от кодирования массивов?
нужно написать несколько программ, а как - не могу до конца разобраться.
Допустим, вот мы выделили память, считали из файла данные
C++
1
2
3
4
5
6
7
8
9
while (fscanf(f,"%f",&c)==1)
       n++;
    n=n/2;
    arr=(struct koord*)malloc(sizeof(struct koord)* n);
    for (i=0; i<n; i++)
    {
       fscanf(f,"%f",&arr[i].x);
       fscanf(f,"%f",&arr[i].y);
    }
А как дальше разбить на начала и концы отрезков?
zinurzhan
13.11.2011, 13:43
можете пожалуйста написать программу 1, а то я в с не очень
 Аватар для Andrey B
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
06.02.2015, 17:42
Пожалуйста необходима помощь в исправлении этой же задачи !
Имеет ли ломанная точку самопересечения
1- да 0 -нет

Очень плохо работаю со структурами но алгоритм нахождения точки пересечения правильный
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
 
 
typedef struct 
 
{ int x; int y; } point; 
 
typedef struct 
{ 
point p1; point p2;
 
} line; 
 
int check_lines(line, line, point);
 
 
int check_lines(line *line1, line *line2, point *hitp) { 
 
int d = (line2->p2.y - line2->p1.y)*(line1->p2.x-line1->p1.x) - (line2->p2.x - line2->p1.x)*(line1->p2.y-line1->p1.y); 
int n_a = (line2->p2.x - line2->p1.x)*(line1->p1.y-line2->p1.y) - (line2->p2.y - line2->p1.y)*(line1->p1.x-line2->p1.x); 
int n_b = (line1->p2.x - line1->p1.x)*(line1->p1.y - line2->p1.y) - (line1->p2.y - line1->p1.y)*(line1->p1.x - line2->p1.x);  
if(d == 0) return 0; 
int ua = (n_a << 14)/d; int ub = (n_b << 14)/d; 
 
{ hitp->x = line1->p1.x + ((ua * (line1->p2.x - line1->p1.x))>>14); hitp->y = line1->p1.y + ((ua * (line1->p2.y - line1->p1.y))>>14); return 1; } 
return 0; 
 
}
 
 
int task(char *FileName)
{
line *all_lines;
point  *points;
 
FILE *f_in,*f_out;
int n,rez,i,j;
    
    f_in=fopen("in.txt","r");
    f_out=fopen("out.txt","w");
 
    fscanf(f_in,"%d",&n);
    if (n<=2) return -777; else 
 
    points=(point*)malloc(sizeof(point)*(n+2));
    all_lines=(line*)malloc(sizeof(line)*(n+2));
 
        for(i=0;i<n;i++)
        {
            fscanf(f_in,"%lf%lf",&all,&points[i].y);
        }
            
                
 
                    for(i=1;i<n;i++)
                    {
                        for(j=1;j<n-1;j++)
                        {
                            rez=check_lines(&all_lines[i],&all_lines[i+1],&points[i]);
                            
                            if(rez==1)
                            {
                                fprintf(f_out,"%d",rez);
                                return 0;
                            }
                        }
                    }
    
                    fprintf(f_out,"%d",rez);
                
                        
    fclose(f_in);
    fclose(f_out);
    free (all_lines);
    free (points);
    return 0;
}
Добавлено через 17 минут
Пожалуйста очень нужна Ваша Помощь !!
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
06.02.2015, 18:46
В задаче 1 я бы основовался на уравнении отрезка. Вот оно в векторном виде: X = A*t - (1-t)*B 0<=t <=1
Т.е если система из таких уравнений и неравенств относительно 2-х неизвестных s, t имеет решение - они пересекаются, иначе - нет
Ax*t + Bx*(t-1) = Cx*s +Dx*(1-s)
Ay*t + By*(t-1) = Cy*s +Dy*(1-s)
0 <= t <= 1
0 <= s <= 1
Ax, Ay... -здесь координаты точек
1
 Аватар для Andrey B
170 / 122 / 61
Регистрация: 06.02.2015
Сообщений: 300
06.02.2015, 20:02
Спасибо за ответ но переделывать времени уже не осталось
Предположим что условие check_lines правильно определяет пересечения
Можете тогда помочь с правильной постановкой цикла и выводом ответа
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
06.02.2015, 21:09
C++
1
2
3
4
5
6
7
8
for(i=1; i<n;i++) 
  for(j=0; j<i; j++) {
     if (check_line(line[i], line[j])) break;
  }
   if (j < i) break;
}
if (i<n) cout << "Пересекаются";
else cout<<"Нет пересечений";
(Псевдокот)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2015, 21:09
Помогаю со студенческими работами здесь

Множество точек сферы и множество точек плоскости эквивалентны
Доказать, что множество точек сферы и множество точек плоскости эквивалентны.

Добавление точек в замкнутую ломаную линию
Всем здравствуйте. Есть массив точек (изначально он может состоять только из 1 точки). Интересует как добавить точки в ЗАМКНУТУЮ...

Дано n точек на плоскости, за время n*logn построить (n-1)-звенную ломаную
Дано n точек на плоскости, заданных своими декартовыми координатами. За время n*logn построить (n-1)-звенную не пересекающую себя ломаную,...

Дано 20 натуральных чисел. Каждая пара чисел определяет положение вершины ломаной на экране. Построить ломаную
а можно эту программу в с++? спасибо

Докажите, что если линейная система с целыми коэффициентами имеет какой-то решение, то она имеет решение в Q
Здравствуйте. Помогите с доказательством, пожалуйста: &quot;Докажите, что если линейная система с целыми коэффициентами имеет какой-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru