Dr. Chris Kirtley

12-19-2002, 02:08 AM

Dear all,

Thanks for the many replies about the 'CAST' problem. Most people seem

to be using the atan2 function. I am using Javascript at the moment, for

a course on biomechanics next semester:

http://engineering.cua.edu/biomedical/courses/be202/digitizer

I was suprised to find that Javascript does indeed support the ATAN2

function, math.atan2() so I will try it.

Note, however, that this is not the complete solution. As At Hof

mentioned, there are problems when the denominator is zero, and even

more problems when (as in not-gait activities) the segments move into

the third or even fourth quadrant.

I'm reassured that I haven't missed any very elegant solution all these

years, anyway. It seems rather intellectually unsatisfying to be having

to do all these tests (they get really very tedious when all four

quadrants are considered).

Chris

--

Dr. Chris Kirtley MD PhD

Associate Professor

Dept. of Biomedical Engineering

Catholic University of America

From:

Anthony Blazevich

I've got around this problem in the past by using 'if - then'

statements. For

example code for 'if hip angle >180, then 180 + abs(hip angle)' where

abs is

the absolute value of the negative angle will give a correct value. Not

sure

if that helps in your programming format.

Tony.

From:

A.W.Smith@bton.ac.uk

Chris,

I don't know if my solution is 'elegant' or not, but have a look at the

attached BASIC code. The 'elegance' lies in the test of segment

orientation

found in the gosub routine 'SegmentPosition' (I think).

Cheers,

Drew

Human Movement Laboratory

Clinical Research Centre

School of Health Professions

University of Brighton

From:

"Einar S. Idsų"

Organization:

ITK, NTNU

As you probably know, your problem stems from the fact that the

tan-function is periodic with a period of pi and thereby maps all real

numbers to all real numbers with periodicity pi. By definition atan,

the inverse of the tan-function, maps all real numbers to (-pi/2,pi/2).

If the argument of atan is negative, then it is mapped to (-pi/2,0)

and if it is positive then it is mapped to (0,pi/2).

Without loss of generalization, let the origin of the shank be in

coordinates 0,0 and the knee at x,y. The angle of the knee will then be

expressed as atan(y/x). y is always positive, whereas x can be both

positive and negative. For positive x, all is well in your case, but for

negative x, the fraction y/x becomes negative. atan does not distinguish

between the two cases of negative y/positive x and positive y/negative x

since all it sees is a single negative number. The atan-function then

"chooses" to map the negative number to the area (-pi/2,0). Note: atan

of course also doesn't distinguish between x and y both positive or both

negative, but that is not a problem in your case since y is always

positive.

The conclusion is that in order to be able to use the atan-function

properly, you have to know the sign of both y and x (i.e. the quadrant).

In this case it is quite simple since the only argument that needs to be

checked is x: If x is negative, then the value pi should be added to the

calculated angle.

However, due to this mapping problem, an alternative function has

arisen. It is commonly known as the atan2-function and it takes two

arguments instead of one: atan(y,x). This function will map all real

numbers to the area (-pi,pi). Its implementation is just as described

above: Calculate the arctangent of the ratio y/x and check the signs of

x and y to determine the quadrant. This function could just as easily

have been implemented to map all real numbers to (0,2pi).

Hope this helps.

Kind regards,

Einar S. Idsų

PhD student

Dept. of Engineering Cybernetics

Norwegian University of Science and Technology

From:

Ulrich Simon

Dear Dr. Kirtley,

Are you able to use the ATAN2 Function? The ATAN2 function is

implemented in most of the standard program languages (C, MatLab,

FORTRAN, &). This function is called with two arguments instead of only

one argument.

Use: alpha = ATAN2(Y, X) in the range ( Pi < alpha < Pi)

Instead of: alpha = ATAN(Z); Z = Y/X in the range ( Pi/2 < alpha < Pi/2)

However, internally the ATAN2 function does nothing else than your self

written tool: determining the particular quadrant from the signs of the

two arguments. There is definitely no other way to calculate it.

Best regards

Ulrich Simon

------------------------------------------------------------

Dr.-Ing. Ulrich Simon

Institute of Orthopaedic Research and Biomechanics

University of Ulm

www.biomechanics.de

---------------------------------------------------------------

To unsubscribe send SIGNOFF BIOMCH-L to LISTSERV@nic.surfnet.nl

For information and archives: http://isb.ri.ccf.org/biomch-l

