[Codeforces 23D] Tetragon

本文介绍了一种通过给定三条等长边的中点来判定是否存在一个严格凸四边形的方法,并提供了详细的算法步骤及代码实现。

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

Brief Intro:

给3条相同长度的边的中点,问是否存在一个严格凸四边形

 

Algorithm:

明显只要求出一个点就能利用对称性算出其他点的坐标

设中点K,L,M分别在边AB,BC,CD上,易知B、C分别在KL、LM的垂直平分线上

 

但仍需一个点才能确定B点的位置

于是我们想办法将现有的信息整合:做M关于L的对称点M’,从而发现M’B=KB=LB

接下来手算出KL、LM’的垂直平分线的直线方程

((b1c2-b2c1)/(a1b2-a2b1),(a2c1-a1c2)/(a1b2-a2b1))求出交点即可

 

注意:求完4个点后,仍要判断正确性(是否为凸四边形)

           判断顺时针的4个三角形方向是否相同(叉积的正负性是否相同)

 

Code:

#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second

const double eps=1e-8;
typedef pair<double,double> P;
int T;
P a,b,c;

double Cross(P a,P b,P c)
{
    return (a.X*b.Y+b.X*c.Y+c.X*a.Y)-(b.X*a.Y+c.X*b.Y+a.X*c.Y);
}

inline int Read()
{
    char ch;int num,f=0;
    while(!isdigit(ch=getchar())) f|=(ch=='-');
    num=ch-'0';
    while(isdigit(ch=getchar())) num=num*10+ch-'0';
    return f?-num:num;
}

P read()
{
    P t;t.X=Read();t.Y=Read();
    return t;
}

bool check(P x,P y,P z)
{
    double A0=2*(x.X-y.X),A1=2*(y.X-z.X);
    double B0=2*(x.Y-y.Y),B1=2*(y.Y-z.Y);
    double C0=y.X*y.X-x.X*x.X+y.Y*y.Y-x.Y*x.Y;
    double C1=-3*(y.X*y.X+y.Y*y.Y)-(z.X*z.X+z.Y*z.Y)+4*(y.X*z.X+y.Y*z.Y);
    
    P A,B,C,D;
    A.X=(B0*C1-B1*C0)/(A0*B1-A1*B0);A.Y=(A1*C0-A0*C1)/(A0*B1-A1*B0);
    B.X=2*y.X-A.X;B.Y=2*y.Y-A.Y;
    C.X=2*x.X-A.X;C.Y=2*x.Y-A.Y;
    D.X=2*z.X-B.X;D.Y=2*z.Y-B.Y;
    
    double P1=Cross(C,A,B),P2=Cross(A,B,D),P3=Cross(B,D,C),P4=Cross(D,C,A); //判断方向
    
    if((P1>0 && P2>0 && P3>0 && P4>0) || (P1<0 && P2<0 && P3<0 && P4<0))
    {
        printf("YES\n");
        printf("%0.10lf %0.10lf ",A.X,A.Y);
        printf("%0.10lf %0.10lf ",B.X,B.Y);
        printf("%0.10lf %0.10lf ",D.X,D.Y);
        printf("%0.10lf %0.10lf\n",C.X,C.Y);
        return true;
    }
    return false;
}

bool solve()
{
    if(Cross(a,b,c) && (check(a,b,c) || check(c,a,b) || check(b,c,a))) 
        return true;
    return false;
}

int main()
{
    scanf("%d",&T);
    
    while(T--)
    {
        a=read();b=read();c=read();
        if(!solve())  printf("NO\n\n");
    }
    return 0;
}

 

Review

1、对凸四边形的判断:

顺时针旋转的每个三角形叉积的正负性是否相同

 

2、学会利用对称点的方式整合信息

转载于:https://www.cnblogs.com/newera/p/9079097.html

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值