Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2017, 12:30   #1
Дмитрий456
 
Регистрация: 19.09.2015
Сообщений: 9
Стрелка Найти пересечение окружности и эллипса

Всем доброго времени суток, мучаюсь уже 2 день. Не получается правильно определить точки пересечения окружности и эллипса. Формулу выразил, а результат далек от пересечения точек на фото.

Свои наработки прикладываю.
Код:
uses crt;
Const  a=16;      {Полуось эллипса}
       b=37;      {Полуось эллипса}
       r=25;      {Радиус окружности}
var
       Y0, X0, Y0el, X0el, dx, x, y :real;
       i : byte;
begin
//Центр окружности
Y0:=-15; X0:=-4;
Writeln('X0 Окружности ', X0);
Writeln('Y0 Окружности ', Y0);
//Центр эллипса
Y0el:=8; X0el:=-7;
Writeln('X0 Эллипса ', X0el);
Writeln('Y0 Эллипса ', Y0el);
x:=9;
dx:=0.001;
  begin
    repeat
      //Формула окружности выражаем y и подставляем в формулу эллипса ниже
      y:=sqrt(sqr(r)-sqr(x-X0))+Y0;
      x:=x+dx;
    until ((sqr(x-X0el))/sqr(a))+((sqr(y-Y0el))/sqr(b))>=1;//полученый y подставляем
    writeln('Координата A x=',x:1:3,' y=',y:1:3);
    repeat
      y:=-sqrt(sqr(r)-sqr(x-X0))+Y0;
      x:=x+dx;
    until ((sqr(x-X0el))/sqr(a))+((sqr(y-Y0el))/sqr(b))>=1;
    writeln('Координата B x=',x:1:3,' y=',y:1:3);
  end;
end.
На фото изображен график с окружностью и эллипсом. Координаты центра окружности и эллипса определил отдельно по формулам.
Крайняя точка по оси X равна -24 примерно
Изображения
Тип файла: jpg 20170114_205554.jpg (80.3 Кб, 141 просмотров)
Дмитрий456 вне форума Ответить с цитированием
Старый 15.01.2017, 18:26   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Получите уравнения эллипса и круга
fc(x,y)=(x-X0c)^2 + (y-Y0c)^2 - R
fe(x,y)=Ax^2 + Bxy + Cx + Dy + Ey^2 + F
Каждая из этих функций должна быть равна 0, для получения окружности или эллипса.
Выразим целевую функцию
f(x,y)= (fc(x,y))^2 + (fe(x,y))^2
И найдём её минимум (т.к. для попадания точки и на окружность и на эллипс каждое из слагаемых должно быть равно 0) - любым способом. Хоть методом простой итерации.
x:=x+f(x,y)/Kx
y:=y+f(x,y)/Ky
Можно Kx и Ky задать константами, а можно вычислять как частные производные.

А можно и методом перебора точек на окружности искать минимум целевой функции.
FPaul вне форума Ответить с цитированием
Старый 15.01.2017, 18:58   #3
Дмитрий456
 
Регистрация: 19.09.2015
Сообщений: 9
По умолчанию

fe(x,y)=Ax^2 + Bxy + Cx + Dy + Ey^2 + F - эллипс
А где взять a, b, c, Dy, Ey, F
a,b даны
c крайняя точка
Dy и это получается крайняя точка
Ey ?
F это подставленное значение окружности.

Последний раз редактировалось Дмитрий456; 15.01.2017 в 19:05.
Дмитрий456 вне форума Ответить с цитированием
Старый 15.01.2017, 19:28   #4
Дмитрий456
 
Регистрация: 19.09.2015
Сообщений: 9
По умолчанию

Пока что так получается, но результат нет ни одного случая при котором было бы два 0.
Код:
program Lab4Test2;
uses crt;
Const  a=16;      {Полуось эллипса}
       b=37;      {Полуось эллипса}
       r=25;      {Радиус окружности}
var
       Y0, X0, Y0el, X0el, dx, x, y, Elp, Circl:real;
       i : byte;
