Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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

Здраствуйте,мне нужно помощь в реализации программы построения касательных из определенной точки к окружности.Окружность привязана к курсору:координаты курсора-центр окружности.Известен радиус и точка из которой проведены две касательные к окружности.
Я аналитически вычислил обе точки касания но не всё оптимально работает:касательные правильно рису.тся в определенных координатах(в области левого края формы).Не знаю в чем проблем.Помогите пожалуйста.
Ответить с цитированием
  #2  
Старый 20.10.2008, 17:15
Qwed86 Qwed86 вне форума
Новичок
 
Регистрация: 12.09.2008
Сообщения: 66
Репутация: 10
По умолчанию

Исходник бы дал, мож и помозговал кто-нибудь.
Ответить с цитированием
  #3  
Старый 20.10.2008, 17:18
Dublin Dublin вне форума
Прохожий
 
Регистрация: 20.10.2008
Сообщения: 4
Репутация: 10
По умолчанию

Код:
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  
Старый 20.10.2008, 17:22
Dublin Dublin вне форума
Прохожий
 
Регистрация: 20.10.2008
Сообщения: 4
Репутация: 10
По умолчанию

без разбиения на процедуры
Код:
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: Пользуемсся тегами, иначе последуют санкции!

Последний раз редактировалось Admin, 20.10.2008 в 19:07.
Ответить с цитированием
  #5  
Старый 22.10.2008, 14:35
Dublin Dublin вне форума
Прохожий
 
Регистрация: 20.10.2008
Сообщения: 4
Репутация: 10
По умолчанию

Тема закрыта
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter