<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Feb 2, 2016 at 2:37 PM, Jason Gerecke <span dir="ltr"><<a href="mailto:killertofu@gmail.com" target="_blank">killertofu@gmail.com</a>></span> wrote:</div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><br>
> I think a lot of software treats the tilt information as actually the<br>
> position of a point some distance up the pen relative to the tip. I would<br>
<br>
</span>That's certainly true for GIMP and Krita at least (see [1] and [2]).<br>
Its incorrect, but its "close enough" that nobody seems to complain<br>
(though I've been tempted to in the past ;))<br>
<span class=""><br>
> guess the hardware produces this directly (by reusing the proximity hardware<br>
> for a different point higher up in the pen). To get a projection of the pen<br>
> onto the tablet surface, these values can be fed to atan2.<br>
><br>
> If they were actual angles, they must be the angle of the projection of the<br>
> pen onto the two vertical planes of the x and y axis. This is really noisy<br>
> when the pen is near one of the axis, and I would think the hardware/driver<br>
> could not produce this except by calculating atan2 of a more linear value.<br>
><br>
> Therefore I would be very suspicious of any claim that the values being<br>
> produced are angles. The current api reporting them as normalized values<br>
> seems better.<br>
><br>
<br>
</span>I've been down this road before a few years back. Does the hardware<br>
measure and report true angles or does it measure a projection? If its<br>
a projection, does it report them directly, or does it calculate<br>
sin^-1 to transform it into an angle?<br>
<br>
In the end, the specs from the firmware guys say to interpret the data<br>
as measured in degrees, so that's what we do.<br>
<br>
[1]: <a href="https://git.gnome.org/browse/gimp/tree/app/core/gimpdynamicsoutput.c#n548" rel="noreferrer" target="_blank">https://git.gnome.org/browse/gimp/tree/app/core/gimpdynamicsoutput.c#n548</a><br>
[2]: <a href="https://github.com/KDE/krita/blob/master/libs/image/brushengine/kis_paint_information.cc#L507" rel="noreferrer" target="_blank">https://github.com/KDE/krita/blob/master/libs/image/brushengine/kis_paint_information.cc#L507</a></blockquote><div><br></div><div> Actually it certainly cannot be any angle of a plane the pen is in, as the atan2 data would not work and get quite incorrect when the pen is tilted close to a horizontal axis. Though if Gimp is producing very strange angles when the pen is nearly horizontal along one axis this may indicate that it really is an angle. For instance if tilting the pen parallel to the x axis produces angles more like 45 degrees.</div><div><br></div><div>Say some point on the pen is at x,y,z relative to the tip.</div><div><br></div><div>Possible values for the y tilt are (in order from best to worst imho):</div><div><br></div><div>y/D (where D == |x,y,z|). This goes to 1.0 as the pen is tilted horizontal. atan2(ytilt, xtilt) == atan2(y/D, x/D) == atan2(y, x) and produces the correct angle.</div><div><br></div><div>y/z: This value goes to infinity as the pen is tilted horizontal. atan2(ytilt, xtilt) == atan2(y/z, x/z) == atan2(y, x) and thus gets the xy angle exactly right.</div><div><br></div><div>atan(y/z): This would be the actual angle of the plane containing the pen and x axis projected onto the yz plane. The correct xy angle is then atan2(sin(ytilt),sin(xtilt)) == atan2(y/z, x/z) == atan2(y, x). atan2(ytilt,xtilt) would have significant errors if the magnitude of xtilt and ytilt are different.</div><div><br></div><div>asin(y/D) could be produced by somebody thinking they know how to convert y to an angle, but it does not correspond to any actual angle of the pen. The correct xy angle is again produced by atan2(sin(ytilt),sin(xtilt)) == atan2(y/D, x/D) == atan2(y, x), and doing atan2(ytilt,xtilt) would have the same errors.</div><div><br></div></div></div></div>