Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Геомеьрическая задача

Автор: Uriah 8.10.2006 4:23

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

Метод решения:
Пусть прямая задана уравнением ax+by+c=0, где a,b,c – коэффициенты в уравнении, входные данные, вещественные числа.
n – количество точек множества, входные данные, целое число.
(xi,yi)│i=1..n ─ координаты множества точек, входные данные, вещественные числа.
l ─ расстояния от заданной прямой до точек прямой, промежуточные данные, вещественные число
Ввод a,b,c.
Ввод n.
Для i от 1 до n вводим координаты точек множества (xi,yi), где i изменяется на единицу (i = i+1).
При (a*a+b*b)>0, находим расстояния от прямой до заданных точек:
l = (a*xi+b*yi+c)/sqrt(a*a+b*b)
Если (a*xi+b*yi+c)>0, то точка находится выше прямой, и тогда определяем какая точка находится ближе к прямой, путём сравнения расстояний от прямой до точек.
Выводим координаты точки ближайшей к прямой из точек, лежащих выше неё.
Если (a*xi+b*yi+c)<0, то точка находится ниже прямой, и тогда определяем какая точка находится ближе к прямой, путём сравнения расстояний от прямой до точек.
Выводим координаты точки ближайшей к прямой из точек, лежащих ниже неё.


Часть проги я написал: задал множество точек и нашёл расстояния от них до прямой,
необходимо токо кусок чтобы определить точку, ближайшую к прямой, из точек, лежащих выше прямой, и точку ближайшую к прямой, из точек, лежащих ниже. ПОМОГИТЕ, ктонить, ПОЖАЛУЙСТА!!!!!!!!! заранее БЛАГОДАРЕН!

Автор: мисс_граффити 8.10.2006 17:19

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

Автор: Гость 11.10.2006 19:36

Цитата(мисс_граффити @ 8.10.2006 13:19) *

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


я в задал условие, что (a*a+b*b)<>0

Автор: Гость 11.10.2006 20:00

вот часть исходника:

Код
program Mnogestvo;
uses Crt;
const n=5;
var a,b,c:real; i:integer;
      X: array [1..n] of real;
      Y: array [1..n] of real;
      l: real;
begin
ClrScr;
writeln ('Введите a,b,c');
readln (a,b,c);
for i:=1 to n do
begin
writeln ('Введите координаты', ' ', i, '-й точки множества');
readln (X[i],Y[i]);
end;
for i:=1 to n do
begin
if (a*a+b*b)<>0 then
l:= (a*X[i]+b*Y[i]+c)/sqrt (a*a+b*b);
writeln (l);
end;





readkey;
end.

Автор: -Uriah- 13.10.2006 21:11

Никто помочь не может?

Автор: Uriah 13.10.2006 21:24

Подскажите хоть, пожалуйста, допустим я определ ближайшие расстояния до прямой, как мне обратно вівести координаты этих ближайших точек !low.gif

Автор: volvo 13.10.2006 21:37

Цитата
как мне обратно вівести координаты этих ближайших точек
Ты же запоминаешь точки в массиве?

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

А потом по запомненным индексам просто вытянешь из массива сами точки...

Автор: Uriah 13.10.2006 22:55

Цитата(volvo @ 13.10.2006 17:37) *

Ты же запоминаешь точки в массиве?

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

А потом по запомненным индексам просто вытянешь из массива сами точки...

я запоминаю точки в двух одномерных массивах x,y

и мне надо использовать l без индекса

Автор: volvo 13.10.2006 22:58

Тогда во-первых, объясни почему без индекса? Чтоб самому себе найти проблемы, а потом долго и упорно их решать?

А во-вторых, приведи, наконец программу (ПОЛНОСТЬЮ, а не отрывок из несущественностей, типа организации ввода), которую до сих пор сделал... Почему все считают, что кто-то должен повторить то же самое, что они уже наваяли? dry.gif КОМУ нужна помощь, наконец???

Автор: Uriah 13.10.2006 23:04

l я взял сначала с индексом, но мой препод сказал исправить, чтоб было без него, говорит, что так прога занимает больше места, хотя я и не знаю как это организовать

Автор: volvo 13.10.2006 23:19

А у тебя в задании что, где-то приведены ограничения по "занимаемому месту"? Я этого не нашел...

Извини, но используя ТОЛЬКО два одномерных массива и одну переменную, ты эту задачу НЕ решишь... По крайней мере еще или 6 переменных (4 для хранения координат (X, Y) точки с минимальным расстоянием "над прямой"/"под прямой" и 2 - для сохранения самого мин. значения тоже "над"/"под"), или индексы.

Насчет "занимает больше места" - ты что, ОБЕ программы ему показывал, и он сравнил размеры? Откуда он знает, ЧТО БУДЕТ занимать больше места? Он что, провидец?

Автор: Uriah 13.10.2006 23:26

я учусь в инсте на программиста(1 курс). первая лаба была на разработку методов решения задачи, и я использовал l[i], и за это препод снял почти половину балов

за нерациональное решение задачи

Автор: Uriah 14.10.2006 22:01

с переменной ничего не получается, а вот с массивом - всё класс!

Автор: Uriah 14.10.2006 23:17

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



Код
program Mnogestvo;
uses Crt;
const n=5;
var a,b,c:real; i:integer;
      X: array [1..n] of real;
      Y: array [1..n] of real;
      l: real;
begin
ClrScr;
writeln ('Введите a,b,c');
readln (a,b,c);
for i:=1 to n do
begin
writeln ('Введите координаты', ' ', i, '-й точки множества');
readln (X[i],Y[i]);
end;
for i:=1 to n do
begin
if (a*X[i]+b*Y[i]+c)>0
then l[i]:= a*X[i]+b*Y[i]+c;
end;
if l[i]>0 then
begin
for i:=1 to n do
begin
if (a*X[i+1]+b*Y[i+1]+c)<l[i] then
l[i]:= a*X[i+1]+b*Y[i+1]+c;
end;
writeln (l[i]);
writeln (i);
writeln (X[i],Y[i]);
end;


readkey;
end.

Автор: Uriah 15.10.2006 0:01

помогите плиз

Автор: Uriah 15.10.2006 1:00

не понимаю в чём ошибка

Автор: volvo 15.10.2006 1:35

Цитата
не понимаю в чём ошибка
В том, что ты определил переменную L как Real, а пытаешься обратиться к ней - как к массиву. Поэтому программа и не компилируется...

Автор: Uriah 15.10.2006 15:44

это я здесь при записи ошибся, а так она и записана как массив, а всё-равно не работает

Автор: volvo 15.10.2006 16:04

А здесь должно быть то же самое, что и у тебя, иначе вся тема просто будет снесена напрочь, как переливание из пустого в порожнее. Нужна помощь - давай ПРАВИЛЬНЫЙ код. Не даешь - тему в мусор. Надоело уже сюсюкаться тут с такими как ты! mad.gif

Автор: Uriah 15.10.2006 16:56

извините,пожалуйста.
Помогите плиз

Автор: Uriah 15.10.2006 19:55

гляньте кто-нить прогу, пожалуйста, срочно надо

Автор: Гость 15.10.2006 23:20

никто не может помочь?