![]() |
|
#1
|
||||
|
||||
![]() у меня нарисована парабола, и точка движется по ней,по прохождении параболы вслед за точкой исчезает нарисованная парабола,подскажите пожалуйста как можно сделать так чтобы нарисованная парабола оставалась и точка просто проходила и не стирала её
Последний раз редактировалось Mp3, 21.11.2012 в 23:53. |
#2
|
||||
|
||||
![]() Цитата:
|
#3
|
||||
|
||||
![]() да 1 пиксель,да выделена другим цветом
|
#4
|
||||
|
||||
![]() Цитата:
![]() |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Alegun (22.11.2012)
|
#5
|
||||
|
||||
![]() не совсем понял,это как ?!
|
#6
|
||||
|
||||
![]() Цитата:
|
#7
|
||||
|
||||
![]() Не проще рисовать всё с нуля? Сначала параболу, потом точку на новом месте.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
||||
|
||||
![]() спасибо за советы,щас буду пробовать
тема закрыта |
#9
|
||||
|
||||
![]() так и не разобрался =(
вот код Код:
procedure TForm1.onPaint(Sender: TObject); Var x_left, x_right,y_up, y_down,n,i:integer; tau,x,y: real; begin x_origin:=Form1.Width div 2; y_origin:=Form1.Height div 2; x_left:=round (Form1.Width/20); x_right:=round (Form1.Width-Form1.Width/20); y_up:=round (Form1.Height/20); y_down :=round (Form1.Height-Form1.Height/20); n:=10; x_step:=round ((x_right-x_left)/n); y_step:=round ((y_down - y_up)/n); with Form1.Canvas do Begin MoveTo (x_left, y_origin); LineTo (x_right, y_origin); MoveTo (x_origin, y_up); LineTo (x_origin, y_down); for i:=1 to 1000 do begin tau:=i/50; Form1.Canvas.Pixels[round(x_origin+(7*tau*tau+1)*x_step), round(y_origin+(5*tau)*y_step)]:=clBlue; end; end; end; procedure vector(x0,y0,abs_r:integer;gamma:real) ; Var alpha:real; yk, xk,x1,y1,x2,y2,delta:integer; begin with Form1.Canvas do begin xk:=round (x0+abs_r*cos(gamma)); yk:=round (y0-abs_r*sin(gamma)); MoveTo (x0,y0); LineTo (xk,yk); alpha:=Pi/6; delta:=10; x1:=round (xk-delta*(cos(alpha)*cos(gamma)+sin(alpha)*sin(gamma))); y1:=round (yk+delta*(cos(alpha)*sin(gamma)-sin(alpha)*cos(gamma))); x2:=round (xk-delta*(cos(alpha)*cos(gamma)-sin(alpha)*sin(gamma))); y2:=round (yk+delta*(cos(alpha)*sin(gamma)+sin(alpha)*cos(gamma))); MoveTo(xk,yk); LineTo(x1,y1); Moveto(xk,yk); LineTo(x2,y2); end; end; procedure TForm1.Timer1Timer(Sender: TObject); Var i,j,x0,yo:integer; track: array [1..10000] of Tpoint; begin Label1.Caption:=floattostr(t); t:=t+1/1000; i:=round (1000*t); track[i].x:=round((7*t*t+1)*x_step); track[i].y:=round((-5*t)*y_step); Form1.Canvas.Pixels[x_origin+track[i].x,y_origin-track[i].y]:=clGreen; begin Form1.Canvas.Pen.Color:=clbtnFace; Vector(x_origin+track[i-1].x,y_origin-track[i-1].y,abs(round(v_y)),Pi/2); Form1.Canvas.Pen.Color:=clBlack; Vector(x_origin+track[i].x,y_origin-track[i].y,abs(round(v_y)),Pi/2); end; end; procedure TForm1.Button1Click(Sender: TObject); begin t:=0; Form1.Timer1.Enabled:=true; end; end. если укажите в чем ошибка буду очень благодарен вопрос тот же Последний раз редактировалось Mp3, 22.11.2012 в 23:39. |
#10
|
||||
|
||||
![]() Код очень "грязный". Я одного не пойму, зачем отрисовка размазана по 3 процедурам? Таймер, в идеале, должент только дёргать OnPaint, в котором и происходит ВСЯ отрисовка.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#11
|
||||
|
||||
![]() что- то не представляю как это должно выглядеть...а таймер и дергает же paint начинается отрисовка по времени
|
#12
|
||||
|
||||
![]() Цитата:
Ещё убери затирание стрелочки (вектора) вместе с бесполезным массивом. А также перенеси всё рисование из обработчика таймера в обработчик "TForm1.onPaint". А когда это сделаешь - можешь убрать в начале обработчика таймера "Repaint;" и поставить вместо этого в конце "Invalidate;" ![]() По поводу процедуры "vector": Если она у тебя предназначена для рисования только на "TForm1", то сделай её методом этого класса. Если же нужно чтобы она рисовала на любой канве, то оставь её обычной процедурой, но добавь в параметры "Canvas: TCanvas" и рисуй на этой канве. А то сейчас процедура "vector" у тебя ни то ни сё ![]() И поубирай бесполезные упоминания переменной "Form1". |