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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2012, 21:17   #1
Аруми
Пользователь
 
Аватар для Аруми
 
Регистрация: 08.11.2011
Сообщений: 24
По умолчанию пересечения квадратов

Дан файл действительных чисел, каждая тройка чисел определяет на плоскости квадрат со сторонами, параллельными координатным осям,причем первые 2 числа,определяют координаты центра квадрата, а 3 число - длину его стороны. Определить имеются ли на плоскости точки принадлежащие все квадратам.

Помогите немного разложить по полочкам. В задаче требуется найти точку пересечения квадратов, её следует искать сопостовляя координаты вершин одного квадрата с другим и т.д. Помогите составить условие, при котором следует сравнивать соответствующие вершины квадратов, а то я что-то запуталась.
Аруми вне форума Ответить с цитированием
Старый 11.04.2012, 22:06   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,332
По умолчанию

Я бы посмотрел в сторону такого алгоритма:
1. Центр одного квадрата помещаем в начало координат;
2. Вокруг этого квадрата рисуем больший квадрат. Стороны этого квадрата - положение центра второго квадрата.
3. Описываем 4-е уравнения для этих сторон (две вертикальные и две горизонтальные прямые).
4. Записываем условие попадания точки в больший квадрат.
Например: если для большего квадрата мы получили уравнения вида
xkp = a; xkl = -a; ykt = b и ykb = -b, то условие могло бы быть таким:
Код:
if ((abs(xc) < a) AND (abs(yc) < b)) Then 
{есть общие точки}
else
{Общих точек нет}
Очевидно, что если точка (а это положение центра второго квадрата) попадает в больший квадрат, то у заданных квадратов есть общие точки.

Как то так, думаю ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 11.04.2012, 22:33   #3
Аруми
Пользователь
 
Аватар для Аруми
 
Регистрация: 08.11.2011
Сообщений: 24
По умолчанию

Думаю этот вариант не подойдёт. Числа в файле должны задаваться пользователем и не факт, что там будет присутствовать такая тройка, которая соответствует квадрату с центром в начале координат. Программа должна работать в любом случае.
Аруми вне форума Ответить с цитированием
Старый 11.04.2012, 22:34   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Мой алгоритм:
1) инициализируем top, right - максимальными, bottom ,left - минимальными значениями
2) считываем 3 числа x, y, a
3) if x-a/2>left then left=x-a/2
if x+a/2<right then rigth=x+a/2
if y-a/2>bottom then bottom=y-a/2
if y+a/2<top then top=y+a/2
4) после считывания всех троек точек, если top>=bottom и right>=left, то точки есть
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 11.04.2012 в 22:44.
BDA вне форума Ответить с цитированием
Старый 11.04.2012, 23:26   #5
Аруми
Пользователь
 
Аватар для Аруми
 
Регистрация: 08.11.2011
Сообщений: 24
По умолчанию

вот) то что нужно) спасибо)
Аруми вне форума Ответить с цитированием
Старый 12.04.2012, 20:11   #6
Аруми
Пользователь
 
Аватар для Аруми
 
Регистрация: 08.11.2011
Сообщений: 24
По умолчанию

а как следует задать цикл, чтобы сравнивая координаты квадратов программа сохраняла область пересечения или, чтобы сравнивались уже пересеченные квадраты со следующим и т.д.?
Аруми вне форума Ответить с цитированием
Старый 12.04.2012, 23:22   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,332
По умолчанию

