sin()/cos()/tan() for kernel code? '_ 'a

Stephen Montgomery-Smith stephen at math.missouri.edu
Sun Feb 11 18:00:35 UTC 2007



On Sun, 11 Feb 2007, Stephen Montgomery-Smith wrote:

>
>
> On Sun, 11 Feb 2007, Daniel Eischen wrote:
>
>> On Sun, 11 Feb 2007, Eugene M. Kim wrote:
>> 
>>> Hello all,
>>> 
>>> I am writing a mouse device driver for my Wacom tablet (Intuos 2 9x12).
>>> The tablet comes with a mouse and I managed to get valid coordinate data
>>> from the device.  However, unlike usual mice, the coordinate system is
>>> tied not to the orientation of the mouse itself, but to the tablet,
>>> which acts much like a "mouse pad".  So, for example, if I rotate the
>>> mouse 30 degrees to the left and move it left and right, the mouse
>>> cursor would move not horizontally, but to 2- or 8-o'clock.
>>> 
>>> Fortunately the mouse also provides orientation data along with
>>> coordinate data, so the correct cursor movement could be calculated from
>>> it.  The problem: The calculation needs trigonometry, but there seems to
>>> be no math library support in the kernel (I ran "grep -w cos" on the
>>> -CURRENT source tree, which turned nothing up).
>>> 
>>> Does anyone have an idea on how to do this?
>> 
>> Can't you do this in userland?  Teach moused?
>
> Since you will only need sin and cos evaluated to the nearest degree, if 
> that, I suggest a simple look up table.  There is also something called the 
> CORDIC method, I think, but I suspect that the look up table will be so much 
> easier to program, and negligable extra space overhead.
>
> Stephen

And if you do need more accuracy than the nearest degree, the formulae

sin(x+h) = sin(x) + h cos(x);
cos(x+h) = cos(x) - h sin(x)

for small h (say |h| less than half a degree) should provide way more 
accuracy than you should need.




More information about the freebsd-hackers mailing list