begin
//Центр окружности
Y0:=-15; X0:=-4;
Writeln('X0 Окружности ', X0);
Writeln('Y0 Окружности ', Y0);
//Центр эллипса
Y0el:=8; X0el:=-7;
Writeln('X0 Эллипса ', X0el);
Writeln('Y0 Эллипса ', Y0el);
x:=-24;
dx:=0.001;
  while(x <= 9) do begin
  for i := 1 to 40 do begin
      Elp := (sqr(x-X0el)/sqr(a))+((sqr(i-Y0el))/sqr(b));
      Circl := sqr(x-X0)+sqr(i-Y0)-r;
      if(Elp = 0) and (Circl = 0) then 
      begin
        Write('Нашли значение x и y при которых оба уравнения равны 0!');
      end;
    end;
    x:=x+dx;
  end;
end.
Дмитрий456 вне форума Ответить с цитированием
Старый 15.01.2017, 20:10   #5
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Примерно если то можно так подсчитать:
Код:
  t:=0;
  dt:=0.00001;  
  repeat
      xe:=x0el+a*cos(t);
      ye:=y0el+b*sin(t);
      if abs(sqr(xe-x0)+sqr(ye-y0)-sqr(r))<0.01 then writeln(xe,' ',ye);
    t:=t+dt;
  until t>2*pi;
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 15.01.2017, 20:34   #6
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,538
По умолчанию

Записываем уравнение эллипса в параметрической форме:
Код:
procedure parEll(a,b,X0e,Y0e,t:Real;var x,y:Real);
begin
 x:=X0e+a*Cos(t);
 y:=Y0e+b*Sin(t);
end;
где t - угол от 0 до 2пи.

Пересечение эллипса и окружности - это точки эллипса , удаленные от центра окружности на расстояние R ( радиус окружности) .

Расстояние от точки (X1,Y1) до точки (X2,Y2):
Код:
function fr12(x1,y1,x2,y2:Real):Real;
begin
 fr12:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
end;
В цикле пробегаем значения t от 0 до 2пи с шагом например 0.0001 радиан, вычисляем координаты точек эллипса с помощью parEll, вычисляем их расстояния до центра окружности с помощью fr12
Например:
Код:
 tmp:=fr12( .....
Вычисляем значениеR - tmp. В тех местах, где это значение меняет знак ( то есть =0 ) - там точки пересечения.

PS Пока писал, опередили.
type_Oleg вне форума Ответить с цитированием
Старый 15.01.2017, 21:11   #7
Дмитрий456
 
Регистрация: 19.09.2015
Сообщений: 9
По умолчанию

Спасибо всем, весьма отлично получилось.

Код:
uses crt;
Const  a=16;      {Полуось эллипса}
       b=37;      {Полуось эллипса}
       r=25;      {Радиус окружности}
       pi = 3.14;
var
       Y0, X0, Y0el, X0el, dx, x, y , dt, t, xe, ye:real;
       i : byte;
begin
//Центр окружности
Y0:=-15; X0:=-4;
WriteLn('Центр окружности: (',X0,',',Y0,')');
//Центр эллипса
Y0el:=8; X0el:=-7;
WriteLn('Центр эллипса: (',X0el,',',Y0el,')');
t:=0;
dt:=0.00001;  
WriteLn('Точки пересечения:');
repeat
  xe:=X0el+a*cos(t);
  ye:=Y0el+b*sin(t);
  if abs(sqr(xe-X0)+sqr(ye-Y0)-sqr(r))<0.01 then writeln('(',xe:1:3,',',ye:1:3,')');
  t:=t+dt;
until t>2*pi;
end.
Изображения
Тип файла: jpg Набросок.jpg (71.7 Кб, 158 просмотров)

Последний раз редактировалось Дмитрий456; 15.01.2017 в 21:21.
Дмитрий456 вне форума Ответить с цитированием
Старый 15.01.2017, 23:09   #8
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
Вычисляем значение R - tmp. В тех местах, где это значение меняет знак ( то есть =0 ) - там точки пересечения.
Реализуйте эту идею и будет на отлично.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пересечение прямой и окружности Гузель23 Помощь студентам 0 10.05.2013 21:28
.Net, C#, рисование окружности и эллипса с общим центром. includer Помощь студентам 0 03.03.2013 16:02
Пересечение прямоугольника и окружности _-Re@l-_ Помощь студентам 2 20.05.2011 15:35
Пересечение треугольников окружности C++ LaDark Помощь студентам 2 28.11.2010 12:50
Пересечение эллипса с прямой (Delphi) 0rtega Помощь студентам 0 13.04.2010 21:45