В общем то я подумал о двух квадратах. Как изменить координаты второго квадрата вычитанием, что бы первый оказался в центре системы координат не объясняю.
В том общем случае, когда квадратов много и надо определить есть ли общая область пересечения, можно написать функцию, которая вычисляет область пересечения прямоугольников с параметрами: Xc, Yc - координаты центра, a, h - ширина и высота прямоугольников.
1. Считываем данные первого прямоугольника (x1, y1, и вычисляем его границы. Пусть это будут переменные L1=Х1c-a1/2; R1=X1c+a1/2; T1=Y1c+h1/2; B1=Y1c-h1/2.
2. Считываем данные второго прямоугольника и так-же определяем его границы: L2=Х2c-a2/2; R1=X2c+a2/2; T1=Y2c+h2/2; B1=Y2c-h2/2.
3. Определяем границы области пересечения:
L = большее из {L1, L2}; R=меньшее из {R1, R2}; T= меньшее из {T1,T2}; B= большее из {B1, B2}.
4. Проверяем, что пересечение существует: L < R и T > B.
5. Функция возвращает границы пересечения через параметры и логическое значение через имя: true - есть пересечение, false - пересечения нет.
6. Если пересечения нет (функция вернула false) прекращаем работу с сообщением, что общего пересечения нет. Иначе (true) продолжаем считывать данные для следующего прямоугольника и вызывать функцию.
Пример:
Код:
Type mas = array[1..4] of real; {координаты могут быть и вещественными}
function Compare(p1,p2: mas; var p3: mas) : boolean;
begin
   if p1[1] >= p2[1] then
      p3[1] := p1[1];
   else
      p3[1]  := p2[1];
...
   If ((p3[2] > p3[1]) AND (p3[3] < p3[4])) Then
      Compare := True;
   Else
      Compare := False;
end;

var p1, p2, p3 : mas;
Begin
{тут организуем чтение файла}
{тут вычисление границ первого прямоугольника}
p1[1]:=x-a/2; p1[2] := x+a/2; p1[3] := y+h/2; p1[4] :=y-h/2;
While NOT Eof(fh) do begin
  {тут чтение данных для следующего прямоугольника}
   {и вычисление его границ}
  If Not Compare(p1,p2,p3) then
     Break;
 end; {while}
...
end.
ну и написал ...
Так думаю будет правильно ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 12.04.2012, 23:43   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
чтобы сравнивая координаты квадратов программа сохраняла область пересечения
то, что Вам предложил BDA в пост #4 - и есть фактически сохранение ОБЛАСТИ пересечения.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.04.2012, 23:43   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Аруми, если по моему алгоритму, то просто все тройки считываем, сколько есть.
ViktorR, так вы и сделали по моему алгоритму (но с несколькими улучшениями:
1) останов, когда пересечения не существует
2) инициализация первыми 2 квадратами)

УПД Serge_Bliznykov, второй день подряд не успеваю ответить (опережают)


Цитата:
Сообщение от ViktorR Посмотреть сообщение
В общем то я подумал о двух квадратах. Как изменить координаты второго квадрата вычитанием, что бы первый оказался в центре системы координат не объясняю.
...
4. Проверяем, что пересечение существует: L < R и T > B.
Переноса не нужно делать.
Пересечение существует, если L<=R и T>=B (просто вырождается в точку).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 12.04.2012 в 23:48.
BDA вне форума Ответить с цитированием
Старый 13.04.2012, 20:08   #10
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,332
По умолчанию

Я согласен, что повторил алгоритм ...
Делал я это не со зла
Я просто неадекватно отреагировал на:
Цитата:
Думаю этот вариант не подойдёт. Числа в файле должны задаваться пользователем и не факт, что там будет присутствовать такая тройка, которая соответствует квадрату с центром в начале координат. Программа должна работать в любом случае.
Далее уже не стал анализировать по сути готовое предложение и писал отсебятину...
То что мое предложение совпало, говорит о верности принятого подхода ...
Мне задачка понравилась, и хотя надо было на работу, засиделся.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Точка пересечения отрезков Witaliy Помощь студентам 5 25.12.2011 13:15
Исходник проверки пересечения многоугольников GoodDA Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 23.03.2011 22:46
Найти точку пересечения биссектрис error404 Фриланс 10 20.02.2010 21:02
C. Найти пересечения линий. Sekmegalife Помощь студентам 1 19.10.2009 08:34
Pascal. Площадь пересечения кругов TOSAgrk Помощь студентам 1 05.02.2009 04:23