sql >> データベース >  >> RDS >> PostgreSQL

Postgres関数を使用して、固定サイズの回転する長方形内の点を見つけることはできますか?

    最終的に、長方形の頂点を生成し、それらの頂点を回転させてから、長方形の面積(定数)を、テストポイントを含めて作成された4つの三角形の面積と比較しました。

    この手法は、倹約的な回答 に基づいています。 :

    長方形は

    によって定義されます
    • A 左下(-x / 2、-y / 2)

    • B 左上(-x / 2、+ y / 2)

    • C 右上(+ x / 2、+ y / 2)

    • D 右下(+ x / 2、-y / 2)

    次に、このコードは、点(qx、qy)が幅x=10の長方形の内側にあるかどうかを確認します。 と高さy=20 、原点(0,0)を中心に、0〜180の範囲の角度で10度回転します。

    これがコードです。 75万点の確認には9分かかるので、まだまだ改善の余地があります。さらに、9.6にアップグレードすると並列化できます

    with t as (select 10*0.5 as x, 20*0.5 as y, 17.0 as qx, -3.0 as qy)
    
    select 
        z.angle
        -- ABC area
        --,abs(0.5*(z.ax*(z.by-z.cy)+z.bx*(z.cy-z.ay)+z.cx*(z.ay-z.by)))
    
        -- CDA area
        --,abs(0.5*(z.cx*(z.dy-z.ay)+z.dx*(z.ay-z.cy)+z.ax*(z.cy-z.dy)))
    
        -- ABCD area
        ,abs(0.5*(z.ax*(z.by-z.cy)+z.bx*(z.cy-z.ay)+z.cx*(z.ay-z.by))) + abs(0.5*(z.cx*(z.dy-z.ay)+z.dx*(z.ay-z.cy)+z.ax*(z.cy-z.dy))) as abcd_area
    
        -- ABQ area
        --,abs(0.5*(z.ax*(z.by-z.qx)+z.bx*(z.qy-z.ay)+z.qx*(z.ay-z.by)))
    
        -- BCQ area
        --,abs(0.5*(z.bx*(z.cy-z.qx)+z.cx*(z.qy-z.by)+z.qx*(z.by-z.cy)))
    
        -- CDQ area
        --,abs(0.5*(z.cx*(z.dy-z.qx)+z.dx*(z.qy-z.cy)+z.qx*(z.cy-z.dy)))
    
        -- DAQ area
        --,abs(0.5*(z.dx*(z.ay-z.qx)+z.ax*(z.qy-z.dy)+z.qx*(z.dy-z.ay)))
    
        -- total area of triangles with question point (ABQ + BCQ + CDQ + DAQ)
        ,abs(0.5*(z.ax*(z.by-z.qx)+z.bx*(z.qy-z.ay)+z.qx*(z.ay-z.by)))
            + abs(0.5*(z.bx*(z.cy-z.qx)+z.cx*(z.qy-z.by)+z.qx*(z.by-z.cy)))
            + abs(0.5*(z.cx*(z.dy-z.qx)+z.dx*(z.qy-z.cy)+z.qx*(z.cy-z.dy)))
            + abs(0.5*(z.dx*(z.ay-z.qx)+z.ax*(z.qy-z.dy)+z.qx*(z.dy-z.ay))) as point_area
    
    from
    (
    SELECT 
        a.id as angle
        -- bottom left (A)
        ,(-t.x) * cos(radians(a.id)) - (-t.y) * sin(radians(a.id)) as ax
        ,(-t.x) * sin(radians(a.id)) + (-t.y) * cos(radians(a.id)) as ay
        --top left (B)
        ,(-t.x) * cos(radians(a.id)) - (t.y) * sin(radians(a.id)) as bx
        ,(-t.x) * sin(radians(a.id)) + (t.y) * cos(radians(a.id)) as by
        --top right (C)
        ,(t.x) * cos(radians(a.id)) - (t.y) * sin(radians(a.id)) as cx
        ,(t.x) * sin(radians(a.id)) + (t.y) * cos(radians(a.id)) as cy
        --bottom right (D)
        ,(t.x) * cos(radians(a.id)) - (-t.y) * sin(radians(a.id)) as dx
        ,(t.x) * sin(radians(a.id)) + (-t.y) * cos(radians(a.id)) as dy
    
        -- point to check (Q)
        ,t.qx as qx
        ,t.qy as qy
    FROM generate_series(0,180,10) AS a(id), t
    ) z
    ;
    

    結果は次のようになります

    angle;abcd_area;point_area
    0;200;340
    10;200;360.6646055963
    20;200;373.409049054212
    30;200;377.846096908265
    40;200;373.84093170467
    50;200;361.515248361426
    60;200;341.243556529821
    70;200;313.641801308188
    80;200;279.548648061772
    90;200;240
    *100;200;200*
    *110;200;200*
    *120;200;200*
    *130;200;200*
    *140;200;200*
    150;200;237.846096908265
    160;200;277.643408923024
    170;200;312.04311584956
    180;200;340
    

    ここで、角度100、110、120、130、および140度の回転には、テストポイントが含まれます(*で示されます)。 )




    1. Mysql datetimeDEFAULTCURRENT_TIMESTAMPエラー

    2. 演算子が存在しません:json =json

    3. Java-スレッドメインの例外java.lang.Error:未解決のコンパイルの問題

    4. なぜmysqldがLinuxシステムの4つの場所にあるのですか?