Advertisement
Guest User

M Jansen

a guest
Dec 22nd, 2008
758
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 2.46 KB | None | 0 0
  1. /**
  2.  * Creates a star with given parameters.
  3.  *
  4.  * Needs both PostgreSDQl and Postgis.
  5.  *
  6.  * Please contact jansen (at) terrestris (dot) de when you use this function.
  7.  *
  8.  * @language PL/PGSQL
  9.  * @see selectoid.wordpress.com
  10.  * @license MIT, http://www.opensource.org/licenses/mit-license.php
  11.  * @copyright 2008, M. Jansen jansen (at) terrestris (dot) de
  12.  */
  13. CREATE OR REPLACE FUNCTION ST_StarAtPoint(
  14.     IN point geometry,
  15.     IN inner_radius NUMERIC,
  16.     IN outer_radius NUMERIC,
  17.     IN number_of_spikes INTEGER,
  18.     IN additional_rotation_degrees NUMERIC
  19. ) RETURNS GEOMETRY AS
  20. $body$
  21.     DECLARE
  22.     star_geom geometry;
  23.     BEGIN
  24.     SELECT
  25.         ST_MakePolygon(
  26.             ST_AddPoint(
  27.                 ST_MakeLine(
  28.                     ST_MakePoint(
  29.                         ST_X(
  30.                             ST_EndPoint(
  31.                                 ST_RotateZ(
  32.                                     ST_MakeLine(
  33.                                         ST_MakePoint(0, 0)
  34.                                         , ST_MakePoint(
  35.                                             0, CASE WHEN i = 1 THEN outer_radius ELSE inner_radius END
  36.                                         )
  37.                                     ),
  38.                                     CASE WHEN i = 1
  39.                                       THEN radians((360/number_of_spikes)*spike) + radians(additional_rotation_degrees)
  40.                                       ELSE radians((360/number_of_spikes)*spike) + radians(additional_rotation_degrees) + (radians((360/number_of_spikes)) / 2) END
  41.                                 )
  42.                             )
  43.                         ) + ST_X(point)
  44.                         , ST_Y(
  45.                             ST_EndPoint(
  46.                                 ST_RotateZ(
  47.                                     ST_MakeLine(
  48.                                         ST_MakePoint(0, 0)
  49.                                         , ST_MakePoint(
  50.                                             0, CASE WHEN i = 1 THEN outer_radius ELSE inner_radius END
  51.                                         )
  52.                                     ),
  53.                                     CASE WHEN i = 1
  54.                                       THEN radians((360/number_of_spikes)*spike) + radians(additional_rotation_degrees)
  55.                                       ELSE radians((360/number_of_spikes)*spike) + radians(additional_rotation_degrees) + (radians((360/number_of_spikes)) / 2) END
  56.                                 )
  57.                             )
  58.                         ) + ST_Y(point)
  59.                        
  60.                     )
  61.                 ),
  62.                 ST_MakePoint(
  63.                     ST_X(
  64.                         ST_EndPoint(
  65.                             ST_RotateZ(
  66.                                 ST_MakeLine(
  67.                                     ST_MakePoint(0, 0), ST_MakePoint(0, outer_radius)
  68.                                 )
  69.                                 , radians(additional_rotation_degrees)
  70.                             )
  71.                         )
  72.                     ) + ST_X(point)
  73.                     ,ST_Y(
  74.                         ST_EndPoint(
  75.                             ST_RotateZ(
  76.                                 ST_MakeLine(
  77.                                     ST_MakePoint(0, 0), ST_MakePoint(0, outer_radius)
  78.                                 )
  79.                                 , radians(additional_rotation_degrees)
  80.                             )
  81.                         )
  82.                     ) + ST_Y(point)
  83.                    
  84.                 )
  85.                 , -1
  86.             )
  87.         ) INTO star_geom
  88.        FROM generate_series(0, number_of_spikes) spike,
  89.         generate_series(1, 2) i;
  90.         RETURN star_geom;
  91.     END;
  92. $body$
  93. LANGUAGE plpgsql;
  94.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement