14.09.2017, 18:48 | #1 (permalink) |
Новичок
Регистрация: 14.09.2017
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Нарисовать касательную к окружности. Delphi
Проблема состоит в том что по условию мне задана окружность x^2+y^2+Ax+By+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. |
14.09.2017, 18:48 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Пожалуйста, ознакомьтесь с информацией по этим ссылкам Определить радиус и центр окружности минимального радиуса Помогите нарисовать картинку Помогите нарисовать картинку. Найти длину дуги окружности Кто сможет нарисовать ? |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|