Случайные точки внутри параллелограмма - PullRequest
48 голосов
/ 27 октября 2008

У меня есть 4-сторонний выпуклый многоугольник, определяемый 4 точками в 2D, и я хочу иметь возможность генерировать случайные точки внутри него.

Если это действительно упрощает проблему, я могу ограничить полигон параллелограммом, но предпочтительнее более общий ответ.

Генерация случайных точек до тех пор, пока одна из них не окажется внутри многоугольника, не сработает, потому что это действительно непредсказуемо, сколько потребуется времени.

Ответы [ 11 ]

0 голосов
/ 13 апреля 2011

Для PostGIS это то, что я использую (вам может потребоваться защита от возможных бесконечных циклов). Вы можете экспортировать алгоритм на свой язык программирования:

CREATE or replace FUNCTION random_point(geometry)
RETURNS geometry
AS $$
DECLARE 
    env geometry;
    corner1 geometry;
    corner2 geometry;
    minx real;
    miny real;
    maxx real;
    maxy real;
    x real;
    y real;
    ret geometry;
begin

select ST_Envelope($1) into env;
select ST_PointN(ST_ExteriorRing(env),1) into corner1;
select ST_PointN(ST_ExteriorRing(env),3) into corner2;
select st_x(corner1) into minx;
select st_x(corner2) into maxx;
select st_y(corner1) into miny;
select st_y(corner2) into maxy;
loop
    select minx+random()*(maxx-minx) into x;
    select miny+random()*(maxy-miny) into y;
    select ST_SetSRID(st_point(x,y), st_srid($1)) into ret;
    if ST_Contains($1,ret) then
        return ret ;
    end if;
end loop;
end;
$$
LANGUAGE plpgsql
volatile
RETURNS NULL ON NULL INPUT;
...