我试图为DirectX像素着色器找到抛物线上最接近2d中任意点的点.
大量的Google搜索向我揭示这是一个常见的微积分前作业问题.不幸的是,成百上千的相关答案都说“一旦有了这个方程式,就使用图形计算器的最小函数,它将告诉您答案是6”.
我承认我没有回想预演算.我认识到,我寻求的方程式可能就在Wikipedia上,但我不知道如何将这些希腊符号转换为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
而已.