Angle Calculation

From FSG Wiki

Revision as of 18:00, 9 April 2008; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

Back to Main Page

Contents

Calulate an angle based on the cursor

 REMOVETRIGGER GET_ANGLE
 ON GET_ANGLE SET tmpX ($0 - X) 
 ON GET_ANGLE SET tmpY ($1 - Y)
 ON GET_ANGLE SET tmp (SQRT ((tmpX * tmpX) + (tmpY * tmpY)))

Calulate an angle based on a given coordinate

 REMOVETRIGGER GET_ANGLE2
 ON GET_ANGLE2 SET tmpX ($0 - $2) 
 ON GET_ANGLE2 SET tmpY ($1 - $3)
 ON GET_ANGLE2 SET tmp (SQRT ((tmpX * tmpX) + (tmpY * tmpY)))

How it work

OK the two function are very similar.
You can use only the second one providing each time the starting x,y and the ending x,y. So let's just focus on the second one.

Line 1

 ON GET_ANGLE2 SET tmpX ($0 - $2) 

This line is used to get the difference between the EndingX and the StartingX.

Line 2

 ON GET_ANGLE2 SET tmpY ($1 - $3)

This line is the same as the previous one, but for the Y.

Line 3

 ON GET_ANGLE2 SET tmp (SQRT ((tmpX * tmpX) + (tmpY * tmpY)))

This line is used to calculate the hypothenuse.


Example

Image:Angle_Calculation.png

New Syntax Angle Function

TRIGGER GETANGLE {
  tmpX = ($0 - $2) 
  tmpY = ($1 - $3)
  tmp = (SQRT ((tmpX * tmpX) + (tmpY * tmpY)))
}

FULL 360 ANGLE FUNCTION

ELEMENT none Laser 255 0 0 0 1 0 1 100% Clear 100 TEXT none

// $0=X $1=Y [$2=StartingX, $3=StartingY]
TRIGGER GETANGLE {
	tmp = -1
	AngleFOUND = -1
	
	EXEC GetLEN $0 $1 $2 $3
	WHILE ((tmp <= 90) && (AngleFOUND == -1)) GETANGLE2 AngleCOS 1
	tmp = -1
	WHILE ((tmp <= 90) && (AngleFOUND == -1)) GETANGLE2 AngleCOS 5
	tmp = -1
	WHILE ((tmp <= 90) && (AngleFOUND == -1)) GETANGLE2 AngleCOS 10
	tmp = -1
	WHILE ((tmp <= 90) && (AngleFOUND == -1)) GETANGLE2 AngleCOS 20
}

// $0=Angle $1=Precision (1=MORE PRECISE ... 25=LESS PRECISE)
TRIGGER GETANGLE2 {
	tmp = (tmp + 1)
	tmpX = (SIN (tmp * 1000))
	tmpDIFF = (tmpX - $0)
	
	IF (tmpDIFF < 0) <SET tmpDIFF (tmpDIFF * -1)>
	IF ((tmpDIFF <= $1) && (Quadrant == 0)) <SET AngleFOUND (180 + (90 - tmp))>
	IF ((tmpDIFF <= $1) && (Quadrant == 1)) <SET AngleFOUND (180 - (90 - tmp))>
	IF ((tmpDIFF <= $1) && (Quadrant == 2)) <SET AngleFOUND (90 - tmp)>
	IF ((tmpDIFF <= $1) && (Quadrant == 3)) <SET AngleFOUND (360 - (90 - tmp))>
	IF (AngleFOUND != -1) <SET TrueANGLE AngleFOUND>
}

// $0=X1 $1=Y1 [$2=StartingX, $3=StartingY]
TRIGGER GetLEN {
	LenX = ($0 - $2)
	LenY = ($1 - $3)

	IF (LenX < 0) <SET NegX -1>
	IF (LenX > 0) <SET NegX 1>
	IF (LenX < 0) <SET LenX (LenX * -1)>
	IF (LenY < 0) <SET NegY -1>
	IF (LenY > 0) <SET NegY 1>
	IF (LenY < 0) <SET LenY (LenY * -1)>

	IF ((NegX == -1) && (NegY == -1)) <SET Quadrant 0>
	IF ((NegX == 1) && (NegY == -1)) <SET Quadrant 1>
	IF ((NegX == 1) && (NegY == 1)) <SET Quadrant 2>
	IF ((NegX == -1) && (NegY == 1)) <SET Quadrant 3>

	LenH = (SQRT ((LenX * LenX) + (LenY * LenY)))
	AngleCOS = ((LenY * 1000) / LenH)
}

TRIGGER Newstatus {
	EXEC GETANGLE X Y 210 210
	STATUS CLEAR
	STATUS ADDTEXT "FPS ("
	STATUS ADDNUMBER FPS
	STATUS ADDTEXT ") LenX,Y=("
	STATUS ADDNUMBER LenX
	STATUS ADDTEXT ","
	STATUS ADDNUMBER LenY
	STATUS ADDTEXT ")  ANGLE="
	STATUS ADDNUMBER AngleFOUND
	STATUS ADDTEXT "°"
	
	DRAW ELEMENT:Clear FILLEDRECT 0 0 WIDTH HEIGHT
	DRAW ELEMENT:Laser LINE 210 210 ((210 - X) * -1) ((210 - Y) * -1)
	WRITE ELEMENT:Earth 100 100 20 NUMBER NegX
	WRITE ELEMENT:Earth 100 120 20 NUMBER NegY
	
	TIMER 1 FRAMES Newstatus
}

statustype = 1
EXEC defaultstatus
EXEC Newstatus