Date: Sun, 11 Feb 2007 12:00:12 -0600 (CST) From: Stephen Montgomery-Smith <stephen@math.missouri.edu> To: Daniel Eischen <deischen@freebsd.org> Cc: "Eugene M. Kim" <freebsd.org@ab.ote.we.lv>, hackers@freebsd.org Subject: Re: sin()/cos()/tan() for kernel code? '_ 'a Message-ID: <20070211115815.O62469@math.missouri.edu> In-Reply-To: <20070211110815.O62469@math.missouri.edu> References: <45CED641.7020608@ab.ote.we.lv> <Pine.GSO.4.64.0702110941580.19880@sea.ntplx.net> <20070211110815.O62469@math.missouri.edu>
next in thread | previous in thread | raw e-mail | index | archive | help
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.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070211115815.O62469>
