首页 > 其他分享 >三点不共线

三点不共线

时间:2024-03-08 23:11:47浏览次数:33  
标签:三点 le angle overrightarrow MC 共线 y1 alpha

三点不共线

题目描述

平面上有两个不同的点 $A$ 和 $B$,你需要找到另一个点 $C$ ,使得这三个点构成的 $\angle ACB$ 恰好为 $\alpha$。

需要注意的是,在下图中,$\angle 1$ 和 $\angle 2$ 都可以被认为是 $\angle ACB$ ,你只需让其中一个角为 $\alpha$ 即可。

输入描述:

每个测试文件均包含多个测试点。第一行输入一个整数 $T$ ($1\le T\le 2 \cdot 10^5$) 代表测试数据组数,每组测试数据描述如下:

第一行输入五个整数 $x_1$, $y_1$, $x_2$, $y_2$ 和 $\alpha$ ($-1000 \le x_1$, $y_1$, $x_2$, $y_2 \le 1000$; $1 \le \alpha \le 180^{\circ}$) 表示给定两点的坐标与需要构造的角度,保证两点不重合。

输出描述:

对于每组数据,你都需要在一行上输出两个实数 $x$ 和 $y$ ($-10^9 \le x$, $y \le10^9$) 表示 $C$ 点的横、纵坐标,数字彼此间通过单个空格间隔。

当你的答案所构成的角 $\angle ACB$ 与 $\alpha$ 的误差不超过 $10^{-6}$ 时,均会被视为正确。换句话说,当你的答案满足 $\frac{|\angle ACB - \alpha|}{\max(1,\alpha)} \le 10^{-6}$ 时,均会被视为正确。

示例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$,并假设所求的 $C$ 在 $AB$ 的中线 $MC$ 上,同时有 $\angle MCB = \alpha / 2$。由三角公式知道 $\tan(\alpha/2) = \frac{d/2}{l}$,其中 $d$ 是直线 $AB$ 的长度,因此直线 $MC$ 长度就是 $l = \frac{d/2}{\tan(\alpha/2)}$。

  向量 $\overrightarrow{BA} = (x_B - x_A, y_B - y_A)$,则向量 $\overrightarrow{MC} = (y_A - y_B, x_B - x_A)$,因为 $\overrightarrow{BA}$ 与 $\overrightarrow{MC}$ 互相垂直,因此只需满足 $\overrightarrow{BA} \cdot \overrightarrow{MC} = \mathbf{0}$ 即可。$\overrightarrow{MC}$ 的单位向量就是 $\overrightarrow{e} = \frac{\overrightarrow{MC}}{|\overrightarrow{MC}|}$。

  所以最后 $(x_C, y_C)=(x_M, y_M)+l \cdot \overrightarrow{e}$。

  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

标签:三点,le,angle,overrightarrow,MC,共线,y1,alpha
From: https://www.cnblogs.com/onlyblues/p/18062056

相关文章

  • 三点共线习题
    前言判断依据:三点共线的应用类型:①判断是否三点共线;②已知三点共线,求参数的值;典例剖析【2024高一专项】已知\(\overrightarrow{AB}=3(\vec{e_1}+\vec{e_2})\),\(\overrightarrow{CB}=\vec{e_2}-\vec{e_1}\),\(\overrightarrow{CD}=2\vec{e_1}+\vec{e_2}\),则下列结论中成立的是......
  • 怎样建设供应商文件分发平台?这三点陷阱需注意
    供应商在市场经济中是不可或缺的角色,供应商作为重要的环节,串联起从商品生产到消费者的链路,而供应商特殊的点在于供应商并不能单独存在,相反它与上下游关系非常紧密。上游供应商是指向供应商提供原材料、零部件或其他支持的企业或组织。上游供应商通常负责生产或制造商品所需的原......
  • 铺先生:如何提高店铺转让的效率?这三点要做好
    如何提高店铺转让的效率?很多人在进行店铺转让的时候,他脑子里想着的可能是如何实现快速转店!这种想法很好,但是如何才能实现快速转店就是成了一个问题!下面小编就来跟大家说一下提高转店效率的办法吧。1. 降低转让费找店老板对转让费的重视程度是很高的!而如果你想提高转店效率的话,那么......
  • 铺先生:快速转店要清楚什么?这三点必须知道
    快速转店要清楚什么?实现快速转店几乎是每一个有转店需求的人都想做到的吧,但是能够实现的人却寥寥无几,正是如此想实现快速转店你更应该要清楚以下几点!下面小编就来跟大家说一下吧。1. 清楚自身店铺优势如果你想实现快速转店,那么你自身店铺的优势你必须清楚!店铺转让其实就是一场交易......
  • 铺先生:转店人需要掌握什么技巧?这三点比较有效
    转店人需要掌握什么技巧?作为一个经营者,遇到了无法解决的事情的时候,都会选择将店铺转让出去以此减少损失。但是如今转店失败的人不计其数,大部分原因都是在技巧上出了问题。下面小编就来跟大家说三个技巧吧。1. 端正态度你作为转店人,其实算得上是有求于人了,而在转店的过程中,对接手方......
  • 深度!把握这三点,即可挑选出最适合能源行业的数据摆渡解决方案
    在能源行业中,网络隔离通常采用物理隔离方式,即将能源行业网络与外部网络进行物理隔离,避免外部网络对能源行业网络的攻击和入侵。同时,网络隔离也可以采用逻辑隔离方式,即在能源行业网络和外部网络之间设置防火墙、入侵检测系统等设备,对访问进行控制和过滤,确保只有授权人员可以访问能......
  • 任意三点画圆弧
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.IO;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.Numerics;u......
  • 下面,我讲三点意见
    领导讲话都喜欢三点意见一个意见三个办法如何提意见对三述对象的意见和建议领导会议总结提三点要求“讲三点”有哪些好处? 首先,迅速组织文字。讲三点很容易就把本来毫无头绪的一段语言,整理成逻辑非常清晰的语言。其次,让你的文字逻辑清晰有力量。可以让别人感觉你是一个......
  • 【经验贴】做好这三点,有效提升项目的成功率
    近期,大家都在做年度工作总结的准备了,在互相交流的时候,提到了一个值得思考的话题——“如何能提高项目的成功率?”。对于项目经理来说,都希望能找到一些通用的经验直接复制粘贴在自己的项目上,促进项目的成功,大家都纷纷发表了自己的见解。 虽然每个项目都具有一定的独特性,但大家都......
  • 向量三点共线定理
    如果ABQ三点共线,则OQ=a*OA+b*OB,且a+b=1,其中O表示不在直线AB上的任意点,当然如果原点不在直线AB上,用原点也是成立的。 参考向量三点共线定理(baidu.com)向量的三点共线定理及应用_百度知道(baidu.com) ......