Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在代码中求点与抛物线之间的距离_C#_C++_Math_Hlsl_Calculus - Fatal编程技术网

C# 如何在代码中求点与抛物线之间的距离

C# 如何在代码中求点与抛物线之间的距离,c#,c++,math,hlsl,calculus,C#,C++,Math,Hlsl,Calculus,对于DirectX像素着色器,我试图在抛物线上找到与2d中任意点最近的点 大量的谷歌搜索向我揭示了这是一个常见的微积分前家庭作业问题。不幸的是,数百个相关的答案都是这样说的:“一旦你有了这个方程,使用你的图形计算器的最小函数,它会告诉你答案是6。” 我承认我记不起任何微积分前的知识。我知道我寻找的等式可能就在维基百科上,但我不知道如何将这些希腊符号转换成HLSL函数。C、C++、C语言或任何其他语言的解决方案也将非常感谢。 编辑:根据请求查看输入曲线的格式: //Equation of para

对于DirectX像素着色器,我试图在抛物线上找到与2d中任意点最近的点

大量的谷歌搜索向我揭示了这是一个常见的微积分前家庭作业问题。不幸的是,数百个相关的答案都是这样说的:“一旦你有了这个方程,使用你的图形计算器的最小函数,它会告诉你答案是6。”

我承认我记不起任何微积分前的知识。我知道我寻找的等式可能就在维基百科上,但我不知道如何将这些希腊符号转换成HLSL函数。C、C++、C语言或任何其他语言的解决方案也将非常感谢。 编辑:根据请求查看输入曲线的格式:

//Equation of parabola being y = ax^2 + bx + c
//p is the arbitrary point we're trying to find the closest point on the parabola for.
float2 GetClosestPointOnParabola(float a, float b, float c, float2 p)
{
    //Something involving the distance formula...
    //Something involving "minimization"...
    return float2(x, y);
} 

你可以利用这一点:

Pmin = (xmin, ymin) ~ point on a parabola
P = (px, py) ~ point in 2d    
y = a*x^2 + bx + c ~ parabola

P(x) = (x-px)^2 + (y-py)^2 = (x-px)^2 + (a*x^2 + bx + c - py)^2
你需要计算p(x)的导数,这并不难。例如。 如果你得到:
P(x)=x^4+4x^2-3x+10

P'(x) = 4x^3 + 8x - 3
我想你知道怎么计算。然后将P'(x)与零进行比较,找出它与x轴相交的位置。从中找到一个xmin,然后从中得到ymin:

y = a*x^2 + bx + c

就是这样。

我假设你想要的是抛物线上离平面上另一点最近的点。让我们假设抛物线是由
y=a*x^2+b*x+c
给出的,并且您希望找到它上最靠近点a(xa,ya)的点

我建议你使用。它在具有对数复杂度的函数中找到局部极小值。我假设C++中有一个函数H(x),它计算从A到点的距离,其中X点等于抛物线上的x坐标。
double minDist() {
  const double epsylon = 1e-9; // used to avoid double prescision errors
  double current = 0.0;
  double step = 1e+6;
  while (step > 1e-5) { // change this with the accuracy you need
    double left_neighbour = current - step;
    double right_neighbour = current + step;
    double cval = h(current);
    double lval = h(left_neighbour);
    double rval = h(right_neighbour);
    if (cval < rval + epsylon && cval < lval + epsylon) {
      step *= 0.5;
      continue;
    }
    if (lval < rval) {
      current = left_neighbour;
    } else {
      current = right_neighbour;
    }
  }
  return current;
}
double minist(){
const double epsilon=1e-9;//用于避免双重预测错误
双电流=0.0;
双台阶=1e+6;
而(步骤>1e-5){//根据需要的精度更改此选项
双左_近邻=电流-步进;
双右近邻=电流+步进;
双cval=h(电流);
双lval=h(左邻);
双rval=h(右邻);
if(cval
在大多数情况下,您将有一个单一的本地最小值,这是您需要的答案,但可能有两个(我相信它们不能超过2)的情况。在这些情况下,需要使用不同的初始点启动函数两次


希望这能有所帮助。

一条抛物线有无限多个最近点,即抛物线上的所有点,它们的距离为零,你再也无法接近它们了。如果你对数学和数学思维的基础不满意,我猜你会发现做计算几何很令人沮丧,因为这在编程中占了很大一部分。请编辑一些代码来展示抛物线的数据是如何表示的。Kerrek SB,我为这篇不清楚的帖子道歉。我试图找到一条抛物线上最近的点,到一个不在抛物线上的点。我确信只有一个这样的点,它是与曲线切线和任意点之间形成的直线垂直的点。@Greg:请注意,抛物线有两个分支:如果a位于抛物线的对称轴上,则与a“最近的点”不一定是唯一的。我认为可以有三个同样接近的点:每边一个加上抛物线的转折点。但除了边缘的情况,你没事。@GregBahm我也有类似的问题。导数对我来说有点复杂。你找到答案了吗?好吧,现在更接近事实了。首先,我认为你们不应该对TS求导,因为他需要程序,可以对所有符号求导,得到答案,用a,b,c,px,py来表示。然后,“P'(x)到零以找到它与x轴相交的位置”-你为什么要注意穿过x轴?@Lol4t0为了找到局部极值,你需要找到导数的根。根据我的计算,你必须解以下三次方程:
(2*a^2)*x^3+(3*a*b)*x^2+(2*a*c-2*a*py+b^2+1)*x+(b*c*py px)=0
对于这样简单的情况,您可以找到EXACT表达式。看@Michal B.回答但是a,B和c是参数,所以在计算导数之后,你仍然需要教你的计算机计算三次多项式的根。你可以使用卡尔达诺的公式,但我相信答案的准确性会因为其复杂性而大大降低。@IvayloStrandjev GSL-GNU科学图书馆有一个三次方程的C解算器