![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Ира |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 21.4.2003 Репутация: нет Всего: нет |
Спасите меня, диплом горит в прямом смысле этого слова. Нужна программка на Дельфи. Задача: дано 4 точки построит кривую второго порядка минимальной длины проходящую через данные точки.
|
|||
|
||||
| man2002ua |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 943 Регистрация: 12.11.2002 Где: Киев Репутация: нет Всего: 2 |
точки где? Любые что-ли
-------------------- "Нет ничего более постоянного, чем временное" |
|||
|
||||
| Ира |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 21.4.2003 Репутация: нет Всего: нет |
Точки например (0,1) (1,1) (2,1) (2,0). Кривая второго порядка с уравнением f(x,y)=x^2+a1*y^2+a2*x*y+a3*x+a4*y+a5. Так как точек 4, а кривая второго порядка строится однозначно только по 5 точкам, нам необходимо из семейства кривых второго порядка проходящих через эти точки выбрать кривую наименьшей длины.
Я сама написала код нахождения длины дуги кривой. Его надо как-то использовать в этой программке. Вот он: program dist4; {$APPTYPE CONSOLE} uses SysUtils; const wi=8; pre=7; //константы для write( x:wi:pre ); E = 1e-10; type TFunc = Function(x:extended;y:extended ):extended; var q,r:extended; r2: extended; Function f0(x:extended;y:extended):extended; begin f0:=x*x+y*y-r2; // задаем функцию end; Function DiffX(f:TFunc;x:extended;y:extended):extended; begin DiffX:=(f(x+q,y)-f(x,y))/q; // вычисляем производную по х end; Function DiffY(f:Tfunc; x:extended;y:extended):extended; begin DiffY:=(f(x,y+q)-f(x,y))/q; //вычисляем производную по у end; Procedure Move(f:TFunc; var m,n:extended); //процедура смещения точки на кривую var x5,y5:extended; begin while abs(f(m,n))>E do begin x5:=m+(-f(m,n))/(sqr(DIffX(f,m,n))+sqr(DiffY(f,m,n)))*DiffX(f,m,n); y5:=n+(-f(m,n))/(sqr(DiffX(f,m,n))+sqr(Diffy(f,m,n)))*DiffY(f,m,n); m:=x5; n:=y5; end; end; Function Dist(f:TFunc; l,t0,z0,t1,z1,r:extended;p:boolean):extended; var c,d,t2,t3,z2,z3,d1:extended; begin If p then c:=-1 else c:=1; if (f(t0,z0)>E) then Move(f,t0,z0); if (f(t1,z1)>E) then Move(f,t1,z1); dist:=0;d:=0; while d<l do begin if (abs(t0-t1)<r)and(abs(z0-z1)<r) then begin dist:=d+sqrt(sqr(t0-t1)+sqr(z0-z1)); break; end; {находим вектор-градиент и поворачиваем его на угол 90 градусов } t2:=r*(DiffX(f,t0,z0)*cos(pi/2)-DiffY(f,t0,z0)*sin(pi/2)); z2:=r*(DiffX(f,t0,z0)*sin(pi/2)+DiffY(f,t0,z0)*cos(pi/2)); d1:=sqrt(t2*t2+z2*z2); //дина градиента t2:=t0+c*r*t2/d1; // смещение по ксательной из точки(х0,у0) z2:=z0+c*r*z2/d1; // методом градиентов сдвигаем (t2,z2) на кривую while abs(f(t2,z2))>E do begin t3:=t2+(-f(t2,z2))/(sqr(DiffX(f,t2,z2))+sqr(DiffY(f,t2,z2)))*DiffX(f,t2,z2); z3:=z2+(-f(t2,z2))/(sqr(DiffX(f,t2,z2))+sqr(DiffY(f,t2,z2)))*DiffY(f,t2,z2); t2:=t3; z2:=z3; end; d1:=sqrt(sqr(t0-t2)+sqr(z0-z2)); t0:=t2; z0:=z2; d:=d+d1; dist:=d; end; end; var k: integer; x0,x1,y0,y1,ds, ds2: extended; p:boolean; begin // l максимально возможная длина кривой r:=0.01; //смещение за шаг p:=true; // поворот градиента по часовой или против часовой стрелки q:=0.00000001; for k:= 1 to 20 do begin r2 := k*k; x0:=0; y0:=k; x1:=k; y1:=0; // Начальная точка - (x0, y0);конечная точка - (x1, y1) ds := Dist(f0,4*Pi*k,x0,y0,x1,y1,r,p); ds2:= Pi*k/2; WriteLn( k:3, ds:10:6, ds2:10:6 ); end; ReadLn; Halt; end. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |