Большой Воронежский Форум
Страница 3 из 3
< 123
» Программирование>Интересная задача
SuHar` 20:59 29.11.2007
Milky Man, Контрпример придумать сможешь?) [Ответ]
Milky Man 21:10 29.11.2007

Сообщение от Оля-ля:
Я имею ввиду не попарное пересечение, а ОБЩЕЕ. Ищем пересечение для кругов С1 и С2, потом пересечение этого пересечения с С3 и т д пока не будет пустое множество или пока не дойдем до Сn. И так по каждой оси.
Зы: черезз полчаса код скину, если не облажаюсь))))

Ну, и что? Ты находишь ПРЯМОУГОЛЬНУЮ ОБЛАСТЬ, в которой присутствуют части всех кругов, но не знаешь - пересекаются ли они ВСЕ там или нет!
Не надо кода... Кодить - это не профессия программиста...
Изображения
Нажмите на изображение для увеличения
Название: rounds.gif
Просмотров: 1
Размер:	2.9 Кб
ID:	198411  
[Ответ]
Оля-ля 21:17 29.11.2007
program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils,Windows,Math;
Const maxN=100;

Type TMas= Array [1..maxN] of real;
{Каждый массив--это набор минимальных и максимальных координат
для каждой из осей Х и У. Индексы соответствуют номеру окружности}
Var minX,minY,maxX,maxY:Tmas;
n:integer;

{Ввод данных}
procedure InputCircle(var n:integer;var minX,minY,maxX,maxY:Tmas);
var x,y,r:real;
i:integer;
begin
writeln('Введи кол-во окружностей(от 0 до MaxN)?');
readln(n);
writeln('ВВоди координаты окружности в порядке: x y r через пробел');
for i:=1 to n do
begin
writeln(i,' круг?:');
readln(x,y,r);
{Заполнение массивов}
minX[i]:=x-r;
maxX[i]:=x+r;
minY[i]:=y-r;
maxY[i]:=y+r;
end;
end;

{Проверка, пересекаются ли координаты окружностей по 1 какой-то оси}
Function IsCross(minMas,maxMas:Tmas):boolean;
var ok:boolean;
low,hi:real;
i:integer;
begin
i:=2;
low:=minMas[1]; {нижняя граница общего отрезка пересечения}
hi:=maxMas[1]; {верхняя граница его же}
ok:=True;
while ok and (i<=n) do
begin
{Рассматриваем очередной круг. Нижнюю грань общего отрезка опре-
деляем как максимум из предыдущей нижней грани и нижней грани
рассматриваемого круга. Верхнюю грань--через минимум.
Если верхняя оказалась за нижней--то нет пересечения. Иначе продолжаем}
low:=max(low,minMas[i]);
hi:=min(hi,maxmas[i]);
if low>hi then ok:=false
else i:=i+1
end;
IsCross:=Ok;
end;


begin
SetConsoleCp(1251);
SetConsoleOutputCp(1251);
InputCircle(n,minX,minY,maxX,maxY);
if IsCross(minX,maxX) {Проверка по Х} and IsCross(minY,maxY) {ПРоверка по У}
then
writeln('пересекаются')
else
writeln('не пересекаются');
readln;
end. [Ответ]
Milky Man 21:20 29.11.2007
Зачем кодить неправильный алгоритм? Или кодить, по-твоему, сложно? Ты в кодеры готовишься?
Область А удовлетворяет твоим условиям, но ответ будет неверным, потому что три окружности не имеют общих точек пересечения, хотя, по твоим выкладкам, должны.

Изображения
Нажмите на изображение для увеличения
Название: rounds2.gif
Просмотров: 2
Размер:	8.4 Кб
ID:	198412  
[Ответ]
SuHar` 21:20 29.11.2007
Milky Man, Да, действительно... Просто, если рассмотреть твой рисунок, то в зависимости от расположения системы координат условие от Оля-ля может работать, а может и нет. [Ответ]
Milky Man 21:22 29.11.2007
Оля-ля, пока не научишься на уровне алгоритмов программировать, будешь кодить чужие алгоритмы. [Ответ]
Milky Man 21:24 29.11.2007

Сообщение от SuHar`:
Milky Man, Да, действительно... Просто, если рассмотреть твой рисунок, то в зависимости от расположения системы координат условие от Оля-ля может работать, а может и нет.

Они уже в системе координат - икс внизу, игрек справа, как обычно во всех учебниках по геометрии. Если существует хоть один пример, для которого алгоритм даёт неверное решение, то такой алгоритм - ошибочный. И не важно где и какие системы координат. [Ответ]
Milky Man 21:30 29.11.2007

Сообщение от SuHar`:
Milky Man, Да, действительно... Просто, если рассмотреть твой рисунок, то в зависимости от расположения системы координат условие от Оля-ля может работать, а может и нет.

Зелёными линиями я показал отрезки, которые будут находиться по алгоритму Оля-ля. А - общая область для трёх кругов, в данной системе координат. [Ответ]
Оля-ля 21:34 29.11.2007
Ну простите, не буду больше :-[ Признаю свою ошибку.
зы: код, имхо, очевиднее, чем мой расплывчатый русский. [Ответ]
Оля-ля 21:40 29.11.2007
А вот подскажите, если аналогичным образом рассматривать не круги, а области их попарного пересечения, то результат тот же будет???
ЗЫ: просто самой интересно стало. В голову ничего лучше не пришло(((( [Ответ]
SuHar` 21:47 29.11.2007
Оля-ля, Я сначала так и подумал, что ты области рассмотривала)))
Рассмотрим рисунок, который нам предоставил Milky Man. Если система координат расположена стандартно, то такой способ действительно выдаст отрицательный результат. Но если ее определенным образом повернуть, то по этому способу получится, что круги имеют общие точки.
Если меня конечно глазомер не подводит... [Ответ]
Оля-ля 22:05 29.11.2007
SuHar`, спасибо большое, разобралась с вашим алгоритмом. )))
зы: не все гениальное просто..... [Ответ]
Milky Man 22:07 29.11.2007

Сообщение от SuHar`:
Оля-ля, Я сначала так и подумал, что ты области рассмотривала)))
Рассмотрим рисунок, который нам предоставил Milky Man. Если система координат расположена стандартно, то такой способ действительно выдаст отрицательный результат. Но если ее определенным образом повернуть, то по этому способу получится, что круги имеют общие точки.
Если меня конечно глазомер не подводит...

Что-то я не понял. Какой способ даст отрицательный результат и куда что надо поворачивать?
Я показал касательными точки, которые будут расматриваться, получилось пересечение трёх областей касательных - область А. Куда что ещё надо поворачивать? [Ответ]
Milky Man 22:10 29.11.2007

Сообщение от Оля-ля:
Ну простите, не буду больше :-[ Признаю свою ошибку.
зы: код, имхо, очевиднее, чем мой расплывчатый русский.

Нет, код не очиведнее. Разбираться в коде дольше, чем в "расплывчатом русском", чтобы понять, что алгоритм неверный. [Ответ]
Страница 3 из 3
< 123
Вверх