题意: 给出两个定点A(x1,y1),B(x2,y2),试求第三点D(x,0)使得构成的三角形面积为2。
知识点: 数学,几何,构造
思路: 初中数学,没啥好说的,所以直接在题目的基础上把公式全推了给你们看吧。
设经过A,B两点的直线方程为L:y=kx+b
然后有了两个思路,一个是按正常思路,以A点到B点的距离为底,那么他的第三个点就要选在L的平行线,这个平行线和L的距离是,可以两个答案任选其一。
另外一个思路则是不用点到直线的距离公式和点到点的距离公式,而是通过凑一个好求面积的大三角形减去一个好求面积的小三角形得到我们的答案。如下图所示:
假设C点是L和x轴的交点(先不说L和x轴平行的情况),D是我们要求的第三点,我们就可以通过的方法实现,因为这种情况下
的面积比较好求,底直接是|CD|,高直接是y1和y2。
而我们可以通过这种方式反推出d点在哪,公式推理过程如下:
设c点坐标为(c,0),d点坐标为(d,0),其中c点坐标可表示为
则
因为约分过程过于繁琐,有兴趣的自己验算下,这里放出最终结果
也就是在 的情况下直接按照这个公式写就可以了。
在时,可以直接计算
,因为AB在同一高度可以直接坐标相减在乘上他们的纵坐标除2得到的结果是否等于2,如果不等于2则无解,等于2就输出任意值,在几何上就相当于D的范围是y=0那条直线,也就x轴上任选。
tips:如果还是错误记得设置精度。
参考代码
#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define endl '\n'
using namespace std;
signed main()
{
cin.tie(0),cout.tie(0),ios::sync_with_stdio(0);
cout << fixed << setprecision(15);
int x1,y1,x2,y2;
cin >> x1 >> y1 >> x2 >> y2;
if(y1!=y2)
cout << (((double)4.0+y1*x2-x1*y2)/(double)(y1-y2));
else if(abs(y1*(x1-x2))==4)
cout << 1;
else
cout << "no answer";
return 0;
}

京公网安备 11010502036488号