三角形内部线性插值方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三角形内部线性插值方法相关的知识,希望对你有一定的参考价值。

参考技术A

问题:

在三角形的三个顶点具有3个不同颜色,如何通过插值计算出三角形中每个点的颜色?

应用实例:高洛德着色使用3个顶点的颜色进行线性插值,结果如下图:

解决方案:

显然,无论是线性插值还是双线性插值的都无法解决这个问题。而使用重心坐标则可以很好的解决这个问题。简单的来说,重心坐标就是子三角形与大三角形的面积比,具体的解释参看维基百科,计算过程如下:

已知三角形的三个顶点坐标P1, P2, P3, 在三角形内的任意点P, 都存在u和v(由于三角形是一个2D图形,只有两个自由度,所以只要u和v即可),使得

P = (1 - u - v) * P1 + u * P2 + v * P3

P点在三角形内,所以(u, v)必须满足条件u ≥ 0, v ≥ 0, u + v ≤ 1。u、v体现了每个顶点对特定区域的权重贡献,(1 - u - v)则是第三个权重,只要计算出u和v,就可以计算出每个顶点对P点的贡献。现在已知P1, P2, P3和P的坐标值,求解u和v,只需要解二元一次方程即可:

P.x = (1 - u - v) * P1.x + u * P2.x + v * P3.x

P.y = (1 - u - v) * P1.y + u * P2.y + v * P3.y

有了u、v值,对P1, P2, P3的颜色值进行加权平均,即可得到P点颜色值。

qsc52(三角形线性插值)

题目链接:http://qscoj.cn/problem/52/

 

题意:中文题诶~

 

思路:水题,只要知道三角形插值和判断点在三角形内就OK了

关于三角形插值:http://www.cnblogs.com/wangchengfeng/p/3453194.html

先判断插入点是否在三角形内,在的话解二元一次方程组:

P.x = (1 - u - v) * P1.x + u * P2.x + v * P3.x

P.y = (1 - u - v) * P1.y + u * P2.y + v * P3.y

再将u, v代入:P = (1 - u - v) * P1 + u * P2 + v * P3

P就是答案了

 

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <math.h>
 4 using namespace std;
 5 
 6 const double res=1e-6;
 7 struct node{
 8     double x, y;
 9 };
10 
11 double get_area(node a, node b, node c){ //***用行列式计算三角形面积
12     double area=fabs(a.x*b.y+a.y*c.x+b.x*c.y-a.x*c.y-a.y*b.x-b.y*c.x);
13     return area;
14 }
15 
16 bool is_ok(node p1, node p2, node p3, node p){//***判断点p是否在三角形内
17     double areap=get_area(p1, p2, p);
18     areap+=get_area(p1, p3, p);
19     areap+=get_area(p2, p3, p);
20     double area=get_area(p1, p2, p3);
21     if(fabs(areap-area)<res){
22         return true;
23     }else{
24         return false;
25     }
26 }
27 
28 int main(void){
29     double x1, y1, w1, x2, y2, w2, x3, y3, w3, x, y;
30     while(cin >> x1 >> y1 >> w1 >> x2 >> y2 >> w2 >> x3 >> y3 >> w3 >> x >> y){
31         node p1, p2, p3, p;
32         p1.x=x1, p1.y=y1;
33         p2.x=x2, p2.y=y2;
34         p3.x=x3, p3.y=y3;
35         p.x=x, p.y=y;
36         if(!is_ok(p1, p2, p3, p)){
37             cout << -1 << endl;
38             continue;
39         }
40         double a1=x2-x1, b1=x3-x1, c1=x-x1;
41         double a2=y2-y1, b2=y3-y1, c2=y-y1;
42         double u=(b1*c2-b2*c1)/(a2*b1-a1*b2);
43         double v=(c1-a1*u)/b1;
44         double ans=(1-u-v)*w1+u*w2+v*w3;
45         printf("%.2lf\\n", ans);
46     }
47 }
View Code

 

以上是关于三角形内部线性插值方法的主要内容,如果未能解决你的问题,请参考以下文章

qsc52(三角形线性插值)

透视校正插值

透视校正插值(Perspective-Correct Interpolation)

如何在 Gouraud-shaderscript 中插入颜色值?

线性代数行列式计算方法之三角法

矩形网格上的 Python 4D 线性插值