三角形外心与垂心

本文提供了解决特定几何问题的算法实现,包括通过三点确定圆的外心并输出外接圆方程,以及通过计算三角形的垂心来定位特殊点。文章包含完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明出处,谢谢http://blog.youkuaiyun.com/acm_cxlove/article/details/7854526       by---cxlove

POJ 1329 Circle Through Three Points

http://poj.org/problem?id=1329

题目:就是求外心,但是要输出外接圆方程,输出真DT

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<ctime>
#include<cassert>
#define LL long long
#define eps 1e-8
#define inf 999999.0
#define zero(a) abs(a)<eps
#define N 20
#define MOD 100000007
#define pi acos(-1.0)
using namespace std;
struct Point{
    double x,y;
    Point(){}
    Point(double tx,double ty){x=tx;y=ty;}
}a,b,c;
Point Circumcenter(Point a,Point b,Point c){
    double a1 = b.x - a.x, b1 = b.y - a.y, c1 = (a1*a1 + b1*b1)/2;
    double a2 = c.x - a.x, b2 = c.y - a.y, c2 = (a2*a2 + b2*b2)/2;
    double d = a1 * b2 - a2 * b1;
    return Point(a.x + (c1*b2 - c2*b1)/d,a.y + (a1*c2 - a2*c1)/d);
}
double dist(Point p1,Point p2){
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
int main(){
    while(scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y)!=EOF){
        Point central=Circumcenter(a,b,c);
        double r=dist(central,a);
        char ch1,ch2,ch3;
        if(central.x<eps) ch1='+';else ch1='-';
        if(central.y<eps) ch2='+';else ch2='-';
        double d=central.x*central.x+central.y*central.y-r*r;
        if(d<eps ) ch3='-';else ch3='+';
        printf("(x %c %.3f)^2 + (y %c %.3f)^2 = %.3f^2\n",ch1,fabs(central.x),ch2,fabs(central.y),r);
        printf("x^2 + y^2 %c %.3fx %c %.3fy %c %.3f = 0\n\n",ch1,2*fabs(central.x),ch2,2*fabs(central.y),ch3,fabs(d));
    }
    return 0;
}

POJ 1673 EXOCENTER OF A TRIANGLE

http://poj.org/problem?id=1673

题目:很纠结的一个图,求出那个点,转换成三角形的垂心。

将三角形BEJ沿B点,逆时针旋转90度,这样子BE与BA重合,而且BJ与BC共线

而M是AJ的中点,而且BC==BJ,那么BM是三角形AJC的中位线,即BM平行于AC

而BM是经过旋转90度的,则原先BM垂直AC,同理可得其它边。

则点O为三角形ABC的垂心

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<ctime>
#define LL long long
#define eps 1e-8
#define inf 999999.0
#define zero(a) abs(a)<eps
#define N 20
#define MOD 100000007
#define pi acos(-1.0)
using namespace std;
struct Point{
    double x,y;
    Point(){}
    Point(double tx,double ty){x=tx;y=ty;}
}a,b,c;
Point Orthocenter(Point p0,Point p1,Point p2){
    double a1,b1,a2,b2,c1,c2;
    a1 = p2.x-p1.x; b1=p2.y-p1.y;c1 = 0;
    a2 = p2.x-p0.x; b2=p2.y-p0.y;c2 = (p1.x-p0.x)*a2+(p1.y-p0.y)*b2;
    double d = a1 * b2 - a2 * b1;
    return Point(p0.x+(c1*b2-c2*b1)/d,p0.y+(a1*c2-a2*c1)/d);
}
int main(){
    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);
        Point central=Orthocenter(a,b,c);
        printf("%.4f %.4f\n",central.x,central.y);
    }
    return 0;
}




关于三角形的重心和垂心及其相关的几何性质如下所述: --- **重心** 三角形的重心是指三条中线交点的位置。每条中线都是连接一个顶点其对面边中心的线段。 - 重心将每一中线分为两部分,其中靠近顶点的部分是远离顶点部分长度的两倍。 - 对于任意三角形,其重心总是位于内部。 - 如果以直角坐标系中的三点 $(x_1,y_1)$, $(x_2,y_2)$ 和 $(x_3,y_3)$ 构成一个三角形,则该三角形的重心 G 可由下面公式计算得出: $$G = \left(\frac{x_1 + x_2 + x_3}{3},\frac{y_1 + y_2 + y_3}{3}\right)$$ **垂心** 三角形垂心指的是三个高所在直线的交点。高的定义是从一个顶点垂直画到底边或者底边延长线上的一条线段。 - 锐角三角形垂心总是在三角形内部;钝角三角形垂心在外部;直角三角形垂心恰好就是直角所在的那个顶点。 - 若设 H 是 ABC 的垂心,则有 AH⊥BC, BH⊥CA, CH⊥AB 成立。 **定理关联** 欧拉线是一个重要的定理,在任何非等边三角形中,外心 O、重心 G 和垂心 H 总共线,并且 HG=2GO。这条线被称为欧拉线。 此外,九点圆也是一个重要概念,它通过了六个脚点(即三边上的高足)、三个中点以及垂心到各顶点连线的中点,这个圆的圆心正好在线段 GH 上,距离 H 点的距离为 OH 距离的一半。 --- 为了更深入理解这些概念,可以参考以下相关问题:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值