注解
1、根据顶点坐标,以及另一个点的坐标,可求出抛物线方程。
y=a(x-b)^2+c,根据顶点坐标(x1,y1),可得到b=x1,c=y1,
因此y=a(x-x1)^2+y1,再代入(x2,y2),得到a=(y2-y1)/(x2-x1)/(x2-x1)。
2、根据直线上两个点的坐标,可求出直线方程(斜率和截距)。
k=(y3-y2)/(x3-x2),
bd=y2-kx2。
3、根据求出的直线方程和抛物线方程,以及交点坐标,用积分求出阴影面积。
两直线相减,然后求积分:
y=a(x-b)^2+c-(kx+d)
=ax^2-(2ab+k)x+(ab*b+c-d)
对y在(x2,x3)上求积分,就是相交面积。
代码
#include <iostream>
using namespace std;
double a, b, c, k, d;
//y=a(x-b)^2+c
//y=kx+d
double integral(double x){
return a*x*x*x/3.0 - (2*a*b+k)*x*x/2.0 + (a*b*b+c-d)*x;
}
int main(){
int T;
scanf("%d", &T);
for(int i=0; i<T; i++){
double x1, y1, x2, y2, x3, y3;
scanf("%lf%lf", &x1, &y1);
scanf("%lf%lf", &x2, &y2);
scanf("%lf%lf", &x3, &y3);
b = x1;
c = y1;
a = (y2-y1)/((x2-x1)*(x2-x1));
k = (y3-y2)/(x3-x2);
d = y2-k*x2;
double ans = integral(x3) - integral(x2);
printf("%.2lf\n", ans);
}
return 0;
}