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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.04.2009, 18:18
AIDEN AIDEN вне форума
Прохожий
 
Регистрация: 27.04.2009
Сообщения: 2
Репутация: 10
По умолчанию Принадлежит ли точка к области треугольника

Здравствуйте, я понимаю что в инете есть множество примеров реализации данной задачи. Но мне надо реализовать через создание классов(точки и вектора). Большую часть я с горем пополам сделал(создал классы и построил треугольник), а вот теперь не могу понять как сделать так чтобы оно определяло именно находится точка в треугольнике или нет.

Код:
unit Lab6V2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
//=============================================================================//
  TDot = Class(TObject)
  private
    X,Y:integer;
    R:integer;
    Color:COLORREF;
  public
    procedure init(Xo,Yo,Ro:integer; CR:colorref);
    Procedure Draw;
  end;
//=============================================================================//
  TVec = class(TObject)
  private
    X,Y:integer;
    R:Integer;
    Color:Colorref;
  public
    procedure init(A,B:TDot; D:Integer; Cr:colorref);
    procedure Draw(A:TDot);
    procedure Rotate(A:TVec; f:real);
    Procedure EndVector(A:TDot; Var B:TDot);
  end;
//=============================================================================//
  Tmain = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  
  private
    A,B,C:TDot;
    AB,AC,BC:TVEc;
    Count:Integer;
  public

  end;
//=============================================================================//
var
  main: Tmain;

implementation

{$R *.dfm}
//=============================================================================//
Procedure TDot.init(Xo,Yo,Ro:integer; Cr:COLORREF);
begin
  X:=Xo; Y:=Yo; R:=Ro; Color:=Cr;
end;
//=============================================================================//
Procedure TDot.Draw;
begin
  main.Canvas.Brush.Color:=Color;
  main.Canvas.Pen.Color:=Color;
  main.Canvas.Ellipse(X-R, Y-R, X+R, Y+R);
end;
//=============================================================================//
procedure Tvec.init(A,B:TDot; D:integer; Cr:COLORREF);
begin
  X:=B.X - A.X;  Y:=B.Y - A.Y;
  R:=D;    Color:=Cr;
end;
//=============================================================================//
procedure Tvec.Draw(A:Tdot);
begin
   Main.Canvas.Pen.Color:=Color;
   main.Canvas.Pen.Width:=R;
   main.Canvas.MoveTo(A.X, A.Y);
   main.Canvas.LineTo(A.X+X, A.Y+Y);
end;
//=============================================================================//
procedure TVec.Rotate(A:TVec; f:real);
begin
  x:=round(a.X*Cos(F)-a.Y*Sin(F));
  y:=round(a.X*Sin(F)+a.Y*Cos(F));
end;
//=============================================================================//
procedure Tvec.EndVector(A:Tdot; var B:Tdot);
begin
   B.X:=A.X+X;
   B.Y:=A.Y+Y;
end;
//=============================================================================//
procedure Tmain.FormCreate(Sender: TObject);
begin
   A:=Tdot.Create;   B:=Tdot.Create;   C:=Tdot.Create;
   AB:=Tvec.Create;   AC:=Tvec.Create;       BC:=Tvec.Create;
   count:=1;
end;

procedure Tmain.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if count mod 2 = 1 then
   A.init(X,Y,2,RGB(0,0,255))
 else
 begin
   B.init(X,Y,2,RGB(0,0,255));
   AB.init(A,B,4,RGB(255,255,0));
   Ab.Draw(A);

   AC.init(A,B,4,RGB(255,255,0));
   AC.Rotate(AB, Pi/3);
   AC.Draw(A);

   C.init(X,Y,2,RGB(0,0,255));
   AC.EndVector(A,C);
   BC.init(B,C,4,RGB(255,255,0));
   BC.Draw(b);
 end;
 A.Draw;
 B.Draw;
 C.Draw;
 Count:=Count+1;
end;

end.
Ответить с цитированием
  #2  
Старый 27.04.2009, 23:21
DungeonLords DungeonLords вне форума
Активный
 
Регистрация: 21.07.2008
Сообщения: 257
Репутация: 14
По умолчанию

Цитата:
Сообщение от AIDEN
...а вот теперь не могу понять как сделать так чтобы оно определяло именно находится точка в треугольнике или нет.
Хм.. Посмотри в гугле про коллизию. Так же можно посмотреть про коллизию на геймдейве (http://www.gamedev.ru/).

Да, ещё, взглянул на твой код с классами. Что это . Как можно было умудриться написать в класс вектора ЦВЕТ (Color) и РАДИУС (R)?
Код:
 TVec = class(TObject)
  private
    X,Y:integer;
    R:Integer;   
 Color:Colorref;
  public
    procedure init(A,B:TDot; D:Integer; Cr:colorref);
    procedure Draw(A:TDot);
    procedure Rotate(A:TVec; f:real);
    Procedure EndVector(A:TDot; Var B:TDot);
  end;

P.S. Коллизия - столкновение. Впринципе тебе это и надо.
__________________
Делаем'c разные игры. Искать на glscene.ru

Последний раз редактировалось DungeonLords, 27.04.2009 в 23:24.
Ответить с цитированием
  #3  
Старый 28.04.2009, 09:44
AIDEN AIDEN вне форума
Прохожий
 
Регистрация: 27.04.2009
Сообщения: 2
Репутация: 10
По умолчанию

Спасибо почитаю про коллизию.
А насчет R в классе вектора то это толщина вектора, а Color это цвет вектора. Мне просто надо было чтобы Точка от Вектора визуально отличались.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter