Новичок
Джуниор
Регистрация: 26.06.2017
Сообщений: 1
|
Помогите с графикой в Delphi
Ребята, очень нужна помощь, я начинающий пользователь Delphi. И не могу разобраться с графикой.
Проблема состоит в том что по условию мне задана окружность x^2+y^2+Ax+Bx+2y+C=0 и задана свободная точка. Мне нужно найти длину касательной от свободной точки до окружности. Через Edit вводятся A, B, C и координаты свободной точки x и y. Мне нужно чтобы при расчете выводилась картинка в Image2 в виде окружности, касательной и радиуса. Причем она должна быть на математической координатной плоскости.
Вот что я смогла сделать, но понятия не имею как сделать так чтобы это отображалось на координатной плоскости((
вот код программы:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, jpeg, StdCtrls, Buttons, MMSystem;
type
TForm1 = class(TForm)
mm1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
img1: TImage;
img2: TImage;
grp1: TGroupBox;
lbl1: TLabel;
edt1: TEdit;
lbl2: TLabel;
edt2: TEdit;
lbl3: TLabel;
edt3: TEdit;
lbl4: TLabel;
lbl5: TLabel;
edt4: TEdit;
lbl6: TLabel;
edt5: TEdit;
grp2: TGroupBox;
grp3: TGroupBox;
clrbx1: TColorBox;
clrbx2: TColorBox;
clrbx3: TColorBox;
lbl7: TLabel;
lbl8: TLabel;
lbl9: TLabel;
btn1: TBitBtn;
btn2: TBitBtn;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
lbl10: TLabel;
procedure btn1Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N13Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
// Глобальные переменные
Form1: TForm1;
dxe,dye:integer; // шаг экранной координатной сетки в пикселях, оцифровка
he,we:integer; // высота и ширина экранной координатной сетки в пикселях
xe,ye:integer; // текущие экранные координаты
dx,dy:real; // шаг математической координатной сетки , оцифровка
x0,y0:integer; // координаты начала матем. координатных осей
x,y:real; // текущие математические координаты
Mx,My: real;//масштабы, количество пикселей в одной математической единице
xmin,xmax,ymin,ymax:integer;// предельные математ. значения на математ. осях
a1,a2,b1,b2:integer;// координаты концов матем. осей в экранной системе координат
a,b,c,xm,ym,xa,ya,R,MO,MP:Real;
implementation
uses Unit2, Unit3, Unit4;
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
dxe:=20; dye:=20; // шаг координатной сетки 20 пикселей
he:=340;// высота экранной системы координат
we:=460;// ширина экранной системы координат
xmin:=-7; xmax:=11; ymin:=-7; ymax:=7;//минимальные и максимальные значения
a1:=60; a2:=420;//приделы по оси ОХ
b1:=40; b2:=320;//приделы по оси ОY
dx:=1; dy:=1;//шаг математической сетки
with form1.img1.Canvas do
begin
// экранная система координат
MoveTo(0,1); LineTo(we,1); // ось X
MoveTo(1,0); LineTo(1,he); // ось Y
// сетка и оцифровка по оси Xe, засечек нет
xe:= dxe;
repeat
// MoveTo(x,y0);LineTo(x,y0+3); // засечка
Pen.Color:=ClrBx1.Selected;//цвет сетки
Pen.Style:=psDot; //пунктир
MoveTo(xe,0);LineTo(xe, he); // линия сетки
//Pen.Style:=psSolid; //сплошная линия
xe:=xe+dxe;
until (xe>we);
// сетка и оцифровка по оси Ye, засечек нет
ye:= dye;
repeat
//MoveTo(x0,y); LineTo(x0+3,y); // засечка
Pen.Color:=ClrBx1.Selected;//цвет сетки
Pen.Style:=psDot;
MoveTo(0,ye); LineTo(we,ye); // линия сетки
//Pen.Style:=psSolid;
ye:=ye+dye;
until (ye>he);
Mx:=round((a2-a1)/(xmax-xmin));
My:=round((b2-b1)/(ymax-ymin));
// математическая система координат
x0:=200; y0:=180;
Pen.Width:=2;
Pen.Color:=ClrBx2.Selected;//цвет сетки
MoveTo(a1,y0); LineTo(a2,y0); // ось X
MoveTo(x0,b1); LineTo(x0,b2); // ось Y
// Обозначение осей
//TextOut(x0-12,y0+5,'0');
TextOut(a2-5,y0-15, 'X');
TextOut(x0-15,b1+1,'Y');
// сетка и оцифровка по оси X,
x:= xmin;
Pen.Width:=1;
Pen.Style:=psSolid;
repeat
Xe:=round(Mx*(x-xmin)+a1);// Связь между системами координат
if (x<>12)then TextOut(xe+5,y0+5,FloatToStr(x)); //оцифровка
MoveTo(xe,b1);LineTo(xe, b2); // линия сетки
x:=x+dx;
until (x>xmax);
// сетка и оцифровка по оси y,
y:= ymin;
repeat
Ye:=round(My*(-y+ymax)+b1);
if (y<>7)then TextOut(x0+5,ye-15,FloatToStr(y)); //оцифровка
MoveTo(a1,ye);LineTo(a2, ye); // линия сетки
y:=y+dy;
until (y>ymax);
end;
begin
a:=StrToFloat(Edt1.Text);
b:=StrToFloat(Edt2.Text);
c:=StrToFloat(Edt3.Text);
xm:=StrToFloat(Edt4.Text);
ym:=StrToFloat(Edt5.Text);
xa:=-a/2;
ya:=-b/2;
R:=sqrt(Sqr(a/2)+sqr(b/2)-c);
MO:=Sqrt(Sqr(xm-xa)+sqr(ym-ya));
if MO>R then
begin
MP:=Sqrt(Sqr(MO)-sqr(R));
lbl10.Caption:=FloatToStr(MP );
end;
if MO<R then
begin
lbl10.Caption:='Решения не существует';
end;
if MO=R then
begin
lbl10.Caption:='Длина касательной равна 0';
end;
end;
end;
procedure TForm1.N5Click(Sender: TObject);
begin
Form2.ShowModal;
end;
procedure TForm1.N4Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.N11Click(Sender: TObject);
begin
Form3.ShowModal;
end;
procedure TForm1.N3Click(Sender: TObject);
begin
WinExec('Project2.exe', SW_SHOW);
end;
procedure TForm1.N13Click(Sender: TObject);
begin
Form4.ShowModal;
end;
end.
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор
а вот форма:
Последний раз редактировалось Serge_Bliznykov; 26.06.2017 в 15:52.
|