|
上一题我的写法:
with d as (
select x,y,power(2,row_number() over(order by x,y)) id
from (select level-1 x from dual connect by level<=6)
,(select level-1 y from dual connect by level<=6)
)
,s as (
select * from (
select d1.id+d2.id+d3.id+d4.id as id
,d1.x x1,d1.y y1
,d2.x x2,d2.y y2
,d3.x x3,d3.y y3
,d4.x x4,d4.y y4
,row_number() over(partition by d1.id+d2.id+d3.id+d4.id order by d1.id) rn
from d d1,d d2,d d3,d d4
where (d1.x<>d2.x or d1.y<>d2.y)
and d2.y-d1.y=d3.x-d2.x
and d2.x-d1.x=-(d3.y-d2.y)
and d3.y-d2.y=d4.x-d3.x
and d3.x-d2.x=-(d4.y-d3.y)
and d4.y-d3.y=d1.x-d4.x
and d4.x-d3.x=-(d1.y-d4.y)
) t
where rn=1
)
,a as ( ---- 正方形包含了哪些点
select s.id,sum(d.id) b
from s,d
where ((x2 - x1) * (y - y1) - (x - x1) * (y2 - y1))
*((x4 - x3) * (y - y3) - (x - x3) * (y4 - y3)) >=0
AND ((x3 - x2) * (y - y2) - (x - x2) * (y3 - y2))
*((x1 - x4) * (y - y4) - (x - x4) * (y1 - y4)) >=0
group by s.id
)
select count(*)
from a a1,a a2
where a1.id<a2.id
and bitand(a1.b,a2.b)=0
;
COUNT(*)
----------
1256
https://www.cnblogs.com/fangsmile/p/9306510.htm
判断点是否在一个矩形内
方帅
判断是否在矩形内:
只需要判断该点是否在上下两条边和左右两条边之间就行。
判断一个点是否在两条线段之间夹着就转化成,判断一个点是否在某条线段的一边上,就可以利用叉乘的方向性,来判断夹角是否超过了180度 如下图
只要判断(AB X AE ) * (CDX CE) >= 0 就说明E在AB,CD中间夹着,同理计算另两边DA和BC就可以了。
最后就是只需要判断
(AB X AE ) * (CD X CE) >= 0 && (DA X DE ) * (BC X BE) >= 0 。
参考代码:
复制代码
1 // 计算 |p1 p2| X |p1 p|
2 function GetCross(p1: Point, p2: Point, p: Point) {
3 return (p2.x - p1.x) * (p.y - p1.y) - (p.x - p1.x) * (p2.y - p1.y);
4 }
5 //判断点p是否在p1p2p3p4的正方形内
6 function IsPointInMatrix(p1: Point, p2: Point, p3: Point, p4: Point, p: Point) {
7 let isPointIn = GetCross(p1, p2, p) * GetCross(p3, p4, p) >= 0 && GetCross(p2, p3, p) * GetCross(p4, p1, p) >= 0;
8 return isPointIn;
9 }
复制代码
|
|