SetHandle and SetOrigin

BlitzMax Forums/BlitzMax Programming/SetHandle and SetOrigin

Hi all,
I'm having trouble grasping these two commands. Can someone explain to me how they work?
I've been trying to create a rotating triangle, but after rotation the lines are not drawn correctly. Note: I want to be able to draw the triangle where ever i want.
Strict

Graphics 640,480,0

Local a:tObject = New tObject
ListAddLast a.sourcelines, tLine.Create( 200,200,100,100 )
ListAddLast a.sourcelines, tLine.Create( 100,100,300,100 )
ListAddLast a.sourcelines, tLine.Create( 300,100,200,200 )

a.Draw()
Flip
WaitKey()
End

Type tObject
	Field sourcelines:tList
	Field angle:Float
	Field scale:Float	
	
	Method New()
		sourcelines = CreateList()
	End Method
	
	Method Draw()
		SetOrigin 100,100
		SetScale 1,1
		SetRotation 45
'		SetHandle 100,100
		
		For Local l:tLine = EachIn sourcelines
			DrawLine l.x1,l.y1, l.x2,l.y2
		Next
	End Method
	
End Type


Type tLine
	Field x1:Float, y1:Float
	Field x2:Float, y2:Float
	
	Function Create:tLine( x1:Float,y1:Float, x2:Float,y2:Float )
		Local l:tLine = New tLine
		l.x1 = x1
		l.x2 = x2
		l.y1 = y1
		l.y2 = y2
		Return l
	End Function
End Type


I had a play after we spoke on IRC today. SetOrigin moves the screen origin (from 0,0) to wherever you want. SetHandle moves the drawing handle, which is in screen coordinate space I think.

I don't think these commands are the solution to your problem, or indeed creating the new problem. I think the problem lies with SetRotation. You should drop the SetRotation command, and roll your own rotations.

This gives a clearer idea of why its a problem to use SetRotation:
Strict
Local ang# = 0
Graphics 640,480,0
While Not KeyDown(KEY_ESCAPE)
	ang:+1
	SetRotation ang
	DrawLine 0,0,300,0
	Flip
	Cls
Wend
End


Thanks, I get ya, I'll rotate the points myself. But I still don't get or am sure (and neither are you) what SetHandle does. The docs are in need of more examples.

I think I've worked out SetHandle now. In the Thrust-like thing I'm working on, I need to draw an image or rectangle (a thick line) representing a tractor beam from my ship to the target object.

I had this:
SetRotation(ATan2(pos.x-p.pos.x, p.pos.y-pos.y)+90#)
DrawRect(pos.x, pos.y, distance(p), 8.0#)

(pos.x,pos.y) are the co-ordinates of the ship, (p.pos.x,p.pos.y) are the co-ordinates of the target, distance(p) is the distance from the ship to the target. So SetRotation rotates the drawing axis in the direction of the target, so I just draw a rectangle 8 pixels thick with the correct length.

The problem is that the rectangle is rotated around the top-left corner, and not around a point halfway down the left-hand side. DrawRect (and the other drawing commands, I imagine) works as though it draws a rectangle width x height in size starting at the origin, then transforms it by whatever SetRotation/SetScale/SetTransform says, and finally moves it to (x,y). So, after much experimentation, I did this:
SetRotation(ATan2(pos.x-p.pos.x, p.pos.y-pos.y)+90#)
SetHandle(0.0#,4.0#)
DrawRect(pos.x, pos.y, distance(p), 8.0#)

So although the draw and rotate commands are the same, the rectangle is rotated around a different point.

Like SetRotation, SetHandle applies to everything else you draw so you have to reset it to 0,0 before you draw anything else.

teamonkey, thats great information. I'll try this tonight!!

Well, I get the idea now. SetHandle will set the rotation and scale point, applied at 'local' space. Spintext.bmx in the examples folder does a good job of showing what it's for... Thanks everyone.