原题: https://ac.nowcoder.com/acm/contest/885/I

题意:

给出w,h,a,b,cw,h,a,b,cw,h,a,b,c,求三个点X,Y,ZX,Y,ZX,Y,Z,使得∣XY∣=a,∣XZ∣=b,∣YZ∣=c|XY|=a,|XZ|=b,|YZ|=c∣XY∣=a,∣XZ∣=b,∣YZ∣=c,所有点的x值属于[0,w][0,w][0,w],y值属于[0,h][0,h][0,h]

解析:

塞一个点在(0,0)(0,0)(0,0),然后枚举每条边落在矩形框的每一条边的情况。不知道为什么已知两个点求第三个点的时候用两圆交就不行,用向量旋转就过了。

代码:

#include<bits/stdc++.h>
using namespace std;const double eps =  1e-12;
struct point
{point(){}point(double x,double y):x(x),y(y){}double x,y;point operator-(const point a){return point(x-a.x,y-a.y);}point operator+(const point a){return point(x+a.x,y+a.y);}void operator *= (const double mul){this->x*=mul;this->y*=mul;}double Len(){return sqrt(x*x+y*y);}
};
typedef struct point point;
typedef point Vector;
double xmult(point p1,point p2,point p0)
{return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double distance(point p1,point p2)
{return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
//点到直线的距离
double disptoline(point p,point l1,point l2)
{return fabs(xmult(p,l1,l2))/distance(l1,l2);
}
//求两直线交点
point intersection(point u1,point u2,point v1,point v2)
{point ret=u1;double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));ret.x+=(u2.x-u1.x)*t;ret.y+=(u2.y-u1.y)*t;return ret;
}void intersection_line_circle(point c,double r,point l1,point l2,point& p1,point& p2)
{point p=c;double t;p.x+=l1.y-l2.y;p.y+=l2.x-l1.x;p=intersection(p,c,l1,l2);t=sqrt(r*r-distance(p,c)*distance(p,c))/distance(l1,l2);p1.x=p.x+(l2.x-l1.x)*t;p1.y=p.y+(l2.y-l1.y)*t;p2.x=p.x-(l2.x-l1.x)*t;p2.y=p.y-(l2.y-l1.y)*t;
}void intersection_circle_circle(point c1,double r1,point c2,double r2,point& p1,point& p2)
{point u,v;double t;t=(1+(r1*r1-r2*r2)/distance(c1,c2)/distance(c1,c2))/2;u.x=c1.x+(c2.x-c1.x)*t;u.y=c1.y+(c2.y-c1.y)*t;v.x=u.x+c1.y-c2.y;v.y=u.y-c1.x+c2.x;intersection_line_circle(c1,r1,u,v,p1,p2);
}Vector Rotate(Vector a, double rad){//逆时针旋转 易损失精度return Vector(a.x*cos(rad) - a.y*sin(rad), a.x*sin(rad) + a.y*cos(rad));
}
//************************************************************************************int dcmp(double a){return fabs(a)<eps?0:(a>0?1:-1);
}double w,h;
bool legal(point p){return dcmp(p.x)>=0&&dcmp(p.x-w)<=0&&dcmp(p.y)>=0&&dcmp(p.y-h)<=0;
}void deal(double a,double b,double c,point &X,point &Y,point &Z){point x,y,z;x=point(0,0);double ang=acos((a*a+b*b-c*c)/(2.0*a*b));if(dcmp(a-h)<=0){y=point(0,a);Vector tmp=y-x;tmp*=1.0/tmp.Len();tmp*=b;point t1,t2;t1=Rotate(tmp,ang)+x;t2=Rotate(tmp,-ang)+x;if(legal(t1)){X=x,Y=y,Z=t1;return;}if(legal(t2)){X=x,Y=y,Z=t2;return;}}else{y=point(sqrt(a*a-h*h),h);Vector tmp=y-x;tmp*=1.0/tmp.Len();tmp*=b;point t1,t2;t1=Rotate(tmp,ang)+x;t2=Rotate(tmp,-ang)+x;if(legal(t1)){X=x,Y=y,Z=t1;return;}if(legal(t2)){X=x,Y=y,Z=t2;return;}}if(dcmp(a-w)<=0){y=point(a,0);Vector tmp=y-x;tmp*=1.0/tmp.Len();tmp*=b;point t1,t2;t1=Rotate(tmp,ang)+x;t2=Rotate(tmp,-ang)+x;if(legal(t1)){X=x,Y=y,Z=t1;return;}if(legal(t2)){X=x,Y=y,Z=t2;return;}}else{y=point(w,sqrt(a*a-w*w));Vector tmp=y-x;tmp*=1.0/tmp.Len();tmp*=b;point t1,t2;t1=Rotate(tmp,ang)+x;t2=Rotate(tmp,-ang)+x;if(legal(t1)){X=x,Y=y,Z=t1;return;}if(legal(t2)){X=x,Y=y,Z=t2;return;}}
}int main(){//freopen("data.in","r",stdin);int t;scanf("%d",&t);while(t--){double a,b,c;scanf("%lf%lf%lf%lf%lf",&w,&h,&a,&b,&c);point X=point(-1.34,-1.34),Y=point(-1.34,-1.34),Z=point(-1.34,-1.34);deal(a,b,c,X,Y,Z);deal(a,c,b,Y,X,Z);deal(b,a,c,X,Z,Y);deal(b,c,a,Z,X,Y);deal(c,a,b,Y,Z,X);deal(c,b,a,Z,Y,X);printf("%.12f %.12f %.12f %.12f %.12f %.12f\n",X.x,X.y,Y.x,Y.y,Z.x,Z.y);}
}