---------------------------------------------------------------

Thanks for the many replies about the 'CAST' problem. Most people seem

to be using the atan2 function. I am using Javascript at the moment, for

a course on biomechanics next semester:

http://engineering.cua.edu/biomedical/courses/be202/digitizer

I was suprised to find that Javascript does indeed support the ATAN2

function, math.atan2() so I will try it.

Note, however, that this is not the complete solution. As At Hof

mentioned, there are problems when the denominator is zero, and even

more problems when (as in not-gait activities) the segments move into

the third or even fourth quadrant.

I'm reassured that I haven't missed any very elegant solution all these

years, anyway. It seems rather intellectually unsatisfying to be having

to do all these tests (they get really very tedious when all four

quadrants are considered).

Chris

--

Dr. Chris Kirtley MD PhD

Associate Professor

Dept. of Biomedical Engineering

Catholic University of America

From:

Anthony Blazevich

I've got around this problem in the past by using 'if - then'

statements. For

example code for 'if hip angle >180, then 180 + abs(hip angle)' where

abs is

the absolute value of the negative angle will give a correct value. Not

sure

if that helps in your programming format.

Tony.

From:

A.W.Smith@bton.ac.uk

Chris,

I don't know if my solution is 'elegant' or not, but have a look at the

attached BASIC code. The 'elegance' lies in the test of segment

orientation

found in the gosub routine 'SegmentPosition' (I think).

Cheers,

Drew

Human Movement Laboratory

Clinical Research Centre

School of Health Professions

University of Brighton

From:

"Einar S. Idsų"

Organization:

ITK, NTNU

As you probably know, your problem stems from the fact that the

tan-function is periodic with a period of pi and thereby maps all real

numbers to all real numbers with periodicity pi. By definition atan,

the inverse of the tan-function, maps all real numbers to (-pi/2,pi/2).

If the argument of atan is negative, then it is mapped to (-pi/2,0)

and if it is positive then it is mapped to (0,pi/2).

Without loss of generalization, let the origin of the shank be in

coordinates 0,0 and the knee at x,y. The angle of the knee will then be

expressed as atan(y/x). y is always positive, whereas x can be both

positive and negative. For positive x, all is well in your case, but for

negative x, the fraction y/x becomes negative. atan does not distinguish

between the two cases of negative y/positive x and positive y/negative x

since all it sees is a single negative number. The atan-function then

"chooses" to map the negative number to the area (-pi/2,0). Note: atan

of course also doesn't distinguish between x and y both positive or both

negative, but that is not a problem in your case since y is always

positive.

The conclusion is that in order to be able to use the atan-function

properly, you have to know the sign of both y and x (i.e. the quadrant).

In this case it is quite simple since the only argument that needs to be

checked is x: If x is negative, then the value pi should be added to the

calculated angle.

However, due to this mapping problem, an alternative function has

arisen. It is commonly known as the atan2-function and it takes two

arguments instead of one: atan(y,x). This function will map all real

numbers to the area (-pi,pi). Its implementation is just as described

above: Calculate the arctangent of the ratio y/x and check the signs of

x and y to determine the quadrant. This function could just as easily

have been implemented to map all real numbers to (0,2pi).

Hope this helps.

Kind regards,

Einar S. Idsų

PhD student

Dept. of Engineering Cybernetics

Norwegian University of Science and Technology

From:

Ulrich Simon

Dear Dr. Kirtley,

Are you able to use the ATAN2 Function? The ATAN2 function is

implemented in most of the standard program languages (C, MatLab,

FORTRAN, &). This function is called with two arguments instead of only

one argument.

Use: alpha = ATAN2(Y, X) in the range ( Pi < alpha < Pi)

Instead of: alpha = ATAN(Z); Z = Y/X in the range ( Pi/2 < alpha < Pi/2)

However, internally the ATAN2 function does nothing else than your self

written tool: determining the particular quadrant from the signs of the

two arguments. There is definitely no other way to calculate it.

Best regards

Ulrich Simon

------------------------------------------------------------

Dr.-Ing. Ulrich Simon

Institute of Orthopaedic Research and Biomechanics

University of Ulm

www.biomechanics.de

---------------------------------------------------------------

To unsubscribe send SIGNOFF BIOMCH-L to LISTSERV@nic.surfnet.nl

For information and archives: http://isb.ri.ccf.org/biomch-l

---------------------------------------------------------------