![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
|||
|
|||
|
код выглядит так:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Image1:TImage;
X:Integer;
Y:Integer;
Origin, MovePt: TPoint;
Drawing: boolean;
implementation
{$R *.dfm}
procedure DrawShape(TopLeft, BottomRight:TPoint;AMode:TPenMode);
begin
with Form1.Image1.Canvas do begin
Pen.Mode :=AMode;
MoveTo(TopLeft.X, TopLeft.Y);
LineTo(BottomRight.X,BottomRight.Y);
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Drawing=true then begin
DrawShape(Origin, MovePt, pmNotXor);
MovePt := Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor);
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Image1.Canvas.MoveTo(X, Y);
Origin := Point(X, Y);
MovePt := Origin;
Drawing := true;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drawing := false;
end;
end.а ошибку выдает в MouseMove: Statement expected but 'PROCEDURE' found и тоже самое в MouseDown ![]() Последний раз редактировалось Admin, 17.10.2008 в 19:18. |
|
#17
|
|||
|
|||
|
Вот код, задающий 2 вектора (извини, стрелки лень рисовать), а потом совмещающий их начала. Дальше, думаю, сама разберешься.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Math;
type
TVector = record
ABegin : TPoint;
AEnd : TPoint;
end;
TForm1 = class(TForm)
pnToolBar: TPanel;
btGetVecors: TButton;
pnBottom: TPanel;
pbDraw: TPaintBox;
btMult: TButton;
procedure pbDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure btGetVecorsClick(Sender: TObject);
procedure pbDrawClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btMultClick(Sender: TObject);
procedure pbDrawPaint(Sender: TObject);
private
{ Private declarations }
FMode : Integer;
FV1, FV2 : TVector;
procedure DrawV(AV : TVector);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.pbDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
pnBottom.Caption := Format('X=%d; Y=%d',[X,Y]);
end;
procedure TForm1.btGetVecorsClick(Sender: TObject);
begin
ShowMessage('Вы вошли в режим ввода векторов.'#13#10'Для ввода первого вектора щелкните по точке его начала, а затем по точке его конца.');
FMode := 1;
end;
procedure TForm1.pbDrawClick(Sender: TObject);
begin
Case FMode Of
1 : // 1st point
Begin
FV1.ABegin := ScreenToClient(Mouse.CursorPos);
FMode := 2;
End;
2 : // 2nd point
Begin
FV1.AEnd := ScreenToClient(Mouse.CursorPos);
FMode := 3;
pbDraw.Repaint;
ShowMessage('Для ввода второго вектора щелкните по точке его начала, а затем по точке его конца.');
End;
3 : // 3rd point
Begin
FV2.ABegin := ScreenToClient(Mouse.CursorPos);
FMode := 4;
End;
4 : // 4th point
Begin
FV2.AEnd := ScreenToClient(Mouse.CursorPos);
pbDraw.Repaint;
FMode := 5;
pbDraw.Repaint;
ShowMessage('Вы задади оба вектора. Можете начинать процедуру умножения.');
End;
End;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FMode := 0;
end;
procedure TForm1.btMultClick(Sender: TObject);
begin
If FMode = 5
Then
Begin
// First - move V2 to V1
While (FV1.ABegin.X <> FV2.ABegin.X) Or
(FV1.ABegin.Y <> FV2.ABegin.Y) Do
Begin
FV2.ABegin.X := FV2.ABegin.X - Sign(FV2.ABegin.X - FV1.ABegin.X);
FV2.ABegin.Y := FV2.ABegin.Y - Sign(FV2.ABegin.Y - FV1.ABegin.Y);
FV2.AEnd.X := FV2.AEnd.X - Sign(FV2.ABegin.X - FV1.ABegin.X);
FV2.AEnd.Y := FV2.AEnd.Y - Sign(FV2.ABegin.Y - FV1.ABegin.Y);
pbDraw.Repaint;
Sleep(100);
End;
End
Else
ShowMessage('векторы не заданы. Умножение невозможно.');
end;
procedure TForm1.pbDrawPaint(Sender: TObject);
var
R : TRect;
begin
With pbDraw.Canvas Do
Begin
Brush.Color := clBtnFace;
R := Rect(0,0,pbDraw.Width,pbDraw.Height);
FillRect(R);
If FMode >= 2 // We have V1
Then DrawV(FV1);
If FMode > 4 // We have V2
Then DrawV(FV2);
End;
end;
procedure TForm1.DrawV(AV: TVector);
begin
// Draw vector AV
With pbDraw.Canvas Do
Begin
Pen.Color := clBlack;
MoveTo(AV.ABegin.X,AV.ABegin.Y);
LineTo(AV.AEnd.X,AV.AEnd.Y);
End;
end;
end.Форма: Код:
object Form1: TForm1
Left = 192
Top = 114
Width = 870
Height = 640
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object pbDraw: TPaintBox
Left = 0
Top = 41
Width = 862
Height = 535
Align = alClient
OnClick = pbDrawClick
OnMouseMove = pbDrawMouseMove
OnPaint = pbDrawPaint
end
object pnToolBar: TPanel
Left = 0
Top = 0
Width = 862
Height = 41
Align = alTop
BevelInner = bvLowered
TabOrder = 0
object btGetVecors: TButton
Left = 8
Top = 8
Width = 137
Height = 25
Caption = 'Задать векторы'
TabOrder = 0
OnClick = btGetVecorsClick
end
object btMult: TButton
Left = 152
Top = 8
Width = 145
Height = 25
Caption = 'Умножить векторы'
TabOrder = 1
OnClick = btMultClick
end
end
object pnBottom: TPanel
Left = 0
Top = 576
Width = 862
Height = 30
Align = alBottom
BevelInner = bvLowered
TabOrder = 1
end
end |
|
#18
|
|||
|
|||
|
Цитата:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Image1:TImage;
X:Integer;
Y:Integer;
Origin, MovePt: TPoint;
Drawing: boolean;
implementation
{$R *.dfm}
procedure DrawShape(TopLeft, BottomRight:TPoint;AMode:TPenMode);
begin
with Form1.Image1.Canvas do begin
Pen.Mode :=AMode;
MoveTo(TopLeft.X, TopLeft.Y);
LineTo(BottomRight.X,BottomRight.Y);
end;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Drawing=true then begin
DrawShape(Origin, MovePt, pmNotXor);
MovePt := Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor);
end;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Image1.Canvas.MoveTo(X, Y);
Origin := Point(X, Y);
MovePt := Origin;
Drawing := true;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drawing := false;
end;
end. |
|
#19
|
|||
|
|||
|
Спасибо всем кто помогает))
![]() |
|
#20
|
|||
|
|||
|
Цитата:
![]() |
|
#21
|
|||
|
|||
|
lmikle, что это за типы объектов?
pnToolBar: TPanel; btGetVecors: TButton; pnBottom: TPanel; pbDraw: TPaintBox; btMult: TButton; |
|
#22
|
|||
|
|||
|
Цитата:
|
|
#23
|
|||
|
|||
|
теперь ошибка в MoseDown и MoseUp
![]() |
|
#24
|
|||
|
|||
|
Цитата:
А это просто панельки и кнопочки. Просто для красоты. Ну и основная область, где происходит отрисовка (TPaintBox). просто я их переименовал, что бы не путаться. Сохрани код в файл .pas, а форму в файл .dfm и открой в Дельфе. И все увидишь. (Естественно, имя у файла должно быть одно, только расширения разные). |
|
#25
|
|||
|
|||
|
Если хочешь, скажи мыло, кину исходники и собраный экзешник.
|
|
#26
|
|||
|
|||
|
Хех, по-моему неправильно поставлен сам вопрос: я никогда в жизни не слышал о "компланарных" векторах.. Может речь идёт о коллинеарных?))
|
|
#27
|
|||
|
|||
|
Векторы называются коллинеарными, если их направленные отрезки лежат на параллельных прямых. Коллинеарные векторы a и b обозначаются a || b. Три и более векторов называются компланарными, если они лежат в одной плоскости. Взято c http://www.bymath.net/studyguide/alg/sec/alg25.html Единственное, непонятно почему 3... |
|
#28
|
|||
|
|||
|
Кста, прочитав, понял, что, видимо, нужно именно векторное произведение, а не скалярное. Соответсвенно, с этой страницы надо взять формулу и привести ее для компланарных векторов (т.е. третья координата = 0).
|
|
#29
|
|||
|
|||
|
Т.е. если выводить, то для двух вектров, у которых координата z = 0, их векторное произведение будет
a = (x,y,z) b = (u,v,w) [a,b] = k(xv - yu) т.е. это вектор, перпендикулярный имеющимся, т.е. параллельный оси Z. Отсюда и рисовать надо. Фигня какая-то получается. Т.е. надо либо задавать векторы аналитически (через TEdit, например), либо наворачивать в графике дофига разных возможностей. |