![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
dmit |
![]()
Сообщение
#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 |
![]()
Сообщение
#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 |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Продвинутые Сообщений: 9 Регистрация: 6.4.2008 Город: Отрадное Учебное заведение: СПбГЭТУ ЛЭТИ Вы: студент ![]() |
ок, спс, я попытаюсь сделать по твоим рекомендациям, но мне кажется что твой способ немного мудреный
|
creer |
![]()
Сообщение
#4
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 121 Регистрация: 28.10.2007 Город: Екатеринбург Учебное заведение: УГТУ-УПИ Вы: студент ![]() |
Зато все точно. Математика (IMG:style_emoticons/default/smile.gif).
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 23:32 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru