PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

क्या मैं निश्चित आकार के घूर्णन आयत के अंदर बिंदुओं को खोजने के लिए पोस्टग्रेस फ़ंक्शन का उपयोग कर सकता हूं?

मैंने आयत के शीर्षों को उत्पन्न करके, उन शीर्षों को घुमाते हुए, और फिर परीक्षण बिंदु को शामिल करके बनाए गए 4 त्रिभुजों के क्षेत्रफल के साथ आयत (स्थिर) के क्षेत्रफल की तुलना करके समाप्त किया।

यह तकनीक पारसीमोनियस उत्तर पर आधारित है। :

आयतों को

. द्वारा परिभाषित किया गया है
  • नीचे बाएँ (-x/2,-y/2)

  • बी ऊपर बाईं ओर (-x/2,+y/2)

  • सी ऊपर दाईं ओर (+x/2,+y/2)

  • डी नीचे दाईं ओर (+x/2,-y/2)

यह कोड तब जांचता है कि क्या बिंदु (qx, qy) चौड़ाई के आयत के अंदर है x=10 और ऊंचाई y=20 , जो मूल (0,0) के चारों ओर 0 से 180 की सीमा वाले कोण से 10 डिग्री तक घुमाया जाता है।

यहाँ कोड है। 750k अंक जांचने में 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql फ़ंक्शन समग्र लौटाता है - मैं समग्र मानों को अलग-अलग स्तंभों के रूप में कैसे एक्सेस करूं?

  2. plpgsql फ़ंक्शन में टैग की सरणी पास करें और इसे WHERE स्थिति में उपयोग करें

  3. मानदंड का उपयोग करके नेस्टेड क्वेरी को हाइबरनेट करें

  4. मौजूदा auth.User डेटा को नए Django 1.5 कस्टम उपयोगकर्ता मॉडल में माइग्रेट करना?

  5. हाइबरनेट (JPA) का उपयोग करके Postgresql को क्वेरी करने से तालिका नहीं मिलती है