|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.10.2008, 16:52 | #1 |
Регистрация: 11.10.2008
Сообщений: 6
|
Касательные к окружности
Здраствуйте,мне нужно помощь в реализации программы построения касательных из определенной точки к окружности.Окружность привязана к курсору:координаты курсора-центр окружности.Известен радиус и точка из которой проведены две касательные к окружности.
Я аналитически вычислил обе точки касания но не всё оптимально работает:касательные правильно рису.тся в определенных координатах(в области левого края формы).Не знаю в чем проблем.Помогите пожалуйста. |
20.10.2008, 17:23 | #2 |
Регистрация: 11.10.2008
Сообщений: 6
|
Вот код моей частично рабочей проги
unit MainUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) PB1: TPaintBox; procedure FormClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormDbClick(Sender: TObject); private { Private declarations } OldPenMode:TPenMode; StartX, StartY, OldX, OldY:Integer; dragging:Boolean; public { Public declarations } end; const x1=0; y1=0; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin dragging:=false; end; procedure TForm1.FormClick(Sender: TObject); begin dragging:=true; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var a,b,t: integer; Xn1,Xn2,Yn1,Yn2:variant; A1,B1,C1,D,x11,x22,y11,y22:extended ; begin StartX:=X; StartY:=Y; if dragging=false then exit; PB1.Canvas.Brush.Color:=clBlack; PB1.Canvas.Rectangle(0, 0,1400, 1400 ); PB1.Canvas.Pen.Color:=clBlack; PB1.Canvas.Rectangle(0, 0,1400, 1400 ); PB1.Canvas.Pen.Color:=clWhite; PB1.Canvas.Ellipse(StartX-140, StartY-140,OldX+140, OldY+140 ); A1:=sqr(x1)-2*x1*startx+sqr(startx)+sqr(y1)-2*y1*starty+sqr(starty); B1:=2*sqr(140)*startx-2*sqr(140)*x1-2*sqr(x1)*startx+4*x1*sqr(startx)-2*sqr(startx)*startx-2*sqr(y1)*startx+4*y1*starty*startx-2*startx*sqr(starty); C1:=sqr(140*140)+2*sqr(140)*x1*star tx-2*sqr(140)*sqr(startx)+sqr(x1)*sqr( startx)-2*sqr(startx)*startx*x1+sqr(startx* startx)-sqr(140)*sqr(y1)+sqr(y1)*sqr(startx )+2*y1*starty*s qr(140)-2*y1*starty*sqr(startx)-sqr(140)*sqr(starty)+sqr(startx*sta rty); D:=sqr(B1)-4*A1*C1; x11:=sqrt(abs(D))-B1; x22:=-B1-sqrt(abs(D)); xn1:=x11/(2*A1); xn2:=x22/(2*A1); yn1:=starty+(sqr(140)-(xn1-startx)*(x1-startx))/(y1-starty); yn2:=starty+(sqr(140)-(xn2-startx)*(x1-startx))/(y1-starty); PB1.Canvas.Polyline([Point(x1,y1),Point(xn1,yn1)]); PB1.Canvas.Polyline([Point(xn1,yn1),Point(xn2,yn2)]); PB1.Canvas.Polyline([Point(x1,y1),Point(xn2,yn2)]); yt1:=(yn1+140); yt2:=yn2+140; xt1:=(starty+140)*xn1/yn1; PB1.Canvas.Polyline([Point(xt1,yt1),Point(400,400)]); xt2:=(starty+140)*xn2/yn2; PB1.Canvas.Polyline([Point(xt2,yt2),Point(400,400)]); end; procedure TForm1.FormDbClick(Sender: TObject); begin dragging:=false; end; end. |
20.10.2008, 22:30 | #3 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
Честно говоря терпения не хватило проверить Ваш расчет до конца. Вот другой вариант расчета:
Код:
|
21.10.2008, 20:52 | #4 |
Регистрация: 11.10.2008
Сообщений: 6
|
Спасибо Вам! Всё отлично работает, как надо.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Движение фигуры по окружности | &RiU | Помощь студентам | 3 | 31.10.2009 20:39 |
Текст в окружности. | Adamant | Свободное общение | 4 | 27.09.2008 09:58 |
Движение окружности | Ensoph | Помощь студентам | 4 | 25.09.2008 12:11 |
Движение окружности и отрезка. | Ev@ngel | Компоненты Delphi | 0 | 18.04.2008 22:16 |
Движение по окружности | Mickle | Общие вопросы Delphi | 3 | 13.04.2007 16:24 |