海伦秦九韶

#include <cstdio>
#include <cmath>

using namespace std;

const double eps = 1e-8;

struct Point {
    double x, y;
};

struct Vector {
    double x, y;
};

double Distance(Point A, Point B) {
    double dx = A.x - B.x;
    double dy = A.y - B.y;
    return sqrt(dx * dx + dy * dy);
}

double Scalar_Product(Vector a, Vector b) {
    return a.x * b.x + a.y * b.y;
}

double Cross_Product(Vector a, Vector b) {
    return a.x * b.y - a.y * b.x;
}

inline bool Collinear(Point A, Point O, Point B) {
    Vector a = {O.x - A.x, O.y - A.y}, b = {B.x - O.x, B.y - O.y};
    return fabs(Cross_Product(a, b)) < eps && Scalar_Product(a, b) > -eps;
}

inline double Triangle_Area(Point A, Point B, Point C) {
    double a = Distance(B, C), b = Distance(A, C), c = Distance(A, B);
    double p = (a + b + c) / 2;
    return sqrt(p * (p - a) * (p - b) * (p - c));
}

Point Middle_Point(Point A, Point B) {
    return {(A.x + B.x) / 2, (A.y + B.y) / 2};
}

Point Search(Point l, Point r, Point P, Point A, Point B, double Extend_Right) {
    if (fabs(l.x - r.x) < eps && fabs(l.y - r.y) < eps)return Middle_Point(l, r);
    Point mid = Middle_Point(l, r);
    if (Triangle_Area(A, P, mid) < Triangle_Area(B, P, mid) + Extend_Right)
        return Search(mid, r, P, A, B, Extend_Right);
    else if (Triangle_Area(A, P, mid) > Triangle_Area(B, P, mid) + Extend_Right)
        return Search(l, mid, P, A, B, Extend_Right);
    else return mid;
}

inline Point Solve(Point P, Point A, Point B) {
    return Search(A, B, P, A, B, 0);
}

inline Point Solve(Point P, Point A, Point O, Point B) {
    if (Triangle_Area(P, A, O) > Triangle_Area(P, B, O))
        return Search(A, O, P, A, O, Triangle_Area(P, B, O));
    else if (Triangle_Area(P, A, O) < Triangle_Area(P, B, O))
        return Search(B, O, P, B, O, Triangle_Area(P, A, O));
    else return O;
}

signed main() {
//    freopen("in", "r", stdin), freopen("out", "w", stdout);
    int Ts;
    scanf("%d", &Ts);
    while (Ts--) {
        Point A{}, B{}, C{}, P{};
        scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &A.x, &A.y, &B.x, &B.y, &C.x, &C.y, &P.x, &P.y);
        if (P.x == A.x && P.y == A.y) {
            Point ans = Solve(P, B, C);
            printf("%lf %lf\n", ans.x, ans.y);
        } else if (P.x == B.x && P.y == B.y) {
            Point ans = Solve(P, A, C);
            printf("%lf %lf\n", ans.x, ans.y);
        } else if (P.x == C.x && P.x == C.y) {
            Point ans = Solve(P, A, B);
            printf("%lf %lf\n", ans.x, ans.y);
        } else if (Collinear(A, P, B)) {
            Point ans = Solve(P, A, C, B);
            printf("%lf %lf\n", ans.x, ans.y);
        } else if (Collinear(A, P, C)) {
            Point ans = Solve(P, A, B, C);
            printf("%lf %lf\n", ans.x, ans.y);
        } else if (Collinear(B, P, C)) {
            Point ans = Solve(P, B, A, C);
            printf("%lf %lf\n", ans.x, ans.y);
        } else printf("-1\n");
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值