Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Помогите, нужна программа на Дельфи


Автор: Ира 9.4.2003, 11:37
Помогите, нужна программа на Дельфи. Дана функция от двух переменных, даны две точки. Необходимо найти длину дуги между данными точками на кривой.

Автор: 78125 9.4.2003, 12:55
Путем разбиения на дуги. Иного выхода не вижу.

Автор: neutrino 9.4.2003, 14:40
Приветствую!
Можно аппроксимировать функцию сплайном (первой степени) и посчитать длину каждого отрезка, после чего просто сложить.
Например взять первую производную в каждой точке (в компьютере их количество небесконечно), потом взять от нее арктангенс (т.е. угол) и взять от этого угла косинус, после чего возвести его в -1 степень (если иметь в виду, что мы разбиваем функцию на единичные отрезки). Т.е. :

Цитата

function f(x: double): double;        //function
function fd(x: double): double;      //derivative

S:=0;
for x:=a to b do begin
  S:=S+1/cos(arctan(fd(x)));
end;

Автор: Ира 10.4.2003, 16:42
Это все очень хорошо, но как это будет выглядеть для функции, например, f(x,y)=x*x+5*y*y-8

Автор: neutrino 10.4.2003, 16:49
Мдааа... Я ступил...

.... надо найти кривую пересечения плоскости с функцией... хмм.... Плоскость ведь можно построить довольно лекго...
(так... рассуждения...)

Автор: Ира 10.4.2003, 16:59
На самом деле, нужно разбить кривую на мелкие отрезки, потом заменить длину кривой на этом отрезке длиной отрезка. Длина всей дуги будет равна сумме длин маленьких отрезочков. Но как получить точки на кривой, вот в чем проблема.

Автор: man2002ua 10.4.2003, 17:20
Это не кривая, а поверхность smile.gif

Автор: neutrino 10.4.2003, 18:04
Модератору: тему надо переносить в "технологии и алгоритмы".

Ира, для решения Вашей задачи возможно необходимо взять криволинейный интеграл по длине дуги? Или это не имеет отношения?

Автор: man2002ua 12.4.2003, 09:10
Ира, можно точки эти узнать?

Автор: neutrino 13.4.2003, 08:51
Значит так, если есть функция и координаты точек, то:
I.
1) ищем уравнение пересечения плоскости перпендикулярной плоскости xOy, в которой лежит отрезок AB с уравнением z(x,y).
2) теперь у нас есть уравнение кривой на плоскости и всего-лишь нужно воспользоваться формулой для нахождения дуги (там интеграл от a до b, [sqrt(1+y'(x)^2) dx])

II.
1) воспользоваться формулой для нахождения криволинейного интеграла по длине дуги;
2) по скольку мы будем знать площадь, длину основания |a-b|, и высоты в двух концах z(a), z(b), то найти длину кривой заключенной между концами не составит труда smile.gif

Если Вам еще что-нибудь непонятно, спрашивайте.

P.S. В общем советую просто посмотреть в учебник по математике.

Автор: man2002ua 14.4.2003, 09:11
neutrino, похоже, что ты сильно все запутал своими плоскостями.

Проще надо быть - если есть точки x1, y1 и x2, y2, то надо попытаться определить две функции:
x = x(t) и y = y(t), где A <= t <= B.

Тогда длина кривой между точками:


S = Интеграл от A до B ( Корень( x'(t)^2 + y'(t)^2 ) )dt

Автор: Fantasist 14.4.2003, 22:11
Все повторяется... Ровно год назад (или два? или полтора?) какая-то другая девушка поднимала точно такую же задачу, и тоже для примера была данна линия эллипса. Помниться, такой базар развели...

Цитата
На самом деле, нужно разбить кривую на мелкие отрезки, потом заменить длину кривой на этом отрезке длиной отрезка. Длина всей дуги будет равна сумме длин маленьких отрезочков. Но как получить точки на кривой, вот в чем проблема.


Совершенно верно. Получить ее можно решением квадратного уровнения. Береш х=0, подставляешь и решаешь относительно y. Если решение существует в области рациональных чисел, значит одна точка есть. Прибавляешь прирощение к x и вычисляешь следующий у - вот тебе и отрезок. И т. д. Вообще, легко оценить область допустимых значений х, явно, что для этого выражение оно будет удовлетворять условию:

8/5-(х*х)/5 >= 0 отсюда |x|<= sqrt(8);

Ну вот и бери значения от [-sqrt(8), +sqrt(8)];



Автор: Ира 18.4.2003, 17:04
А как быть в том случае, когда одному х, соответствует не один у. Какое из двух значений выбрать?

Автор: man2002ua 18.4.2003, 17:09
Ира, повторюсь, чтобы получилась кривая надо знать:
x = x(t) и y = y(t), где A <= t <= B.

Автор: Ира 21.4.2003, 12:16
По условию дано, что кривая задана в общем виде, то есть f(x,y)=0. Так ее вводит пользователь. Нельзя выразить х через у. Как быть в этом случае?

Автор: man2002ua 21.4.2003, 12:32
получается типа эллипс? А точки назови, плз.

Автор: Ира 21.4.2003, 12:45
Точки можно любые, конечно же, принадлежащие кривой

Автор: man2002ua 21.4.2003, 13:27
а напомните мне формулу длины smile.gif У меня справочник дома - посмотрю.
Ира, у тебя адрес почтовый есть? Дам посмотреть исходник и Exe.

Автор: Guest_Ира 22.4.2003, 15:39
Конечно, есть e-mail. Только он моей подруги. [email protected]

Автор: man2002ua 22.4.2003, 15:41
висилаю

Автор: Ира 23.4.2003, 11:22
Спасибочки огромное за программку. А как быть, если заданная функция будет не эллипс, а какая-нибудь другая?

Автор: man2002ua 23.4.2003, 11:25
Тот же самый алгоритм. Он называется какая-то аппроксимация, не помню. Главное, чтобы можно было выразить одну переменную через другую.

Автор: Fantasist 23.4.2003, 19:32
Цитата
А как быть в том случае, когда одному х, соответствует не один у. Какое из двух значений выбрать?


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

Автор: Ира 24.4.2003, 11:34
А пример кода программки можете написать?

Автор: man2002ua 24.4.2003, 11:38
Ира, тот код, что я тебе дал считает нижнюю и верхнюю части функции, те не заметила, как рисуется дуга?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)