[postgis-users] Section of Circle from 3 Points and Convert toLinestring

Randall, Eric ERandall at eriecountygov.org
Thu Jun 12 01:39:33 PDT 2008


Simon,

That's perfect, thank you!

-Eric



-----Original Message-----
From: postgis-users-bounces at postgis.refractions.net
[mailto:postgis-users-bounces at postgis.refractions.net]On Behalf Of Simon
Greener
Sent: Wednesday, June 11, 2008 9:47 PM
To: PostGIS Users Discussion
Subject: Re: [postgis-users] Section of Circle from 3 Points and Convert
toLinestring


Eric,

> What a great bunch of GeoSkirmishers you are!
> Here is another question.
>
> I have a line AB where A is (0,0) and B is (10,0).
> I also have a point P that is (5,3).
> I know that the section of the circle that passes through A,P, and B
> can be determined if I know the circle center - point C, which
> can be defined as the intersection of perpendicular lines projected
> from the midpoints of AP and BP.
>
> What is the most economical way of expressing this using PostGIS/PostgreSQL fuctions?
> Alternatively, if there is a better approach, what is that? Thanks!

I don't know if this function is of use to you:

create function FindCircle(p_X1     real, p_Y1 real,
                         p_X2     real, p_Y2 real,
                         p_X3     real, p_Y3 real,
                         OUT p_CX     real,
                         OUT p_CY     real,
                         OUT p_Radius real)
     As $$
     Declare
       dA          real;
       dB          real;
       dC          real;
       dD          real;
       dE          real;
       dF          real;
       dG          real;
     BEGIN
       dA := p_X2 - p_X1;
       dB := p_Y2 - p_Y1;
       dC := p_X3 - p_X1;
       dD := p_Y3 - p_Y1;
       dE := dA * (p_X1 + p_X2) + dB * (p_Y1 + p_Y2);
       dF := dC * (p_X1 + p_X3) + dD * (p_Y1 + p_Y3);
       dG := 2.0 * (dA * (p_Y3 - p_Y2) - dB * (p_X3 - p_X2));
       -- If dG is zero then the three points are collinear and no finite-radius
       -- circle through them exists.
       If ( dG = 0 ) Then
         p_Radius := -1;
       Else
         p_CX := (dD * dE - dB * dF) / dG;
         p_CY := (dA * dF - dC * dE) / dG;
         p_Radius := sqrt(power(p_X1 - p_CX,2) + power(p_Y1 - p_CY,2) );
       End If;
     end;
$$ LANGUAGE plpgsql;

regards
Simon
-- 
SpatialDB Advice and Design, Solutions Architecture and Programming,
Oracle Database 10g Administrator Certified Associate; Oracle Database 10g SQL Certified Professional
Oracle Spatial, SQL Server, PostGIS, MySQL, ArcSDE, Manifold GIS, Radius Topology and Studio Specialist.
39 Cliff View Drive, Allens Rivulet, 7150, Tasmania, Australia.
Website: www.spatialdbadvisor.com
   Email: simon at spatialdbadvisor.com
   Voice: +613 9016 3910
Mobile: +61 418 396391
Skype: sggreener
Longitude: 147.20515 (147° 12' 18" E)
Latitude: -43.01530 (43° 00' 55" S)
NAC:W80CK 7SWP3
_______________________________________________
postgis-users mailing list
postgis-users at postgis.refractions.net
http://postgis.refractions.net/mailman/listinfo/postgis-users



More information about the postgis-users mailing list