![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здраствуйте,мне нужно помощь в реализации программы построения касательных из определенной точки к окружности.Окружность привязана к курсору:координаты курсора-центр окружности.Известен радиус и точка из которой проведены две касательные к окружности.
Я аналитически вычислил обе точки касания но не всё оптимально работает:касательные правильно рису.тся в определенных координатах(в области левого края формы).Не знаю в чем проблем.Помогите пожалуйста. |
|
#2
|
|||
|
|||
|
Исходник бы дал, мож и помозговал кто-нибудь.
|
|
#3
|
|||
|
|||
|
Код:
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TKasat = class
StartX, StartY:Integer;
A1,B1,C1,D,x11,x22:extended;
xn1,xn2,yn1,yn2:variant;
procedure DKasat;
end;
TEllipse = class
StartX, StartY:Integer;
procedure DEllipse;
procedure Erase;
end;
TAnimation = Class
Ellipse : TEllipse;
Kasat : TKasat;
End;
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;
Picture : TAnimation;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
dragging:=false;
end;
procedure TEllipse.DEllipse;
begin
with Form1.PB1.Canvas do begin
Pen.Color:=clWhite;
Ellipse(StartX-140, StartY-140,StartX+140, StartY+140 );
end;
end;
Procedure TKasat.DKasat;
begin
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*startx-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*sqr(140)-2*y1*starty*sqr(startx)-sqr(140)*sqr(starty)+sqr(startx*starty);
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);
with Form1.PB1.Canvas do begin
Polyline([Point(x1,y1),Point(xn1,yn1)]);
Polyline([Point(xn1,yn1),Point(xn2,yn2)]);
Polyline([Point(x1,y1),Point(xn2,yn2)]);
end;
end;
procedure TEllipse.Erase;
begin
with Form1.PB1.Canvas do begin
Brush.Color:=clBlack;
Rectangle(0, 0,800, 800 );
Pen.Color:=clBlack;
Rectangle(0, 0,800, 800 );
end;
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,E:extended;
begin
StartX:=X;
StartY:=Y;
if dragging=false then exit;
with Picture do
begin
Ellipse.Erase;
Ellipse.DEllipse;
Kasat.DKasat;
end;
end;
procedure TForm1.FormDbClick(Sender: TObject);
begin
dragging:=false;
end;
end.Последний раз редактировалось Admin, 20.10.2008 в 19:06. |
|
#4
|
|||
|
|||
|
без разбиения на процедуры
Код:
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*startx-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*sqr(140)-2*y1*starty*sqr(startx)-sqr(140)*sqr(starty)+sqr(startx*starty);
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.Последний раз редактировалось Admin, 20.10.2008 в 19:07. |
|
#5
|
|||
|
|||
|
Тема закрыта
|