点存在于圆中

Vel*_*n S 1 sql sql-server math geometry

让我们考虑(x,y)一个点,然后得出radius一些值r。如果假设我有一个点(a,b),我需要检查是否(a,b)位于以 为中心的圆内(x,y)

我怎样才能在 SQL Server 中实现这一点?

M.A*_*Ali 5

测试数据

\n\n
DECLARE @t TABLE (x NUMERIC(10,2), y NUMERIC(10,2), radius NUMERIC(10,2))\nINSERT INTO @t\nVALUES (3.5,3.5, 5.5),(20.5,20.5, 10.5), (30.5,30.5, 20.5)\n
Run Code Online (Sandbox Code Playgroud)\n\n

询问

\n\n
DECLARE @p1 NUMERIC(10,2) = 5.5   --<-- Point to check\nDECLARE @p2 NUMERIC(10,2) = 5.5\n\n\nSELECT *, CASE WHEN POWER( @p1 - x, 2) + POWER( @p2 - y, 2) <= POWER(radius, 2)\n             THEN 'Inside The Circle'\n            WHEN POWER( @p1 - x, 2) + POWER( @p2 - y, 2) > POWER(radius, 2)\n             THEN 'Outside the Circle' END   [Inside/Outside]\nFROM @t\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果集

\n\n
\xe2\x95\x94\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa6\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x97\n\xe2\x95\x91   x   \xe2\x95\x91   y   \xe2\x95\x91 radius \xe2\x95\x91   Inside/Outside   \xe2\x95\x91\n\xe2\x95\xa0\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xac\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa3\n\xe2\x95\x91 3.50  \xe2\x95\x91 3.50  \xe2\x95\x91 5.50   \xe2\x95\x91 Inside The Circle  \xe2\x95\x91\n\xe2\x95\x91 20.50 \xe2\x95\x91 20.50 \xe2\x95\x91 10.50  \xe2\x95\x91 Outside the Circle \xe2\x95\x91\n\xe2\x95\x91 30.50 \xe2\x95\x91 30.50 \xe2\x95\x91 20.50  \xe2\x95\x91 Outside the Circle \xe2\x95\x91\n\xe2\x95\x9a\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\xa9\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x9d\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于问题已关闭,无法添加另一个答案,因此我编辑了此内容以包括使用 Sql ServerGeometry类型的解决方案...[使用与上面相同的数据点,加上一个来在圆圈上精确演示]

\n\n
Declare @t TABLE \n   (x NUMERIC(10,2), y NUMERIC(10,2), \n    radius NUMERIC(10,2))\nInsert @t\nValues (3.5,3.5, 5.5),(20.5,20.5, 10.5), \n       (30.5,30.5, 20.5), (-5.5, 5.5, 11.0)\n\n-- --------------------------\nDeclare @pX float = 5.5    \nDeclare @pY float = 5.5\nDeclare @c geometry;\nDeclare @p geometry;\nSelect x, y, radius, \n      (geometry::Point(X, Y, 0)).STDistance(geometry::Point(@pX, @pY, 0))\nFrom @T\nWhere (geometry::Point(X, Y, 0)).STDistance(geometry::Point(@pX, @pY, 0)) > radius\n
Run Code Online (Sandbox Code Playgroud)\n