判断坐标每4点是否成矩形

在坐标点表CUX_POINTS里,找出每4个点是否围成矩形,如ABCD, EFGH, IJKL 成矩形。

 

 

CREATE TABLE CUX_POINTS

(

SEGMENT1 VARCHAR2(30 BYTE),

ROW_POSITION NUMBER,

COLUMN_POSITION NUMBER

)

 

--A(1,1),B(1,2),C21),D22),E(3,3),F34),G(4,3),H44

 

----------------------------------------------------------------------------

 

 

 

BEGIN

 

INSERT INTO CUX_POINTS VALUES('A', 1, 1);

INSERT INTO CUX_POINTS VALUES('B', 1, 2);

INSERT INTO CUX_POINTS VALUES('C', 2, 1);

INSERT INTO CUX_POINTS VALUES('D', 2, 2);

 

INSERT INTO CUX_POINTS VALUES('E', 3, 3);

INSERT INTO CUX_POINTS VALUES('F', 3, 4);

INSERT INTO CUX_POINTS VALUES('G', 4, 3);

INSERT INTO CUX_POINTS VALUES('H', 4, 4);

 

INSERT INTO CUX_POINTS VALUES('I', 5, 5);

INSERT INTO CUX_POINTS VALUES('J', 5, 6);

INSERT INTO CUX_POINTS VALUES('K', 6, 5);

INSERT INTO CUX_POINTS VALUES('L', 6, 6);

 

COMMIT;

 

END;

 

----------------------------------------------------------------------------

 

SELECT REPLACE(E.RECT, ',', '') RECT, E.RECT_POSITION

FROM(

SELECT D.RECT, D.RECT_POSITION, ROW_NUMBER() OVER(PARTITION BY D.RECT ORDER BY D.RECT) ID

FROM

(

SELECT (CASE WHEN ASCII(C1.LINE)<ASCII(C2.LINE) THEN (C1.LINE|| ',' ||C2.LINE) ELSE (C2.LINE|| ',' ||C1.LINE) END) RECT,

(C1.POSITION1||'('||C1.X1||','||C1.Y1||')' || ' ' ||C1.POSITION2||'('||C1.X2||','||C1.Y2||')'

|| ' ' || C2.POSITION1||'('||C2.X1||','||C2.Y1||')' || ' ' ||C2.POSITION2||'('||C2.X2||','||C2.Y2||')') RECT_POSITION

FROM

(

SELECT B.LINE, B.POSITION1, B.X1, B.Y1, B.POSITION2, B.X2, B.Y2, B.ID

FROM(

SELECT A.LINE, A.POSITION1, A.X1, A.Y1, A.POSITION2, A.X2, A.Y2, ROW_NUMBER() OVER(PARTITION BY A.LINE ORDER BY A.LINE) ID

FROM(

SELECT (CASE WHEN ASCII(P1.SEGMENT1)<ASCII(P2.SEGMENT1) THEN (P1.SEGMENT1|| ',' ||P2.SEGMENT1) ELSE (P2.SEGMENT1|| ',' ||P1.SEGMENT1) END) LINE,

P1.SEGMENT1 POSITION1, P1.ROW_POSITION X1, P1.COLUMN_POSITION Y1, P2.SEGMENT1 POSITION2, P2.ROW_POSITION X2, P2.COLUMN_POSITION Y2

FROM CUX_POINTS P1, CUX_POINTS P2

WHERE 1=1

AND P1.ROW_POSITION = P2.ROW_POSITION

AND P1.SEGMENT1 <> P2.SEGMENT1

) A

) B

WHERE 1=1

AND B.ID = 1

) C1

,

(

SELECT B.LINE, B.POSITION1, B.X1, B.Y1, B.POSITION2, B.X2, B.Y2, B.ID

FROM(

SELECT A.LINE, A.POSITION1, A.X1, A.Y1, A.POSITION2, A.X2, A.Y2, ROW_NUMBER() OVER(PARTITION BY A.LINE ORDER BY A.LINE) ID

FROM(

SELECT (CASE WHEN ASCII(P1.SEGMENT1)<ASCII(P2.SEGMENT1) THEN (P1.SEGMENT1|| ',' ||P2.SEGMENT1) ELSE (P2.SEGMENT1|| ',' ||P1.SEGMENT1) END) LINE,

P1.SEGMENT1 POSITION1, P1.ROW_POSITION X1, P1.COLUMN_POSITION Y1, P2.SEGMENT1 POSITION2, P2.ROW_POSITION X2, P2.COLUMN_POSITION Y2

FROM CUX_POINTS P1, CUX_POINTS P2

WHERE 1=1

AND P1.ROW_POSITION = P2.ROW_POSITION

AND P1.SEGMENT1 <> P2.SEGMENT1

) A

) B

WHERE 1=1

AND B.ID = 1

) C2

WHERE 1=1

AND C1.Y1 = C2.Y1

AND C1.Y2 = C2.Y2

AND SUBSTR(TRIM(C1.LINE), 1, INSTR(TRIM(C1.LINE), ',', 1)-1) <> SUBSTR(TRIM(C2.LINE), 1, INSTR(TRIM(C2.LINE), ',', 1)-1)

AND SUBSTR(TRIM(C1.LINE), 1, INSTR(TRIM(C1.LINE), ',', 1)-1) <> SUBSTR(TRIM(C2.LINE), INSTR(TRIM(C2.LINE), ',', 1)+1)

AND SUBSTR(TRIM(C2.LINE), INSTR(TRIM(C1.LINE), ',', 1)+1) <> SUBSTR(TRIM(C2.LINE), 1, INSTR(TRIM(C2.LINE), ',', 1)-1)

AND SUBSTR(TRIM(C1.LINE), INSTR(TRIM(C1.LINE), ',', 1)+1) <> SUBSTR(TRIM(C2.LINE), INSTR(TRIM(C2.LINE), ',', 1)+1)

) D

) E

WHERE 1=1

AND E.ID = 1

 

原文地址:https://www.cnblogs.com/quanweiru/p/2698874.html