|
#1
|
|||
|
|||
алгоритм задачи
Здравствуйте , я хочу Найти координаты точек пересечения двух окружностей радиуса 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
|
|||
|
|||
Для начала вынести 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 не проверял, но цыфры получаются какие-то огромные |