POJ 1673 三角形垂心
題意:給出步驟連接終點與三角形的頂點,求交點o。
如圖, 以△ABC的邊AB、AC、BC向外作正方形ABHI、ACED以及BCFG。連接DI、HG、EF並取它們的中點J、L、K。連接JA、LB、KC並延長。證明:JA、LB、KC的延長線交於一點M,且M點為△ABC的垂心。
證明:如圖所示,
延長AJ與N點,使得NJ=AJ,連接IN。延長JA、LB、KC分別交BC、AC、AB於O、P、Q點。
易證△DJA≌△IJN
則∠NID=∠IDA
∴∠NIA=∠NID+∠DIA=∠IDA+∠DIA=180°-∠IAD=∠BAC
∵IA=AB,DA=AC
∴△NIA≌△CAB(SAS)
∴∠NAI=∠CBA
∵∠NAI+∠BAO=90°
∴∠CBA+∠BAO=90°
∴∠AOB=90°
即AO⊥BC,即JA⊥BC
同理可得LB⊥AC,KC⊥AB
∴JA、LB、KC的延長線交於一點M,這一點M為△ABC的垂心
證畢!
知道了垂心就求垂心。看到了DIS裏說要+1e-8不加就錯了。
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; struct point { double x,y; }; point getcx(point a,point b,point c) { point ans; double a1=atan2(b.y-a.y,b.x-a.x)+acos(-1.0)/2,a2=atan2(c.y-b.y,c.x-b.x)+acos(-1.0)/2; double r=(sin(a2)*(c.x-a.x)+cos(a2)*(a.y-c.y))/(sin(a1)*cos(a2)-sin(a2)*cos(a1)); ans.x=c.x+r*cos(a1),ans.y=c.y+r*sin(a1); return ans; } int main() { point a,b,c,ans;int t; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y); ans=getcx(a,b,c); printf("%.4f %.4f\n",ans.x+1e-8,ans.y+1e-8); } return 0; }
最後更新:2017-04-03 16:48:37