Geometry 从点查找圆中最远的点

Geometry 从点查找圆中最远的点,geometry,Geometry,我试图找到从2D空间中的指定点获取圆的最远点的最佳方法。到目前为止,我发现的是如何得到点和圆位置之间的距离,但我不完全确定如何展开它来找到圆的最远点 已知变量为: a点 点b(圆位置) 半径r(圆半径) 为了找到点和圆位置之间的距离,我发现: xd=x2-x1 yd=y2-y1 距离=平方根(xd*xd+yd*yd) 在我看来,这是解决方案的一部分。如何将其展开以获得下图中点x的位置 作为问题的另一个可选部分:我在一些地方读到,不使用平方根就可以得到距离部分,这是非常高性能的,如果需要快速

我试图找到从2D空间中的指定点获取圆的最远点的最佳方法。到目前为止,我发现的是如何得到点和圆位置之间的距离,但我不完全确定如何展开它来找到圆的最远点

已知变量为:

  • a点
  • 点b(圆位置)
  • 半径r(圆半径)
为了找到点和圆位置之间的距离,我发现:

xd=x2-x1

yd=y2-y1

距离=平方根(xd*xd+yd*yd)

在我看来,这是解决方案的一部分。如何将其展开以获得下图中点x的位置

作为问题的另一个可选部分:我在一些地方读到,不使用平方根就可以得到距离部分,这是非常高性能的,如果需要快速代码,应该避免。就我而言,我会经常做这种计算;在主要问题的背景下对此发表任何评论都是受欢迎的。

这是怎么回事

  • 计算A-B.
    我们现在有一个向量,从圆心指向一个(如果B是原点,跳过这个,只考虑点A向量)。
  • 正常化。 现在我们有了一个定义良好的长度(长度为1)
  • 如果圆不是单位半径,则乘以半径。如果是单位半径,则跳过此项。 现在我们有了正确的长度
  • 反转符号(可以用3一步完成,只需与负半径相乘)
    现在我们的向量指向正确的方向
  • 添加B(如果B是原点,则跳过此操作)。
    现在我们的向量偏移正确,所以它的端点就是我们想要的点
  • (或者,您可以计算B-A以保存求反,但随后必须再执行一次操作以正确偏移原点。)

    顺便说一句,它在3D中的工作原理是一样的,除了圆是一个球体,向量有3个分量(或者4个分量,如果你使用同质坐标,在这种情况下,记住——为了正确起见——当“将点转化为向量”时,将w设置为0,当从向量生成点时,将w设置为1)

    编辑:
    (回复伪码)
    假设你有一个vec2类,它是一个由两个浮点数组成的结构,带有向量减法和标量乘法的运算符(非常简单,大约有十几行代码)和一个函数
    normalize
    ,它只需要是一个与
    inv_sqrt(x*x+y*y)
    相乘的简写(这里我的伪代码类似于C++/GLSL混合代码)可能看起来像这样:

    vec2 most_distant_on_circle(vec2 const& B, float r, vec2 const& A)
    {
        vec2 P(A - B);
        normalize(P);
        return -r * P + B;
    }
    
    您使用的大多数数学库都应该内置所有这些函数和类型。HLSL和GLSL将它们作为第一类原语和内在函数。有些GPU甚至有专用的规范化指令。

    这是怎么回事

  • 计算A-B.
    我们现在有一个向量,从圆心指向一个(如果B是原点,跳过这个,只考虑点A向量)。
  • 正常化。 现在我们有了一个定义良好的长度(长度为1)
  • 如果圆不是单位半径,则乘以半径。如果是单位半径,则跳过此步骤。 现在我们有了正确的长度
  • 反转符号(可以用3一步完成,只需与负半径相乘)
    现在我们的向量指向正确的方向
  • 添加B(如果B是原点,则跳过此操作)。
    现在我们的向量偏移正确,所以它的端点就是我们想要的点
  • (或者,您可以计算B-A以保存求反,但随后必须再执行一次操作以正确偏移原点。)

    顺便说一句,它在3D中的工作原理是一样的,除了圆是一个球体,向量有3个分量(或者4个分量,如果你使用同质坐标,在这种情况下,记住——为了正确起见——当“将点转化为向量”时,将w设置为0,当从向量生成点时,将w设置为1)

    编辑:
    (回复伪码)
    假设你有一个vec2类,它是一个由两个浮点数组成的结构,带有向量减法和标量乘法的运算符(非常简单,大约有十几行代码)和一个函数
    normalize
    ,它只需要是一个与
    inv_sqrt(x*x+y*y)
    相乘的简写(这里我的伪代码类似于C++/GLSL混合代码)可能看起来像这样:

    vec2 most_distant_on_circle(vec2 const& B, float r, vec2 const& A)
    {
        vec2 P(A - B);
        normalize(P);
        return -r * P + B;
    }
    

    你会使用的大多数数学库都应该内置所有这些函数和类型。HLSL和GLSL将它们作为第一类原语和内在函数。一些GPU甚至有专用的规范化指令。

    你比我快。我正要写:投影到圆上,然后镜像坐标。哇,你的答案是pret很快。虽然可能需要更多的细节。考虑到我在这里问了这个问题(而不是),我敢要求一些伪代码。谢谢!谢谢!这正是我所需要的。我感谢你的时间和你编辑回复的意愿。你击败了我。我正要写:投影到圆上,然后镜像坐标。哇,你的答案来得很快。尽管可能会感谢你提供更多细节。给出我在这里问了这个问题(而不是),我敢问一些伪代码。谢谢!谢谢!这正是我所需要的。我感谢你花时间和意愿编辑回复。