三角形垂心

POJ1673

垂心:三角形的三条或其延长线相交于一点,这点称为三角形的垂心。




const  double  eps = 1e-8 ;

struct point{
       double x , y ;
       point(){}
       point(double x , double y){
            this->x = x ;
            this->y = y ;
       }
};

/*三角形(p0 , p1 , p2)垂心*/
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) ;
}

point a[3] ;

int  main(){
     int i  , t ;
     cin>>t ;
     while(t--){
          for(i = 0 ; i < 3 ; i++) scanf("%lf%lf" ,&a[i].x , &a[i].y) ;
          point center = Orthocenter(a[0] , a[1] , a[2]) ;
          printf("%.4f %.4f\n" , center.x + eps  , center.y + eps ) ;
     }
     return 0 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽我所能回答你的问题。 对于这个任务,我们可以定义一个基类 Triangle,并在其内部定义虚函数来完成面积计算、三角形类型判断、重心、垂心、外心、内心计算,以及点和三角形的关系判断。此外,我们还可以定义一个纯虚函数来计算直线和三角形的交点。 具体实现如下: ```c++ class Triangle { public: virtual double getArea() = 0; virtual string getType() = 0; virtual Point getCentroid() = 0; virtual Point getOrthocenter() = 0; virtual Point getCircumcenter() = 0; virtual Point getIncenter() = 0; virtual string getPointRelation(Point p) = 0; virtual vector<Point> getIntersection(Line l) = 0; protected: Point a, b, c; }; class AcuteTriangle : public Triangle { public: AcuteTriangle(Point _a, Point _b, Point _c) { a = _a, b = _b, c = _c; } double getArea() { // 计算面积 } string getType() { // 判断三角形类型 } Point getCentroid() { // 计算重心 } Point getOrthocenter() { // 计算垂心 } Point getCircumcenter() { // 计算外心 } Point getIncenter() { // 计算内心 } string getPointRelation(Point p) { // 判断点和三角形的关系 } vector<Point> getIntersection(Line l) { // 计算直线和三角形的交点 } }; class RightTriangle : public Triangle { public: RightTriangle(Point _a, Point _b, Point _c) { a = _a, b = _b, c = _c; } double getArea() { // 计算面积 } string getType() { // 判断三角形类型 } Point getCentroid() { // 计算重心 } Point getOrthocenter() { // 计算垂心 } Point getCircumcenter() { // 计算外心 } Point getIncenter() { // 计算内心 } string getPointRelation(Point p) { // 判断点和三角形的关系 } vector<Point> getIntersection(Line l) { // 计算直线和三角形的交点 } }; class ObtuseTriangle : public Triangle { public: ObtuseTriangle(Point _a, Point _b, Point _c) { a = _a, b = _b, c = _c; } double getArea() { // 计算面积 } string getType() { // 判断三角形类型 } Point getCentroid() { // 计算重心 } Point getOrthocenter() { // 计算垂心 } Point getCircumcenter() { // 计算外心 } Point getIncenter() { // 计算内心 } string getPointRelation(Point p) { // 判断点和三角形的关系 } vector<Point> getIntersection(Line l) { // 计算直线和三角形的交点 } }; ``` 其中,我们定义了三个派生类 AcuteTriangle、RightTriangle 和 ObtuseTriangle,分别表示锐角三角形、直角三角形和钝角三角形。这些派生类都继承了 Triangle 的虚函数,并且根据其自身特点进行了实现。 在实际使用时,我们可以根据给定的三个点构造出一个 Triangle 对象,并调用其相应的虚函数来完成任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值