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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.02.2012, 00:10
qpmr qpmr вне форума
Прохожий
 
Регистрация: 12.12.2011
Сообщения: 27
Репутация: 10
По умолчанию алгоритм задачи

Здравствуйте , я хочу Найти координаты точек пересечения двух окружностей радиуса R1 и R2 с
центрами в точках (х1 , у1 ) и (х2 , у2 ) соответственно.


Что я делаю :
1) Есть два уравнения окружности , если они пересекаются , то x и y в уравнениях равны , тогда просто нахожу х и у .
2) Выясняю , пересекаются окружности или нет// если сумма их радиусов больше расстояния между их центрами , значит пересекются.

3) Нахожу координаты точки , через теор пиф.

что же не так , сколько раз уже проверял
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls, ExtCtrls,math, TeeProcs, TeEngine, Chart;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label2: TLabel;
    Button1: TButton;
    BitBtn1: TBitBtn;
    Button2: TButton;
    Memo1: TMemo;
    Chart1: TChart;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  
  
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}




procedure TForm1.Button1Click(Sender: TObject);
var a,b,a1,b1,o,p:integer;
 x,y,z,c,t,k,q,w:integer;

begin
o:=strtoint(edit1.Text);
k:=round(o*2);
 z:=strtoint(edit2.Text);
 c:=round(z*2);
   with chart1.Canvas do
 begin
        randomize;
  pen.Width:=3;
  pen.color:=clgreen;

           x:=random((450)+110);
    y:=random((150)+110);


  ellipse(x,y,x+k,y+k);
  randomize;
          a1:=random((450)+110);

         b1:=random((150)+110);
   pen.Width:=2;
  pen.color:=clred;

   ellipse(a1,b1,a1+c,b1+c);
   end;



 w:=round((sqr(z)-sqr(o)-x-o+sqr(a1+z)-sqr(z)+sqr(o)+sqr(x+o)-sqr(a1+z)+sqr(y+o)-sqr(b1+z)) / 2*(y+o-b1-z)); // координата  по y

 q:=round((sqr(z)-sqr(o)-sqr(x+o)+sqr(a1+z)-sqr(y+o)+sqr(b1+z)+sqr(z)-sqr(o)-x-o+sqr(a1+z) // координата   x

 -sqr(z)+sqr(o)+sqr(x+o)-sqr(a1+z)+sqr(y+o)-sqr(b1+z)) /-2*(x+o-a1-z));

p:= round(sqrt(sqr(a1+z-x-o)+sqr(y+o+b1+2))); // расстояние между центрами окружностей
begin
 if p<o+z then begin
 memo1.text:='Окружности пересекаются в точке y='+floattostr(w)+'x='+floattostr(q)  ;

  end;

  end;


end;
procedure TForm1.Button2Click(Sender: TObject);
begin
chart1.Refresh;
memo1.Clear;
end;

end.




подскажите хоть , почему он не определяет когда они просто пересекаются или нет , ведь там формулка по пифагору коротка , не выходит

Последний раз редактировалось qpmr, 24.02.2012 в 00:18.
Ответить с цитированием
  #2  
Старый 24.02.2012, 17:09
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Для начала вынести randomize куда нибудь в FormCreate;

И если задать внятные имена переменных и переписать вот так

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize; // вот так
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  x1,y1,r1,d1:integer; // координаты центра, радиус и диаметр первого круга
  x2,y2,r2,d2:integer;// координаты центра , радиус и диаметр второго круга
  xo,yo:integer;// координаты точки пересечения
begin
  r1:=strtoint(edit1.Text);
  d1:=round(r1*2);
  r2:=strtoint(edit2.Text);
  d2:=round(r2*2);
  with chart1.Canvas do
  begin
    pen.Width:=3;
    pen.color:=clgreen;

    x1:=random((450)+110); // здесь вычисляем не верхний левый угол
    y1:=random((150)+110); // а центр круга
    Brush.Style:=bsClear;
    ellipse(x1-r1,y1-r1,x1+r1,y1+r1);// рисуем эллипс с учетом радиуса


    x2:=random((450)+110);
    y2:=random((150)+110);
    pen.Width:=2;
    pen.color:=clred;

    ellipse(x2-r2,y2-r2,x2+r2,y2+r2);
  end;

  yo:=round((sqr(r2)-sqr(r1)-x1-r1+sqr(x2)-sqr(r2)+sqr(r1)+sqr(x1)-sqr(x2)+sqr(y1)-sqr(y2)) / 2*(y1-y2)); // координата  по y1

  xo:=round((sqr(r2)-sqr(r1)-sqr(x1)+sqr(x2)-sqr(y1)+sqr(y2)+sqr(r2)-sqr(r1)-x1+sqr(x2) // координата   x1

  -sqr(r2)+sqr(r1)+sqr(x1)-sqr(x2)+sqr(y1)-sqr(y2)) /-2*(x1-x2));

(*  p:= round(sqrt(sqr(x2+r2-x1-r1)+sqr(y1+r1+y2+2))); // расстояние между центрами окружностей*)

  p:= round(sqrt(sqr(x2-x1)+sqr(y1-y2))); // расстояние между центрами окружностей*)  begin

  if p>r1+r2 then // проверяем, что окружности находятся слишком далеко
  begin
      memo1.text:='Окружности не пересекаются ' ;
  end else
  if p< Abs(r1-r2) then// проверяем, что одна окружность находятся целиком внутри другой
  begin
      memo1.text:='Окружности не пересекаются ' ;
  end else
  begin
    memo1.text:='Окружности пересекаются в точке y='+floattostr(yo)+'x='+floattostr(xo)  ;
  end;

end;

то сразу станет очевидна ошибка в формуле, вычисляющей p

формулы для xo и yo не проверял, но цыфры получаются какие-то огромные
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter