Re: Shouldn't Cairo use/offer degrees rather than radians?

Bill Spitzak <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <CAL-8oAgGdnLUmsWMm_ze45xXA8sB-tyzHcK9fTaG2Ve-omLEDQ@mail.gmail.com>
A function like this might be useful:

  cairo_rotate_2(cairo_t*, double x, double y)

This would rotate it so the x axis is angled by atan2(y,x). I am not
sure if it should also scale by hypot(x,y) or normalize the vector.
This can be implemented without any trig functions.


On Fri, Jun 30, 2017 at 12:31 PM, Bill Spitzak <[email protected]> wrote:
> Sorry I forgot to add:
>
> David may have a point, though it is not exactly what he is stating.
>
> Degrees have the property that "interesting" angles are more immune to
> data transformations than radians. float(90) == double(90), while
> float(M_PI_2) != double(M_PI_2). This can mean that you get the
> expected sin and cos for "interesting" angles more often.
>
> Where he is wrong is in thinking degrees make it easier to arrive at
> these integers from an angle. I don't think it makes any difference as
> you need to do an fmod or some equivalent in both cases.
>
>
> On Fri, Jun 30, 2017 at 12:23 PM, Bill Spitzak <[email protected]> wrote:
>> Attached python shows a plausible solution for making any multiple of
>> M_PI_2 into the expected integers. It even avoids returning negative
>> zero as that surprises people some times. As far as I can tell this
>> works for any N*M_PI_2 or (N*.5)*pi. The discontinuities near any odd
>> multiple of pi/4 are pretty infinitesimal as far as I can tell, and
>> this version is at least as accurate with magnitude as normal sin/cos.
>> It also has the rather nice property of guessing right angles when
>> extremely huge angles are put in.
>>
>> However if fails if the caller accidentally does any math using float
>> instead of double, and this demonstrates that failure. It is possible
>> to fix it with the problem of adding more noise to the output by just
>> doing everything in float instead of double, likely this would not
>> produce any unwanted artifacts for Cairo users. However at very large
>> N, N*M_PI_2 and N*M_PI_2F get far enough apart to actually produce
>> different answers even when rounded to the nearest float.
>>
>>
>> On Fri, Jun 30, 2017 at 10:51 AM, Bill Spitzak <[email protected]> wrote:
>>> David's code seems to be an alternative to atan2 that returns degrees.
>>> It has a bunch of kludges to hide the fact that the atan2d he is
>>> calling internally apparently just calls atan2 and multiplies by
>>> 180/pi. He then has another function that is in effect calculating
>>> sin() and cos() and has even more kludges to detect multiples of 45
>>> degrees.
>>>
>>> The work needed in the second function indicates that passing degrees
>>> does not really help.
>>>
>>> Although it seems like it helps as far as I can tell if you don't want
>>> discontinuities then adjusting the sin/cos results for N*pi/2 is
>>> exactly the same difficulty whether degrees or radians are used.
>>> Basically it amounts to detecting if a/90 or a/M_PI_2 is near an
>>> integer, and is thus exactly the same problem.
>>>
>>>
>>> On Thu, Jun 29, 2017 at 11:38 PM, David Kastrup <[email protected]> wrote:
>>>> David Kastrup <[email protected]> writes:
>>>>
>>>>> Lawrence D'Oliveiro <[email protected]> writes:
>>>>>
>>>>>> On Fri, 30 Jun 2017 07:02:36 +0200, David Kastrup wrote:
>>>>>>
>>>>>>> Lawrence D'Oliveiro <[email protected]> writes:
>>>>>>>
>>>>>>>> On Thu, 29 Jun 2017 08:08:04 +0200, David Kastrup wrote:
>>>>>>>>
>>>>>>>>> It replaces a sin(x)/cos(x) pair by a sin(x)/sin(pi/2-x) pair.  The
>>>>>>>>> largest cumulative effect is at pi/4.
>>>>>>>>
>>>>>>>> So you introduce a kink at π/4. How is this any better, again?
>>>>>>>
>>>>>>> There is no kink.  None at all.
>>>>>>
>>>>>> No kink? Have a look--here’s your kink, at π/4.
>>>>>
>>>>> I have no idea what you are plotting here.  Your "fake" does not look
>>>>> like a _function_ of either axis, and it also doesn't have the symmetry
>>>>> of the sin/cos pairing of my code.  So if it is neither a function in
>>>>> isolation nor the actual value pair, what is it?
>>>>>
>>>>> Care to show the program you are generating your plots with?
>>>>
>>>> And show the units it is working with?
>>>>
>>>> Cutting this a bit short: can we actually skip the part where you are
>>>> trying to show, using bravado and ad-hoc arguments, to show that I am
>>>> incompetent and don't know what I am talking about?
>>>>
>>>> If you are worried about the added jitter due to the _internal_
>>>> implementation using the built-in sin/cos with radians as arguments,
>>>> I can of course add a post-correction stage (about doubling the
>>>> computational cost, of course) that will use the addition theorem in
>>>> order to get the full resolution of angles provided by the different
>>>> rasterization of degrees and radians.  But that's sort of pointless as
>>>> it will add precision amounting to something like 2^-53 .
>>>>
>>>> --
>>>> David Kastrup
>>>>
>>>> --
>>>> cairo mailing list
>>>> [email protected]
>>>> https://lists.cairographics.org/mailman/listinfo/cairo
-- 
cairo mailing list
[email protected]
https://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.