三角形内部线性插值方法
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 }
以上是关于三角形内部线性插值方法的主要内容,如果未能解决你的问题,请参考以下文章
透视校正插值(Perspective-Correct Interpolation)