0 / 0 / 0
Регистрация: 26.06.2017
Сообщений: 6
1

Нарисовать касательную к окружности.

26.06.2017, 20:46. Показов 1911. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, очень нужна помощь, я начинающий пользователь Delphi. И не могу разобраться с графикой.
Проблема состоит в том что по условию мне задана окружность x^2+y^2+Ax+Bx+2y+C=0 и задана свободная точка. Мне нужно найти длину касательной от свободной точки до окружности. Через Edit вводятся A, B, C и координаты свободной точки x и y. Мне нужно чтобы при расчете выводилась картинка в Image2 в виде окружности, касательной и радиуса. Причем она должна быть на математической координатной плоскости.
Вот что я смогла сделать, но понятия не имею как сделать так чтобы это отображалось на координатной плоскости((
вот код программы:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
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.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2017, 20:46
Ответы с готовыми решениями:

Построить на экране касательную к данной окружности, проходящую через заданную точку на окружности
Окружность задана координатами центра и радиусом. Построить на экране касательную к данной...

Нарисовать две окружности по задаваемым числам
Необходимо нарисовать две пересекающиеся окружности по вводимым радиусам окружностей и расстоянием...

Провести касательную к окружности и прямую параллельно касательной
Через заданную точку на окружности провести касательную. PointRectLine. Point, Line, Circle ...

Нарисовать касательную к графику y=sin(x)
нужно нарисовать касательную к sin(x) вот код к графику sin(x) for(x=-50;x&lt;=50;x++)...

21
1437 / 1014 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
27.06.2017, 00:51 2
Цитата Сообщение от scorpio25 Посмотреть сообщение
Мне нужно найти длину касательной от свободной точки до окружности.
И как это понимать? Касательная - это прямая,она бесконечна. Может, нужна длина отрезка касательной от точки касания до этой свободной точки?
0
пофигист широкого профиля
4682 / 3118 / 857
Регистрация: 15.07.2013
Сообщений: 17,976
27.06.2017, 01:48 3
Цитата Сообщение от Matan! Посмотреть сообщение
Может, нужна длина отрезка касательной от точки касания до этой свободной точки?
Добавлю. Точек касания как минимум и как максимум две.
scorpio25, а насчет отображения на "координатной плоскости" (Х.З. что это словосочетание означает в данной ситуации) может стоит использовать компонент TChart?
0
5609 / 4383 / 1396
Регистрация: 14.04.2014
Сообщений: 19,606
Записей в блоге: 19
27.06.2017, 07:22 4
не нужен тут чарт, конечно.
задача на чистую геометрию. решите сначала в числах, потом нарисовать - не проблема
отрезок от точки до центра окружности - гипотенуза прямоугольного треугольника с третьей вершиной - в точке касания.
0
0 / 0 / 0
Регистрация: 26.06.2017
Сообщений: 6
27.06.2017, 11:25  [ТС] 5
Да найти нужно отрезок от свободной точки до точки касания - это и называется длина касательной ну по крайней мере так сказал преподаватель по высшей математике

Добавлено через 2 минуты
Как нарисовать это? Сама задача в числах решена. Вот у меня проблемы как это нарисовать
0
383 / 322 / 101
Регистрация: 27.05.2017
Сообщений: 1,769
27.06.2017, 11:51 6
Давайте числа.
0
5609 / 4383 / 1396
Регистрация: 14.04.2014
Сообщений: 19,606
Записей в блоге: 19
27.06.2017, 12:52 7
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// вот то что должно было быть вычислено/задано заранее
Center:TPoint; // центр окружности
p1,p2:TPoint; // точки касания
P:TPoint; // свободная точка
 
radius:single;
...
radius:=sqrt( (center.x-p1.x)*(center.x-p1.x) + (center.y-p1.y)*(center.y-p1.y) );
 
img1.canvas.ellipse(round(center.x-radius), round(center.y-radius),round(center.x+radius), round(center.y+radius));
moveTo(p1.x, p1.y);
lineTo(p.x,p.y);
lineTo(Center.X,Center.Y);
lineTo(p2.x,p2.y);
lineTo(p.x,p.y);
0
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
27.06.2017, 13:36 8
Добавлю что нужно применить масштабирование.
Цитата Сообщение от scorpio25 Посмотреть сообщение
х^2+y^2+Ax+Bx+2y+C=0
А формула не с ошибкой? Зачем Ах+Вх?
0
383 / 322 / 101
Регистрация: 27.05.2017
Сообщений: 1,769
27.06.2017, 13:38 9
Цитата Сообщение от krapotkin Посмотреть сообщение
Delphi
1
// вот то что должно было быть вычислено/задано заранее
Только ещё координаты по Y перевернуть.
0
0 / 0 / 0
Регистрация: 26.06.2017
Сообщений: 6
27.06.2017, 14:43  [ТС] 10
Прощу прощения допустила опечатку при вводе текста там должно быть By
0
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
27.06.2017, 14:57 11
Понятно. Должно быть x^2+y^2+Ax+By+C=0, или
(x+A/2)2+(y+B/2)2=(A/2)2+(B/2)2-C
0
0 / 0 / 0
Регистрация: 26.06.2017
Сообщений: 6
27.06.2017, 16:57  [ТС] 12
из x^2+y^2+Ax+Bx+C=0, я нахожу координаты центра окружности по формулам х=-А/2 и у=-В/2 и радиус R=корень из ( (А/2)^2+(В/2)^2-C)

Добавлено через 48 минут
А как найти точки касания р1 и р2 в виде координат х и у?
0
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
27.06.2017, 17:05 13
Вы знаете координаты центра окружности, координаты точки и длину касательной. Тогда точки касания можно найти как точки пересечения двух окружностей известных радиусов и координат центров. Такое я писал в теме
Определить, пересекаются ли окружности, в этом случае вычислить координаты точек их пересечения
Не обращайте внимания что Паскаль.
После этого останется только соединить линиями нужные точки.

Добавлено через 2 минуты
Как-то писал в Делфи программу с касательными, похожую на Вашу, не могу найти, видимо название темы было кривое и не поправили.

Добавлено через 2 минуты
Поправил название Вашей темы, тоже было кривое, фиг найдешь по такому названию.
1
383 / 322 / 101
Регистрация: 27.05.2017
Сообщений: 1,769
27.06.2017, 17:05 14
Цитата Сообщение от scorpio25 Посмотреть сообщение
А как найти точки касания р1 и р2 в виде координат х и у?
Так Вы же выше написали:
Цитата Сообщение от scorpio25
Сама задача в числах решена.
Зачем обманули?
0
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
27.06.2017, 17:09 15
Девушка не совсем обманула, поскольку в задании написано
Цитата Сообщение от scorpio25 Посмотреть сообщение
Мне нужно найти длину касательной от свободной точки до окружности
А это она сделала. А потом уже возникли проблемы с графикой.
0
383 / 322 / 101
Регистрация: 27.05.2017
Сообщений: 1,769
27.06.2017, 17:22 16
Она (o rly?) нашла расстояние от свободной точки до центра окружности.
0
0 / 0 / 0
Регистрация: 26.06.2017
Сообщений: 6
27.06.2017, 17:27  [ТС] 17
Но по условию у меня нет второй окружности
0
383 / 322 / 101
Регистрация: 27.05.2017
Сообщений: 1,769
27.06.2017, 17:27 18
И вычла из него радиус.
0
Почетный модератор
64291 / 47589 / 32740
Регистрация: 18.05.2008
Сообщений: 115,181
27.06.2017, 17:30 19
Delphi
1
2
3
4
5
6
MO:=Sqrt(Sqr(xm-xa)+sqr(ym-ya));//расстояние от точки до центра окружности
    if MO>R then
      begin
        MP:=Sqrt(Sqr(MO)-sqr(R));//длина касательной
        lbl10.Caption:=FloatToStr(MP );
      end;
Добавлено через 2 минуты
Цитата Сообщение от scorpio25 Посмотреть сообщение
Но по условию у меня нет второй окружности
Но есть точка и длина касательной-> у\центр окружности и ее радиус

Добавлено через 19 секунд
Цитата Сообщение от scorpio25 Посмотреть сообщение
Но по условию у меня нет второй окружности
Но есть точка и длина касательной-> центр окружности и ее радиус
0
383 / 322 / 101
Регистрация: 27.05.2017
Сообщений: 1,769
27.06.2017, 17:34 20
А, всё, въехал, извиняюсь. Но тогда это точно не она писала.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2017, 17:34
Помогаю со студенческими работами здесь

Нарисовать касательную к двум окружностям
проблема. надо делать курсач по программированию на С++. надо что бы рисовались 2 окружности и...

Нарисовать окружности
Доброго времени суток! Помогите с задачей. Завтра ГОСы. А знаний в программирование никаких....

Нарисовать окружности
Добрый день. Я не знаю как делать эту задачу, нам вроде бы расказывали эту тему, но все равно...

Нарисовать часть окружности
Здравствуйте форумчане. Из центра окружности выходит два луча разной длины. Зная определенный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru