Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 14.09.2017, 18:48   #1 (permalink)
scorpio25
Новичок
 
Регистрация: 14.09.2017
Сообщений: 1
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Exclamation Нарисовать касательную к окружности. Delphi

Ребята, очень нужна помощь, я начинающий пользователь 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.
scorpio25 вне форума   Ответить с цитированием

Старый 14.09.2017, 18:48
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Пожалуйста, ознакомьтесь с информацией по этим ссылкам

Определить радиус и центр окружности минимального радиуса
Помогите нарисовать картинку
Помогите нарисовать картинку.
Найти длину дуги окружности
Кто сможет нарисовать ?

Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 00:38.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.