Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Спасите меня, срочно нужна программа 
:(
    Опции темы
Ира
Дата 15.5.2003, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 21.4.2003

Репутация: нет
Всего: нет



Спасите меня, диплом горит в прямом смысле этого слова. Нужна программка на Дельфи. Задача: дано 4 точки построит кривую второго порядка минимальной длины проходящую через данные точки.

PM MAIL   Вверх
man2002ua
Дата 15.5.2003, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 943
Регистрация: 12.11.2002
Где: Киев

Репутация: нет
Всего: 2



точки где? Любые что-лиconfused.gif


--------------------
"Нет ничего более постоянного, чем временное"
PM MAIL   Вверх
Ира
Дата 15.5.2003, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1208 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.