hdu1071(抛物线弓形面积阿基米德算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1071

题意:给出抛物线的顶点和它与一直线的两交点,求他们围成的面积;

 

思路:

可以直接求出他们的方程式,再积分,这个方法就不说了;

 

偶然看见另一个解法,觉得蛮有意思的,就记一下好了。。

抛物线与直线为成的面积等于直线的平行线与抛物线的切点和该直线与抛物线两交点组成的三角形面积 s*4/3;(抛物线弓形面积公式等于:以割线为底,以平行于底的切线的切点为顶点的内接三角形的4/3,即:抛物线弓形面积=S+1/4*S+1/16*S+1/64*S+……=4/3*S; 本渣渣百度的,抛物线弓形面积阿基米德算法,自己不会证明);

设 y=a*x*x+b*x+c;代入已知的三个点坐标,用行列式解三元三次方程组解出a, b, c;

直线的斜率可以通过p2, p3两点求出, k=(y3-y2)/(x3-x2);

对y=a*x*x+b*x+c求导得:y*=2*a*x+b=k;

可以解出x,反代入抛物线方程式中求出y;

现在我们已经求出了切点p(x, y),接下来还需要求一下三角形面积pp2p3面积s;

已知三点求三角形面积我们可以通过构造梯形再减去两个直角三角形面积得到;

推导初的面积公式为:s=(x*y2+y*x3+x2*y3-x*y3-y*x2-y2*x3)/2;

 

代码:

#include <iostream>
#include <stdio.h>
#include <math.h>
#define PI 3.1415926
#define INF 10000
using namespace std;

double matrix(int n, double a[3][3]){  //***3*3行列式计算
    double sum1=a[0][0]*a[1][1]*a[2][2]+a[0][1]*a[1][2]*a[2][0]+a[1][0]*a[2][1]*a[0][2];
    double sum2=a[2][0]*a[1][1]*a[0][2]+a[0][0]*a[2][1]*a[1][2]+a[2][2]*a[0][1]*a[1][0];
    return sum1-sum2;
}

int main(void){
    int t;
    scanf("%d", &t);
    while(t--){
        double x1, y1, x2, y2, x3, y3;
        scanf("%lf%lf%lf%lf%lf%lf", &x1, &y1, &x2, &y2, &x3, &y3);
        double matrix1[3][3]={y1, x1, 1, y2, x2, 1, y3, x3, 1};
        double matrix2[3][3]={x1*x1, y1, 1, x2*x2, y2, 1, x3*x3, y3, 1};
        double matrix3[3][3]={x1*x1, x1, y1, x2*x2, x2, y2, x3*x3, x3, y3};
        double matrix4[3][3]={x1*x1, x1, 1, x2*x2, x2, 1, x3*x3, x3, 1};
        double a=matrix(3, matrix1);
        double b=matrix(3, matrix2);
        double c=matrix(3, matrix3);
        double d=matrix(3, matrix4);
        a/=d;
        b/=d;
        c/=d;
        double k=(y3-y2)/(x3-x2);
        double x=(k-b)/(2*a);
        double y=a*x*x+b*x+c;
        double cnt=(x*y2+y*x3+x2*y3-x*y3-y*x2-y2*x3)/2;
        printf("%.2lf\n", cnt*4/3);
    }
    return 0;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值