原本想枚举p,直接用原本边长*p算出对应边长然后用面积公式,发现怎么都不对))
#include<bits/stdc++.h>
using namespace std;
double area(double x,double y,double z)//计算三角形的面积
{
double p=(x+y+z)/2;
return sqrt(p*(p-x)*(p-y)*(p-z));
}
int main()
{
double l,r,x1,y1,x2,y2,x3,y3;
double minn=1e9;
cin>>l>>r>>x1>>y1>>x2>>y2>>x3>>y3;
double ab=sqrt(pow((x1-x2),2)+pow((y1-y2),2)),
ac=sqrt( pow((x2-x3),2) + pow((y2-y3),2) ),
bc=sqrt(pow((x1-x3),2)+pow((y1-y3),2));
//cout<<area(ab,ac,bc)<<endl;
//cout<<area(ab*0.5,ac*0.5,bc*0.5)<<endl;
double point=0;//记录对应的p值在哪里出现的
for(double i=l;i<=r;i+=0.0001)//i是p
{
if(area(ab*i,ac*i,bc*i)<=minn)
{
minn=area(ab*i,ac*i,bc*i);
//point=i;
}
}
// printf("此程序出现的最小p值%.4f\n",point);
printf("%.12f",minn);
return 0;
}
但是突发奇想,先算点坐标再用距离公式算出长度再算面积就过了,不知道是怎么回事))
#include<bits/stdc++.h>
using namespace std;
double area(double x,double y,double z)//计算三角形的面积
{
double p=(x+y+z)/2;
return sqrt(p*(p-x)*(p-y)*(p-z));
}//!
int main()
{
double l,r,x1,y1,x2,y2,x3,y3;
double minn=1e9;
cin>>l>>r>>x1>>y1>>x2>>y2>>x3>>y3;
double ab=sqrt(pow((x1-x2),2)+pow((y1-y2),2)),
ac=sqrt( pow((x2-x3),2) + pow((y2-y3),2) ),
bc=sqrt(pow((x1-x3),2)+pow((y1-y3),2)); //!
//cout<<area(ab,ac,bc)<<endl;
//cout<<area(ab*0.5,ac*0.5,bc*0.5)<<endl;
double point=0;//记录对应的p值在哪里出现的
for(double i=l;i<=r;i+=0.0001)//i是p
{
double x4=(x2-x1)*i+x1,y4=(y2-y1)*i+y1,
x5=(x1-x3)*i+x3,y5=(y1-y3)*i+y3,
x6=(x3-x2)*i+x2,y6=(y3-y2)*i+y2;
double q1=sqrt(pow((x4-x5),2)+pow((y4-y5),2)),
q2=sqrt(pow((x5-x6),2)+pow((y5-y6),2)),
q3=sqrt(pow((x4-x6),2)+pow((y4-y6),2));
double s=area(q1,q2,q3);
if(s<=minn) minn=s;
/*if(area(ab*i,ac*i,bc*i)<=minn)
{
//minn=area(min(ab*(1-i),ab*i),min(ac*(1-i),ab*i),min(bc*(1-i),ab*i));
minn=area(ab*(1-i),bc*(1-i),ac*(1-i));
point=i;
}*/
//minn=min(minn,area(ab*i,ac*i,bc*i));
}
//printf("此程序出现的最小p值:%.1f\n",point);
printf("%.12f",minn);
return 0;
}