三点不共线

三点不共线

题目描述

平面上有两个不同的点 AB,你需要找到另一个点 C ,使得这三个点构成的 ACB 恰好为 α

需要注意的是,在下图中,12 都可以被认为是 ACB ,你只需让其中一个角为 α 即可。

输入描述:

每个测试文件均包含多个测试点。第一行输入一个整数 T (1T2105) 代表测试数据组数,每组测试数据描述如下:

第一行输入五个整数 x1, y1, x2, y2α (1000x1, y1, x2, y21000; 1α180) 表示给定两点的坐标与需要构造的角度,保证两点不重合。

输出描述:

对于每组数据,你都需要在一行上输出两个实数 xy (109x, y109) 表示 C 点的横、纵坐标,数字彼此间通过单个空格间隔。

当你的答案所构成的角 ACBα 的误差不超过 106 时,均会被视为正确。换句话说,当你的答案满足 |ACBα|max(1,α)106 时,均会被视为正确。

示例1

输入

4
2 1 -1 -1 90
4 -1 1 3 100
1 1 1 2 60
9 2 5 4 36

输出

-1 1
4.178199262355 2.258649446766
1.866025403784 1.5
3.922316462825 -3.155367074351

说明

第一、二个测试点如下图所示。

备注:

如果有多个可能的答案,你只需要输出其中一种。

 

解题思路

  给出一种与官方题解不同的做法。

  做直线 AB 的中点 M,并假设所求的 CAB 的中线 MC 上,同时有 MCB=α/2。由三角公式知道 tan(α/2)=d/2l,其中 d 是直线 AB 的长度,因此直线 MC 长度就是 l=d/2tan(α/2)

  向量 BA=(xBxA,yByA),则向量 MC=(yAyB,xBxA),因为 BAMC 互相垂直,因此只需满足 BAMC=0 即可。MC 的单位向量就是 e=MC|MC|

  所以最后 (xC,yC)=(xM,yM)+le

  AC 代码如下,时间复杂度为 O(1)

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

void solve() {
    int x1, y1, x2, y2, a;
    scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &a);
    double d = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
    double l = d / 2 / tan(a / 2.0 / 180 * acos(-1));
    double dx = (y1 - y2) / d, dy = (x2 - x1) / d;    // MC的单位向量为(dx, dy)
    double x3 = (x1 + x2) / 2.0, y3 = (y1 + y2) / 2.0;
    x3 += dx * l, y3 += dy * l;
    printf("%.8f %.8f\n", x3, y3);
}

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        solve();
    }
    
    return 0;
}

 

参考资料

   牛客小白月赛88 出题人题解:https://ac.nowcoder.com/discuss/1260072

posted @   onlyblues  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
历史上的今天:
2023-03-08 构造有向无环图
2023-03-08 作物杂交
2022-03-08 组合数递推公式的推导
Web Analytics
点击右上角即可分享
微信分享提示