three points 1(平面几何 三角形)相关推荐

  1. Java黑皮书课后题第8章:*8.32(几何:三角形面积)编写一个方法,使用下面的方法头,返回一个三角形的面积。编写一个程序,提示用户输入三角形的三个点,然后显示三角形的面积

    *8.32(几何:三角形面积)编写一个方法,使用下面的方法头,返回一个三角形的面积.编写一个程序,提示用户输入三角形的三个点,然后显示三角形的面积 题目 题目描述与运行示例 破题 代码 题目 题目描述 ...

  2. 【Python】scipy.spatial.Delaunay中文教程

    目前介绍Delaunay的中文教程不多,基本都是零零散散的代码实例,很少有系统的函数参数介绍.晚上用了50分钟,把英文教程翻译了一遍. 函数参数: class scipy.spatial.Delaun ...

  3. 五分钟学会各种环形进度条

    本文将会通过svg实现圆形进度条和矩形进度条以及三角形进度条,先放效果图 圆环进度条 首先我们需要两个画两个圆,一个是底色圆,一个是进度圆. <svg width="200" ...

  4. Zed-Unity插件代码注释——ZEDCamera.CS

    @[toc Zed-Unity插件代码注释--ZEDCamera.cs 引言 Zed-Unity插件提供了在Unity中访问ZED相机SDK的工具,除了提供了SDK的接口外,插件里面还有一些很典型的d ...

  5. R语言ggplot2可视化:在选定数据点周围添加三角形(Add Triangles Around Select Data Points)

    R语言ggplot2可视化:在选定数据点周围添加三角形(Add Triangles Around Select Data Points) 目录

  6. 能否构成三角形的条件代码_平面几何之三角形篇

    平面几何是高考的必考点,其中,三角形又是备受出题人喜爱的一中图形.对三角形的考察方式有很多,许多体型都可以与三角形相结合,比如向量.三角函数.圆锥曲线等. 本文总结了高中三角形相关的知识点,其中涉及了 ...

  7. 平面几何趣题:三角形中的四点共圆

        任意给定一个三角形ABC.令M为BC上的中点,令H为BC上的垂足.角A的平分线与BC交于点D.过B.C分别向角平分线AD作垂线,垂足分别为P.Q.证明H.P.M.Q四点共圆.     证明过程 ...

  8. 在unity向量空间内绘制几何(4): 利用平面几何知识画像素直线

    这两年像素很火,<我的世界>也要进入国内了. 问题:假如有一个像素平面,既是一个充满四方格子平面,给出任意两个格子的坐标,画出两个格子间的直线. 接下来,尝试在平面几何的角度下思考并解决这 ...

  9. TikZ作图教程 | 平面几何篇01——中小学数学老师的好帮手

    作者:Daniel 时间:2020年6月9日 Karl是一名中学数学老师,他担任学校数学组组长.学期快结束了,他现在正在准备出一套年级期末考试试卷. 作为一名数学老师,每年要准备各种数学文档--电子讲 ...

  10. Leetcode812.Largest Triangle Area最大三角形面积

    给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积. 示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这 ...

最新文章

  1. SQL server 基本语句
  2. 十分钟理解Java泛型擦除
  3. 关于python的一些好的书籍推荐-推荐几本对于Python初学者比较好的书籍(内含PDF)...
  4. angular 应为声明或语句_“允许”员工自愿降薪后,多益网络再发声:声明降薪非自愿者奖 3 万...
  5. UnisGuard防篡改产品了解
  6. Android之看起来像奔溃了但是没有发现奔溃日志
  7. linux下cron定时任务的总结
  8. asp.net 实现一级域名与二级域名共享COOKIE
  9. 一次函数的斜率公式_【海广教育数学口诀】初中数学学不会?公式这样记,让你做题效率翻倍!...
  10. Python3.2官方文件翻译-工具列表和十进制浮点计算
  11. [Android] TabLayout设置下划线(Indicator)宽度
  12. python 对象和json互相转换
  13. 【模拟IC】闩锁效应的概念,产生原因,工作过程及解决方案
  14. 微信小程序---wxss模板样式
  15. php压力比例混合器图片,教你认识各种泡沫比例混合器
  16. 30分钟LINQ教程(转)
  17. Pycharm下载及设置文字大小快捷键
  18. Spectral Core Crack,Spectral Core尽快创建数据库副本
  19. 树莓派python蓝牙_用树莓派玩转蓝牙
  20. golang前后端分离框架

热门文章

  1. C# WPF MVVM 实战 - 2.1
  2. SAP-WEB-GUI无法上传excel问题
  3. SAP内部订单BAPI扩展字段
  4. forward与sendRedirect区别
  5. 《计算机网络自顶向下》笔记
  6. [ thanos源码分析系列 ]thanos sidecar组件源码简析
  7. ddqn玩flappybird
  8. stm32 定时器_基于STM32定时器ETR信号的应用示例
  9. 使用UNIAPP开发APP教程-01框架搭建
  10. linux install 文件,linux命令安装msi文件