IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> множество точек, принадлежащих ломаным, как лучше сделать?
dmit
сообщение 17.5.2008, 18:45
Сообщение #1


Новичок
*

Группа: Продвинутые
Сообщений: 9
Регистрация: 6.4.2008
Город: Отрадное
Учебное заведение: СПбГЭТУ ЛЭТИ
Вы: студент



Люди!Помогите убить до конца задачу!возникают затруднения с последним подзаданием.вот задача:

Определить длины ломаных линий, которые начинаются в точке А(хА, уА), проходят через одну из точек множества М (х1, у1), (х2, у2)…. (хn, уn) и заканчиваются в точке В(хВ, уВ). Сформировать множество точек Р ≤ М, принадлежащих ломаным, длина которых удовлетворяет определенному условию:
1. Наименьшая длина
2. Длина меньше заданной величины.

А(71, 27) B(192, 79)

M{(104,51);(71,15);(91, 93);(31, 84.5);(11,19);(5, 29);(0, 52);(2, 7)}
точки данного множества находятся в порядке возрастания длин ломаных, проходящих через них.
а вот это мои соображения:

program trudno;
const
N=8; M:array[1..N,1..2] of Real =
((104, 51),
(71, 15) ,
(91, 83),
(31,84.5),
(11, 19),
(5, 29) ,
(0, 52),
(2, 7));
Type
TMatrix=array[1..N] of real;
TMnozhestvo=array[1..N,1..2] of real;


Var
x,d,k,p,y,b,k2,y3,k3,b3,b2,k1,b1,y1,y2,S,Min,xA,yA,xB,yB,k4,b4,y4:real;
i,c,g,j:integer;
L:TMatrix;
A:TMnozhestvo;
begin

xA:=71;
yA:=27;
xB:=192;
yB:=79;
for i:=1 to N do
L[i]:=sqrt(sqr(xA-M[i,1])+sqr(yA-M[i,2]))+sqrt(sqr(xB-M[i,1])+sqr(yB-M[i,2]));
writeln('„«Ё­л «®¬ ­ле:');
for i:=1 to N do begin
write('L[',i,']=',L[i]:5:3);
writeln;end;
Min:=L[i];
for i:=1 to N do
if (L[i]<Min) then begin
Min:=L[i];
c:=i;
end;
writeln('Наименьшая длина:');
writeln('L[',c,']=',Min:3:3);
i:=c;
k2:=(yB-M[i,2])/(xB-M[i,1]);
b2:=M[i,2]-M[i,1]*k2;
k1:=(yA-M[i,2])/(xA-M[i,1]);
b1:=M[i,2]-M[i,1]*k1;
writeln('Множество Р для ломаной с наименьшей длиной:');
writeln(' x: y: ');

for i:=1 to N do begin
repeat begin d:=random(39);
x:=xA+d;
k1:=(yA-M[i,2])/(xA-M[i,1]);
b1:=M[i,2]-M[i,1]*k1;
y1:=k1*x+b1;
writeln('x=',x:0:0,' y=',y1:5:3); end; until (x>M[i,1]-1);

repeat begin d:=random(130);
x:=M[i,1]+d;
k2:=(yB-M[i,2])/(xB-M[i,1]);
b2:=M[i,2]-M[i,1]*k2;
y2:=k2*x+b2;
writeln('x=',x:0:0,' y=',y2:5:3); end; until (x>=xB-1);

repeat begin write('введите произвольную длину ломаной:');
readln(S);
if (S<Min)
then writeln('ломаной с такой длиной не существует');
end;
until (S>=Min);

for i:=1 to N do begin
if (L[i]<=S) then begin
c:=i; end;
end;

begin repeat begin
d:=random(98);
k4:=(yA-M[c,2])/(xA-M[c,1]);
b4:=M[c,2]-M[c,1]*k4;
A[g,1]:=xA+d;
A[g,2]:=k4*A[g,1]+b4;
writeln('x=',A[g,1]:0:0,' k4=',k4:0:3,' y=',A[g,2]:5:3); end; until A[g,1]>M[c,1]-3;

repeat begin
d:=random(250);
k3:=(yB-M[c,2])/(xB-M[c,1]);
b3:=M[c,2]-M[c,1]*k3;
A[g,1]:=M[c,1]+d;
A[g,2]:=k3*A[g,1]+b3;
writeln('x=',A[g,1]:0:0,' k3=',k3:0:3,' y=',A[g,2]:5:3); end; until A[g,1]>xB-2;
readln;
end;
end;
for i:=1 to N do begin
if xA=M[i,1] then begin
repeat begin
d:=random(43);
A[g,2]:=M[i,2]+d;
writeln('x=',xA:0:0,' y=',A[g,2]:0:0);end; until (A[g,2]>yA) end else
readln;
end;
end.

