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

 

posted @ 2017-03-22 21:15  geloutingyu  阅读(592)  评论(0编辑  收藏  举报