Drawing point by point

In a for-next loop there are the coordinates of points calculated. My Apple (IOS) stores the coordinates and after the loop the points are displayed. I would like the points were displayed directly after they were calculated. How can I achieve this?

That would not be good as each calculation is MUCH faster than the refresh rate of the screen, so in order to show a point NOW you would need to initiate a refresh after each calculation -> horrible flicker.

Better call canvas1.Invalidate which will update the canvas at the next scheduled refresh (about every 16 ms) which should be plenty enough.

Markus thanks!! I know it is much faster, but for demonstration I am just interested in slower drawing of the points. Using Invalidate shows just one point, while I want a drawing point by point.

If you WANT them to appear slowly…

Create a window-level picture of the same size as your canvas.

In the canvas’ PAINT event, use

g.drawpicture  thepicture,0,0

In the for… next loop, use

picture.graphics.pixel (x,y)  // to plot each point in turn

After each point , you should call

refresh may flicker but will cause an update for every point
invalidate wont flicker, but it may not show each point in turn

You might want a delay in the x,y loop if you want a really slow display

Or use a timer and every iteration draw one point to the BufferPicture to reaaaly slow it down.

add to the app a public property

Public Property Randomizer as Random

and in the app.open event

Sub Open() Handles Open Randomizer = New Random End Sub


[code]Sub Action() Handles Action

BufferPic = New Picture( Canvas1.Width, Canvas1.Height, 32 )

Iteration = 0

Timer1.Mode = Timer.ModeMultiple

End Sub[/code]


Sub Paint(g As Graphics, areas() As REALbasic.Rect) Handles Paint g.DrawPicture( BufferPic, 0, 0, g.Width, g.Height ) End Sub

Timer 1: Mode: OFF Period: 20

[code]Sub Action() Handles Action

if Iteration < BufferPic.Width Then

dim g as Graphics = BufferPic.Graphics

Dim i As Integer = App.Randomizer.InRange(-3, 3)

g.ForeColor = &c0000FF

BufferPic.Graphics.FillOval( Iteration, 100 + i, 2, 2 )

Iteration = Iteration + 1


'if iteration = 20 then break


me.Mode = Timer.ModeOff

end if
End Sub[/code]

Two window properties:

Public Property BufferPic as Picture

Public Property Iteration as Integer = 0

Ideally your Timer should be a subclass of Timer with an attached array that has all the points you want to draw