Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.12.2008, 14:03
digital_sword digital_sword вне форума
Прохожий
 
Регистрация: 15.12.2008
Сообщения: 2
Репутация: 10
По умолчанию Узнать точки пересечения графиков

Добрый день. Рисую 2 графика функций. Мне нужно найти первые 3 точки их пересечения. У меня возникают мысли только рисовать их синхронно с каким-то шагом, и если где-то расстояние между 2мя точками разных графиков меньше какого-то маленького числа, то обвести то место кружком.

Есть более цивилизованное и простое решение? Может, функция какая-то поможет... И лучше бы координаты этих 2х точек узнать.

Последний раз редактировалось digital_sword, 15.12.2008 в 14:07.
Ответить с цитированием
  #2  
Старый 15.12.2008, 14:56
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, можно попробовать сделать это аналитически. Т.е. высчитать координаты, где значения функций равны и, преобразовав их в экранные, обвести эти точки кружочками. Дело в том, что ты же рисуешь графики дискретно и не факт, что при расчете ты получишь пересечение в какой-либо твоей точке. Чем меньше шаг, тем вероятнее его получить, но все равно не факт, что точно попадешь. Хотя, если заранее известно, что такие точки являются целыми по Х, то тогда можно попробовать и по ходу построения графиков их отловить. в противном случае тебе придется вычислять их приближенно, т.е. с некоторой погрешностью.
Ответить с цитированием
  #3  
Старый 15.12.2008, 22:11
digital_sword digital_sword вне форума
Прохожий
 
Регистрация: 15.12.2008
Сообщения: 2
Репутация: 10
По умолчанию

2 функции: y=a+b*x*sin(c*x+d) и y=k*x
Сделал так: проверять до тех пор, пока функция1-функция2 не станет равно 0.

код:
begin
x:=0.01;
repeat
x:=x+0.01;
until a+b*x*sin(c*x+d)-k*x<0.001; //приблизительно равно 0
end;

что-то запускается, но не работает... не в курсе почему?
Ответить с цитированием
  #4  
Старый 16.12.2008, 14:18
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

разность функций надо брать по модулю:
abs(f1 - f2) < eps
Ответить с цитированием
  #5  
Старый 16.12.2008, 18:53
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

Я думаю вернее будет
Abs(Round((f1 - f2) * 1e+n)) < Round(eps * 1e+n), где n - степень точности 1, 2, 3 или 4, что соответствует 10, 100, 1000, 10000
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025