在坐标点表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),C(2,1),D(2,2),E(3,3),F(3,4),G(4,3),H(4,4)
----------------------------------------------------------------------------
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