|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Срочно нужна помощь!
Я наверно на форуме достала уже со своей программой, но помощь мне нужна очень. Суть программы состоит в том, что рисуем две линии в разных областях Image1, и вторая линия должна передвинутся к первой(т.е. соединяуются только началом), и затем рисуется третья линия. И как мне сделать так, чтобы линии которые показывают передвижение убирались с экрана, но при этом было видно, что линиия двигается? Вот выкладываю архив программы! Помогите кто чем может
|
#2
|
||||
|
||||
Вот тут реализовано движение линии по TImage со стиранием.
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormShow(Sender: TObject); private A, B: TPoint; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); const Dist = 5; begin with Image1.Canvas do begin Pen.Color := clWhite; MoveTo(A.X, A.Y); LineTo(B.X, B.Y); case Key of VK_UP: begin A.Y := A.Y - Dist; B.Y := B.Y - Dist; end; VK_DOWN: begin A.Y := A.Y + Dist; B.Y := B.Y + Dist; end; VK_LEFT: begin A.X := A.X - Dist; B.X := B.X - Dist; end; VK_RIGHT: begin A.X := A.X + Dist; B.X := B.X + Dist; end; end; Pen.Color := clBlack; MoveTo(A.X, A.Y); LineTo(B.X, B.Y); end; end; procedure TForm1.FormShow(Sender: TObject); begin A.X := 30; A.Y := 30; B.X := 50; B.Y := 50; end; end. |
#3
|
|||
|
|||
А как это можно вставить в мою работу?
|
#4
|
|||
|
|||
maddamo4ka в архиве есть некоторое решение твоей задачи, можно сказать новогодний подарок. Реализовано движение линии. Я основывался на твою форму, т.е. исходником была твоя форма. Я туда еще добавил еще один Button, который очищает канву. Чесно говоря, алгоритм у тебя никакой, извини если обидел, я на нажатие кнопки Button1 изменил алгоритм. Все намного проще чем ты думаешь. Надо было по другому подойти к поставленной цели. Кое какое описание есть в исходнике. Ну а если что спрашивай. Держи архив. Единственый косяк это то что при начинании движения линии конечные точки двигаемой линии остаются, но я думаю ты с этим справишься
Последний раз редактировалось Ama, 25.12.2008 в 11:30. |
#5
|
|||
|
|||
Спасибо за такой новогодний подарок!Ты просто спас мою надежду на получение автомата по экзамену А то что код никакой спасибо преподавателю..это он мне помог так Единственная проблема не могу сообразить как после передвижения нарисвать третию линию которая соединяла бы концы этих двух линий я пробовала сделать следующим образом:
Код:
with Form1.Image1.Canvas do begin Pen.Color:=clBlack; MoveTo(PTop1.X, PTop1.Y); LineTo(PTop2.X, PTop2.Y); end; И еще вопрос почему закомментированно вот это: Код:
begin if (not Moving) or (iArr >= Delta) then exit; DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)), Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)), pmNotXor, clBlack); Inc(iArr); { OldPTop.X:= Round(OldPTop.X + iArr * dx); OldPBottom.X:= Round(OldPBottom.X + iArr * dx); OldPTop.Y:= Round(OldPTop.Y + iArr * dy); OldPBottom.Y:= Round(OldPBottom.Y + iArr * dy);} |
#6
|
|||
|
|||
Во первых тебе нужно переделать процедуру Timer1Timer вот код:
Код:
procedure TForm1.Timer1Timer(Sender: TObject); begin if (not Moving) then exit else begin DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)), Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)), pmNotXor, clBlack); Inc(iArr); DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)), Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)), pmNotXor, clBlack); if iArr >= Delta then begin Moving:= false; with StringGrid1 do begin DrawShape(Point(Round(OldPBottom.X + Delta * dx), Round(OldPBottom.Y + Delta * dy)), Point(StrToInt(Cells[1, 1]), StrToInt(Cells[2, 1])), pmNotXor, clBlack); DrawShape(Point(Round(OldPTop.X + Delta * dx), Round(OldPTop.Y + Delta * dy)), Point(StrToInt(Cells[3, 1]), StrToInt(Cells[4, 1])), pmNotXor, clBlack); end; Timer1.Enabled:= false; end; end; А во вторых указанный коментарий можешь убрать, это следы моей работы |
#7
|
|||
|
|||
Спасибо тебе огромнейшее прям не знаю как и благодарить а то я вообще уже была на грани нервного срыва все получилось
|
#8
|
|||
|
|||
у меня тут еще вопрос возник объясни мне пожалуйста про каждый DrawShape в процедуре Timer1Timer
Код:
procedure TForm1.Timer1Timer(Sender: TObject); begin if (not Moving) then exit else begin DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)), Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)), pmNotXor, clBlack); Inc(iArr); DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)), Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)), pmNotXor, clBlack); if iArr >= Delta then begin Moving:= false; with StringGrid1 do begin DrawShape(Point(Round(OldPBottom.X + Delta * dx), Round(OldPBottom.Y + Delta * dy)), Point(StrToInt(Cells[1, 1]), StrToInt(Cells[2, 1])), pmNotXor, clBlack); DrawShape(Point(Round(OldPTop.X + Delta * dx), Round(OldPTop.Y + Delta * dy)), Point(StrToInt(Cells[3, 1]), StrToInt(Cells[4, 1])), pmNotXor, clBlue); end; |
#9
|
|||
|
|||
DrawShape - это простая твоя процедура рисования линии. И, кстати, в этой процедуре у тебя задается параметр типа TPenMode, и стоит значение pmNotXor что означает: рисуем черную линию, если линия пересекает другую линию или другой графический объект, то цвет ее инвертируется, т.е. становится белый. Значит дополнительный параметр: AColor: TColor, можно не ставить, т.к. цвет автоматически заменится на белый если провести линию в том же месте где раньше находилась. Как ты, наверное уже заметила, в эту функцию параметр цвета я задаю постоянно черный, т.е. его не меняю, потому что он там и не нужем. Мне просто лень стало переделывать DrawShape.
Так вот в обработчике таймера то бишь в Timer1Timer я просто прорисовываю линию сначало где была, т.е. цвет меняется на белый (линия изчезает), а потом прорисовываю линию со смещенными координатами, смотри пояснения в данном коде. Переменная iArr - счетчик шагов, костанта Delta - количество шагов. Алгоритм перемещения таков: расстояние между двумя линиями я делю на Delta отрезков и через iArr я перемещаю линию то отрезкам. Я думаю ты поняла. А вообще лучше очисти свой код от мусора и попробуй изучить его, тогда будет все ясно Код:
procedure TForm1.Timer1Timer(Sender: TObject); begin if (not Moving) then exit else begin {Рисую новую линию в "старом месте", т.е. она исчезает} DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)), Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)), pmNotXor, clBlack); Inc(iArr);{Увеличиваю количество шагов на 1} {Рисую новую линию со смещенным шагом} DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)), Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)), pmNotXor, clBlack); if iArr >= Delta then {если количество шагов достигла предела то} begin Moving:= false; with StringGrid1 do begin {Рисую линию соединяющую нижние концы линий} DrawShape(Point(Round(OldPBottom.X + Delta * dx), Round(OldPBottom.Y + Delta * dy)), Point(StrToInt(Cells[1, 1]), StrToInt(Cells[2, 1])), pmNotXor, clBlack); {Рисую линию соединяющую верхние концы линий} DrawShape(Point(Round(OldPTop.X + Delta * dx), Round(OldPTop.Y + Delta * dy)), Point(StrToInt(Cells[3, 1]), StrToInt(Cells[4, 1])), pmNotXor, clBlue); {Почему 2 линии? Потому что, я не знаю какие концы соединились, верхние или нижние, поэтому одна из линий превратится в точку, что я думаю не так уж важно} end; |
#10
|
|||
|
|||
DrawShape - это простая твоя процедура рисования линии. И, кстати, в этой процедуре у тебя задается параметр типа TPenMode, и стоит значение pmNotXor что означает: рисуем черную линию, если линия пересекает другую линию или другой графический объект, то цвет ее инвертируется, т.е. становится белый. Значит дополнительный параметр: AColor: TColor, можно не ставить, т.к. цвет автоматически заменится на белый если провести линию в том же месте где раньше находилась. Как ты, наверное уже заметила, в эту функцию параметр цвета я задаю постоянно черный, т.е. его не меняю, потому что он там и не нужем. Мне просто лень стало переделывать DrawShape.
Так вот в обработчике таймера то бишь в Timer1Timer я просто прорисовываю линию сначало где была, т.е. цвет меняется на белый (линия изчезает), а потом прорисовываю линию со смещенными координатами, смотри пояснения в данном коде. Переменная iArr - счетчик шагов, костанта Delta - количество шагов. Алгоритм перемещения таков: расстояние между двумя линиями я делю на Delta отрезков и через iArr я перемещаю линию то отрезкам. Я думаю ты поняла. А вообще лучше очисти свой код от мусора и попробуй изучить его, тогда будет все ясно Код:
procedure TForm1.Timer1Timer(Sender: TObject); begin if (not Moving) then exit else begin {Рисую новую линию в "старом месте", т.е. она исчезает} DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)), Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)), pmNotXor, clBlack); Inc(iArr);{Увеличиваю количество шагов на 1} {Рисую новую линию со смещенным шагом} DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)), Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)), pmNotXor, clBlack); if iArr >= Delta then {если количество шагов достигла предела то} begin Moving:= false; with StringGrid1 do begin {Рисую линию соединяющую нижние концы линий} DrawShape(Point(Round(OldPBottom.X + Delta * dx), Round(OldPBottom.Y + Delta * dy)), Point(StrToInt(Cells[1, 1]), StrToInt(Cells[2, 1])), pmNotXor, clBlack); {Рисую линию соединяющую верхние концы линий} DrawShape(Point(Round(OldPTop.X + Delta * dx), Round(OldPTop.Y + Delta * dy)), Point(StrToInt(Cells[3, 1]), StrToInt(Cells[4, 1])), pmNotXor, clBlue); {Почему 2 линии? Потому что, я не знаю какие концы соединились, верхние или нижние, поэтому одна из линий превратится в точку, что я думаю не так уж важно} end; |
#11
|
|||
|
|||
Че-то один раз ответил получилось два одинаковых ответа.
|
#12
|
|||
|
|||
спасибо большое все поняла
|