![]() |
|
|
|
|
#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 не проверял, но цыфры получаются какие-то огромные |