Fro*_*bot 13 geometry interpolation
我有一个单位直角三角形和3个顶点的每个顶点的值.我需要插值以在三角形内的某个点找到值.几个小时的搜索没有发现实际上告诉我如何做到这一点.这是我最接近的尝试,实际上非常接近但不太正确 -
result =
v1 * (1 - x) * (1 - y) +
v2 * x * (1 - y) +
v3 * x * y;
Run Code Online (Sandbox Code Playgroud)
v1,v2和v3是三角形的3个顶点处的值.(x,y)是您尝试查找值的三角形中的点.
任何一种方法都会对我有所帮助.它不一定需要是单位/右三角形.
更新的信息:我有一个均匀间隔点的网格和每个点的值.我在网格上最近的3个点做了一个三角形.这是一张图片来说明它 -

所以我必须在5,3和7之间进行插值以找到x的值.该点也可以位于另一个三角形内,这意味着您将在5,7之间进行插值,并在该方块的左下角进行插值.
在我展示的代码中,v1 = 5,v2 = 3,v3 = 7.x
是"x"方向的分数距离(范围[0-1]),y是"y"方向的分数距离.
在图片的例子中,x可能约为0.75,y约为0.2
这是我最接近的尝试 -

使用 - 创建 -
if (x > y) //if x > y then the point is in the upper right triangle
return
v1 * (1 - x) * (1 - y) +
v2 * x * (1 - y) +
v3 * x * y;
else //bottom left triangle
return
v1 * (1 - x) * (1 - y) +
v4 * (1 - x) * y +
v3 * x * y;
Run Code Online (Sandbox Code Playgroud)
另一种尝试 -

使用 - 创建 -
if (x > y)
return
(1 - x) * v1 + (x - y) * v2 + y * v3;
else
return
(1 - y) * v1 + (y - x) * v4 + x * v3;
Run Code Online (Sandbox Code Playgroud)
他们都接近我的需要,但显然不太正确.
小智 11
你应该使用重心坐标.这里有一个非常详尽的文章,也讨论了替代解决方案以及为什么重心坐标最佳:CodePlea - 三角形内插
基本上,权重最终看起来像这样:

实际上,最简单和最强大的解决方案是基于重心坐标 -
http://answers.unity3d.com/questions/383804/calculate-uv-coordinates-of-3d-point-on-plane-of-m.html
我三年前就问过这个问题,并且一直在想办法做到这一点。我确实相信除非使用等边三角形,否则不可能在没有伪影的情况下做到这一点。这是一种不错的方法,使用重心坐标,然后添加消除大部分伪影的技术。v1、v2、v3 是三角形三点处的值。x, y 是您要为其查找值的点。
if (x > y)
{
b1 = -(x - 1);
b2 = (x - 1) - (y - 1);
b3 = 1 - b1 - b2;
}
else
{
b1 = -(y - 1);
b2 = -((x - 1) - (y - 1));
b3 = 1 - b1 - b2;
}
float
abs = x - y;
if (abs < 0) abs *= -1;
if (abs < 0.25f)
{
abs = 0.25f - abs;
abs *= abs;
b1 -= abs;
b3 -= abs;
}
b1 *= b1;
b2 *= b2;
b3 *= b3;
float fd = 1 / (b1 + b2 + b3);
b1 *= fd;
b2 *= fd;
b3 *= fd;
return
v1 * b1 +
v2 * b2 +
v3 * b3;
Run Code Online (Sandbox Code Playgroud)