我试图为 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
就是这样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)