Проблема в том, что я не знаю как сделать так, чтобы прога выдавала мне множество точек, принадлежащих ломаным, т.е Я пока только сделал это только для одной ломаной, для самой первой, а вот как для двух и более.......ломаю голову, ведь нужно чтоб, вывелись на экран точки, принадлежащие не только для текущей ломаной, но и для предыдущих с точки зрения возрастания длин ломаных.У кого какие есть мысли?Что делать?

Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 18.5.2008, 18:34
Сообщение #2


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Если я правильно понял задание - нужно получить одну (пункт 1) или множество (пункт 2) точек, лежащих на существующих ломаных, при котором длина A-P-B минимальна или меньше необходимой длины, то я бы сделал так:
По пункту 1. Длина будет минимальна, если углы наклона прямых (A; P) и (P; (IMG:style_emoticons/default/cool.gif) будут равны (это будет прямая), то есть нам нужно найти точку, в которой разница между этими двумя углами будет минимальна. Поскольку, если бы точка могла находиться в любом месте ломаной, то решение было бы - сама точка A или B, значит, скорее всего, эта точка должна принадлежать множеству M. Следовательно просто проверяем все точки и находим минимальную разницу между углами.
Код

ang := pi;
for i:=1 to N do
begin
  if (xA = M[i, 1]) then
    ang1:= pi/2
  else
    ang1:= arctan((M[i,2] - yA)/(M[i,1] - xA));

  if (xB = M[i, 1]) then
    ang2:= pi/2
  else
    ang2:= arctan(yB - (M[i,2])/(xB - M[i,1]));

  if (abs(ang2 - ang1) < abs(ang)) then
  begin
    ang:= abs(ang2 - ang1);
    MinX:= M[i, 1];
    MinY:= M[i, 2];
  end;
end;

В MinX и MinY будут нужные координаты точки.

По второму пункту.
Нужно сформировать множество P, точки которых лежат на ломаных A-M-B и A-P-B меньше какой-то длины.
Если нужная длина меньше расстояния между A и B, то таких точек не существует. Если больше, то существует для всех ломаных.
Найдем расстояние от точек A и B для каждой ломаной, которое нам подходит.
Найдем расстояние от точки A, при котором A-P-B равняется нужной длине и лежит на прямой A-M. Для этого нужно решить уравнение sqrt(sqr(Ax - Px) + sqr(Ay - Py)) = s. Причем Py должна лежать на прямой A-M. То есть Py = (My - Ay)/(Mx - Ax)*Px + Ay.
Обозначим (My - Ay)/(Mx - Ax), как A. Получим sqrt(sqr(Ax - Px) + sqr(Ay - (A*Px + Ay)) = s. Отсюда Px = (Ax+sqrt(sqrt(s) - sqr(A)*sqr(Ax)+sqr(A)*sqr(s)))/(1+sqr(A)). Py = A*Px + Ay. Если sqrt(sqr(Ax - Px) + sqr(Ay - Py)) больше, чем sqrt(sqr(Ax - Mx) + sqr(My - Py)), то точка может лежать в любом месте отрезка A-M. Если же меньше, то точка должна лежать по x - между Ax и Px, по y - между Ay и Py. Аналогично для отрезка M-B. И так для всех отрезков.
Вроде ничего не пропустил (IMG:style_emoticons/default/smile.gif).
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
dmit
сообщение 19.5.2008, 13:33
Сообщение #3


Новичок
*

Группа: Продвинутые
Сообщений: 9
Регистрация: 6.4.2008
Город: Отрадное
Учебное заведение: СПбГЭТУ ЛЭТИ
Вы: студент



ок, спс, я попытаюсь сделать по твоим рекомендациям, но мне кажется что твой способ немного мудреный
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
creer
сообщение 19.5.2008, 18:47
Сообщение #4


Студент
**

Группа: Продвинутые
Сообщений: 121
Регистрация: 28.10.2007
Город: Екатеринбург
Учебное заведение: УГТУ-УПИ
Вы: студент



Зато все точно. Математика (IMG:style_emoticons/default/smile.gif).
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 25.5.2025, 16:35

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru