Re: Geometric data type for an arc.

From: "John W(dot) Kitz" <John(dot)Kitz(at)xs4all(dot)nl>
To: <pgsql-novice(at)postgresql(dot)org>
Subject: Re: Geometric data type for an arc.
Date: 2012-05-10 13:48:49
Message-ID: 000301cd2eb3$a4e64330$eeb2c990$@Kitz@xs4all.nl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-novice

Binand,

First of all thanks for taking the time to reply.

You are right of course that "two coordinates of a center point, two
coordinates of two end points of an arc and the radius of the circle of
which the arc is a part" as mentioned in my initial post defines two arcs
(which I have seen referred to as the minor and major arc in some
documentation) instead of one that collectively define the circumference of
a circle. I realized that a couple of minutes after I sent the post.

So storing an arc in a DB would require a data type consisting of the center
point (C) coordinates XC,YC, both coordinates of the endpoints of the arc
(A1 and A2) XA1,YA1 and XA2,YA2, the radius (R) of the circle and some value
that indicates which of the two arcs the data defines, which may be e.g.
numeric (e.g. the angle in degrees between the two radii connecting the
center point to the endpoints of the arc), boolean (e.g. 1 for the major arc
and 0 for the minor one), character (e.g. "b" for the major or big arc and
"s" for the minor or small one) or text (e.g. "major" for the big arc and
"minor" for the small one).

Where Boolean seems to most obvious choice in order to use the least amount
of space.

The benefit that I imagine storing the arc in a DB once over calculating the
arc from a stored circle and several other stored values as appropriate
every time the arc is needed is reduced application processing and hence
time.

The down side I assume being that it would require the addition of a
geometric data type for an arc. Correct?

Thanks, Jk.

-----Original Message-----
From: binand(at)gmail(dot)com [mailto:binand(at)gmail(dot)com] On Behalf Of Binand
Sethumadhavan
Sent: donderdag 10 mei 2012 13:37
To: John(dot)Kitz(at)xs4all(dot)nl
Cc: pgsql-novice(at)postgresql(dot)org
Subject: Re: [NOVICE] Geometric data type for an arc.

On 10 May 2012 16:24, John W. Kitz <John(dot)Kitz(at)xs4all(dot)nl> wrote:
> What would be the easiest way to store in PostgreSQL an arc or partial
> circle, defined by the two coordinates of a center point, the two
> coordinates of the two end points of the arc and the radius of the
> circle of which the arc is a part?

This doesn't uniquely define the arc, you know. This defines two arcs (plus
the radius is redundant, since it is also the distance between the centre
and one of the points and can be computed from the given coordinates).

I'd imagine the canonical way of storing an arc of a circle in a DB would be
to store the circle to which the arc belongs to (see link you
posted) along with the angles the two radii to the end points of the arc
have with the positive X axis, and an indicator as to which of the two arcs
you intended. The angles can be calculated as invsin(y/r) for each of the
points where r is the radius.

Take a look at this picture (MS Paint, sorry!):

https://picasaweb.google.com/112929706764240025005/STUFF#5740866485548434802

You know the coordinates of C (c1, c2) and A & B ((a1, a2) and (b1,
b2) respectively), as well as r, the radius of the circle.

The first thing to do is to perform these sanity checks:

r^2 = (a1-c1)^2 + (a2-c2)^2
r^2 = (b1-c1)^2 + (b2-c2)^2

Assuming they are fine, the idea is to store the circle itself (completely
identified by coordinates of the centre and the radius), and the angles ACD
and BCD. These angles can be calculated by:

ACD = invsin((a2-c2)/r)
BCD = invsin((b2-c2)/r)

The last piece of information needed is to know which of the two arcs
- the small one or the big one - you are interested in. You can do this by
convention, by saying that you will traverse the circle in the
counter-clockwise direction and the angle stored in the first column in the
database is that of the first endpoint encountered while traversing.

The reverse calculation is equally simple:

For A:

x = c1 + r . cos ACD
y = c2 + r . sin ACD

For B:

x = c1 + r . cos BCD
y = c2 + r . sin BCD

Binand

In response to

Browse pgsql-novice by date

  From Date Subject
Next Message Simone Sanfratello 2012-05-10 14:04:56 Re: Geometric data type for an arc.
Previous Message Shawn Matthews 2012-05-10 12:43:30 I am NOT a programmer!