我正在使用Postgres
9.5,并且刚刚安装了PostGIS以获得一些扩展功能。我有一个带有(x,y)点的表,我想找到适合最大点数的矩形。约束条件是矩形边长是固定的。到目前为止,我正在计算框中没有旋转的点数。我的点以原点
(0,0) 为中心。
SELECT Sum(CASE
WHEN x > -5
AND x < 5
AND y > -10
AND y < 10 THEN 1
ELSE 0
END) AS inside_points,
Count(1) AS total_points
FROM track_t;
该查询为我提供了原点 (0,0) 和长度 x = 10 且 y = 20 的矩形内的点数。
在这里,我将创建一个由旋转的矩形角点(角,x1,y1,x2,y2)组成的辅助表,然后交叉连接到我的数据,并对每个角度的点进行计数,而按角度分组。然后,我可以选择哪个角度可以使矩形内的点最多。
但是,这似乎有点过时了,也许效果不佳。此外,对旋转的矩形内的点进行计数也不是简单的计算。
是否有更有效,更优雅的方法 (例如使用Postgres
Geometric数据类型或PostGIS Box2D)
来旋转具有固定边长的矩形,然后计算其中的点数? 几何函数看起来不错,但是它们似乎提供了最小的边界框,而不是相反。
除了Postgresql,我还使用了一个Python框架,以防SQL无法使之工作。
更新:我尝试过的一件事是使用Geometric
Types,特别是BOX
SELECT deg, Box(Point(-5, -10), Point(5, 10)) * Point(1, Radians(deg))
FROM Generate_series(0, 360, 90) AS deg
不幸的是,“按点旋转”功能不适用于Polygons。
最后,我生成了矩形顶点,旋转了这些顶点,然后将矩形(常数)的面积与通过包含测试点而形成的4个三角形的面积进行比较。
此技术基于简约的答案:
做成三角形。假设abcd是矩形,x是点,则如果
area(abx)+area(bcx)+area(cdx)+area(dax) equals area(abcd)
该点在其内部。
矩形定义为
甲 左下方(-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度。
这是代码。检查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度的旋转包括测试点(用表示*
)
在我的应用程序中,用户在同一行上点两(可以是任何角度)。所以我有以下信息 > 点坐标 点B坐标 A 点和点 B 之间的距离 A 跨距离(从用户获取作为绘制其他点的输入) 角度(从点A和点B计算)。 根据此信息,另一个应用程序绘制四个点(矩形的顶点)。 我要做的是,我必须找到这四个点(矩形)的中心点,以便能够正确地绘制这四个点之间的矩形。 现在我可以画出以中心为点的矩形,这显然是不正确的。我应该用什
使用Javascript和js库(limeJS),当用户点击某个点时,我绘制了一个矩形,然后矩形正在旋转并改变大小(只有宽度,高度是静态的),直到用户释放鼠标按钮。 (hm不能发布图像-需要10个信誉点-所以这里是图像链接http://d.pr/i/ksbq) 矩形由右上角(图像中的红点)旋转,大小和旋转是基于鼠标光标(蓝点)计算的。 最后,当用户松开鼠标按钮时,我要找到矩形的中心。 我可以做所有
我在AS3工作。 我有一个通用的矩形。这个矩形可以有任何长度、任何宽度和任何旋转。我正在尝试求解矩形四个角的x和y坐标。我知道矩形中心的坐标,我知道它的宽度、高度、最高点和最低点之间的y距离以及最远左侧和最远右侧之间的x距离,以及知道旋转。 我的代码目前看起来像这样(当然,对象是有问题的矩形,请记住,当我应用它时,它可以具有任何维度 - 这只是一种可能性。初始宽度和高度是实际的长度和宽度,而后面引
我正在尝试在虚拟桌面程序的API中编写脚本(javascript),以便我可以操作一些令牌(Car Wars :))。 我正在寻找答案,但似乎我正在挣扎并重新发明轮子,所以我想我会寻求帮助。我感到困惑的一个原因是程序返回基于y是向下的结果,Deg顺时针方向,这与所有trig公式想要的(逆时针方向和y是向上的)不同。 这是我可以访问的内容。矩形围绕中心、中心点 (x,y)、宽度、高度和旋转旋转。我有
问题内容: 我需要创建围绕其中心旋转的矩形(因此它们不必平行于坐标系的轴)。因此,基本上每个矩形都可以由 center-X , center-Y , width , height 和 angle定义 。然后,我要做的是对这些矩形中是否包含某些点进行计算(因此不会涉及任何绘图)。我想我不能使用该类,因为这些矩形将始终与坐标系的x和y轴平行。是通过编写自己的矩形类来获得此功能的唯一方法,还是可以使用任
问题内容: 我正在尝试将固定大小的数组转换为可变大小的数组(切片): 但是编译器抛出错误: 我应该如何转换? 问题答案: 使用让您在阵列上切片。另请参阅此博客文章,以获取有关数组和切片的更多信息。