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就是答案了
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
我就是我,颜色不一样的烟火 --- geloutingyu