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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2011, 10:21   #1
Ganez
 
Регистрация: 25.10.2010
Сообщений: 8
По умолчанию Задача на с++

Привет всем!

Не могу понять как сделать вот эту задачу:

Дан файл координат вершин ломаной линии на плоскости. Удалить из файла те вершины, которые находятся внутри выпуклой многоугольной оболочки, охватывающей ломаную линию.

может кто подскажет хотябы как делать?
Ganez вне форума Ответить с цитированием
Старый 10.01.2011, 13:03   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Первое что приходит в голову - это в лоб для каждой точки брать две соседнии и на основе каждой из них строить каноническое уравнение прямой, затем для каждого уравнения проверять имеет ли данная прямая пересечения с другими сторонами {отрезками} (уравнение сторон также строятся по 2-м точкам и преобразуется в канонический вид). Отвечал на подобные вопросы с полным решением раза 3, правда на delphi, но главное идея.
C вас наработки - с нас помощь.

Последний раз редактировалось eoln; 10.01.2011 в 13:06.
eoln вне форума Ответить с цитированием
Старый 12.01.2011, 18:24   #3
Ganez
 
Регистрация: 25.10.2010
Сообщений: 8
По умолчанию

спасибо, буду пробывать
Ganez вне форума Ответить с цитированием
Старый 12.01.2011, 21:45   #4
Ganez
 
Регистрация: 25.10.2010
Сообщений: 8
По умолчанию

каноническое уравнение прямой

(x-x0)/m = (y-y0)/n

такое?


так x будет неизвестным? и игрик тоже?

и плюс откуда взять m и n

Последний раз редактировалось Ganez; 12.01.2011 в 21:51.
Ganez вне форума Ответить с цитированием
Старый 13.01.2011, 22:24   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию


Не важен вид уравнения (каноническое, общее или ещё какое), главное чтобы работать было удобно. Берём последовательные пары точек и на их основе составляем уравнения прямых, например для точек X(x1, y1) и Y(x2, y2), имеем общее уравнение :
A12*x+B12*y+C12=0, где
A12=y1-y2
B12=x2-x1
C12=x1*y2-x2*y1

Теперь ищем точку пересечения этой прямой со всеми другими прямыми.
Например, найдём точку пересечения с прямой на точках (x5, y5) и (x6, y6), которое имеет уравнение
A56*x+B56*y+C56=0, где
A56=y5-y6
B56=x6-x5
C56=x5*y6-x6*y5

x0=(B12*C56-B56*C12)/(A12*B56-A56*B12)
y0=(C12*A56-C56*A12)/(A12*B56-A56*B12)
(x0, y0) - точка пересечения (следует предусмотреть существование этой точки, т.к. если прямые параллельны, то знаменатель обратится в ноль)
Итак, если точка существует (знаменатель не нулевой), то проверим принадлежит ли эта точка исходной стороне (применим свойство "лежать между")
Предположим что x1<=x2 иначе поменяем их местами (аналогично y1<=y2), тогда
ЕСЛИ (x5<=x0<=x6) и (y5<=y0<=y6) ТО данная пара точек нам неинтересна

Если после всех проверок "интерес" не потерян, то точки остаются в файле
Всё вышесказанное теперь применяем ко всем возможным комбинациям точек (перестановки не считаются). Смежные отрезки проверять не надо - это бесполезно, они всегда пересекаются

Последний раз редактировалось eoln; 13.01.2011 в 22:35.
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача по С++ Влад09 Помощь студентам 1 20.11.2010 01:31
Задача... Katrinna Помощь студентам 4 16.11.2010 22:58
Задача по СИ++ XOKS Общие вопросы C/C++ 3 21.09.2010 09:58