Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2008, 16:52   #1
Dublin
 
Регистрация: 11.10.2008
Сообщений: 6
По умолчанию Касательные к окружности

Здраствуйте,мне нужно помощь в реализации программы построения касательных из определенной точки к окружности.Окружность привязана к курсору:координаты курсора-центр окружности.Известен радиус и точка из которой проведены две касательные к окружности.
Я аналитически вычислил обе точки касания но не всё оптимально работает:касательные правильно рису.тся в определенных координатах(в области левого края формы).Не знаю в чем проблем.Помогите пожалуйста.
Dublin вне форума Ответить с цитированием
Старый 20.10.2008, 17:23   #2
Dublin
 
Регистрация: 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.
Dublin вне форума Ответить с цитированием
Старый 20.10.2008, 22:30   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Честно говоря терпения не хватило проверить Ваш расчет до конца. Вот другой вариант расчета:

Код:
uses Math;

const A : TPoint = (X : 300; Y : 300);  // Точка, из которой проведены касательные
const R : integer = 100;                // Радиус
var O : TPoint;                         // Центр окружности

procedure TForm2.FormCreate(Sender: TObject);
begin
   O := Point(10, 10);
end;

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   O := Point(X, Y);
   invalidate;
end;

procedure TForm2.FormPaint(Sender: TObject);
var L, L1 : double;
    a1, b1 : double;
    P1, P2 : TPoint;
    k : integer;
begin
   Canvas.Brush.Color := clBlack;

   // Рисуем точку, центр и окружность
   Canvas.FillRect(Rect(A.X-2, A.Y-2, A.X+2, A.Y+2));
   Canvas.FillRect(Rect(O.X-2, O.Y-2, O.X+2, O.Y+2));
   Canvas.Brush.Style := bsClear;
   Canvas.Ellipse(O.X-R, O.Y-R, O.X+R, O.Y+R);

   L := sqrt(sqr(O.X - A.X) + sqr(O.Y - A.Y));
   // Нельзя построить касательные
   if L <= R + 1 then exit;

   // Вычисление точек касания -----------------------------
   L1 := sqrt(sqr(L)-sqr(R));
   a1 := arcsin((O.x - A.x) / L);
   b1 := arcsin(R / L);

   if O.y < A.y then k := -1 else k := 1;

   P1.x := trunc(A.x +     L1 * sin(a1 - b1));
   P1.y := trunc(A.y + k * L1 * cos(a1 - b1));

   P2.x := trunc(A.x +     L1 * sin(a1 + b1));
   P2.y := trunc(A.y + k * L1 * cos(a1 + b1));
   // -----------------------------------------------------------

   // Рисуем точки
   Canvas.Brush.Style := bsSolid;
   Canvas.Brush.Color := clBlack;
   Canvas.FillRect(Rect(P1.X-2, P1.Y-2, P1.X+2, P1.Y+2));
   Canvas.FillRect(Rect(P2.X-2, P2.Y-2, P2.X+2, P2.Y+2));

   // и касательные
   Canvas.Polyline([P1, A, P2]);
end;
alexBlack вне форума Ответить с цитированием
Старый 21.10.2008, 20:52   #4
Dublin
 
Регистрация: 11.10.2008
Сообщений: 6
По умолчанию

Спасибо Вам! Всё отлично работает, как надо.
Dublin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение фигуры по окружности &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