Kite(几何+镜面对称)
C. Kite
Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB
Input
Output
Sample Input
input | output |
---|---|
0 0 |
2 |
0 0 |
0 |
Hint
题意:求四边形,镜面对称的点;
思路:首先镜面对称,那么点的个数就是一定是偶数倍的。然后既然是镜面对称,那么他的投影点和点的镜面的距离一定是相等的;
转载请注明出处:寻找&星空の孩子
题目链接:Kite:http://www.bnuoj.com/bnuoj/problem_show.php?pid=33563
so......
#include<cstdio>
#include<cmath>
#include<iostream>
#define PI acos(-1.0)
using namespace std; struct Point
{
double x,y;
Point(double x=,double y=):x(x),y(y){}//构造函数,方便代码编写
}; typedef Point Vector;//Vector只是Point的别名 //向量+向量=向量; 向量+点=点
Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);} //点-点=向量
Vector operator - (Point A,Point B){return Vector(A.x-B.x,A.y-B.y);} //向量*数=向量
Vector operator * (Vector A,double p){return Vector(A.x*p,A.y*p);} //向量/数=向量
Vector operator / (Vector A,double p){return Vector(A.x/p,A.y/p);} //
bool operator < (const Point& a,const Point& b){return a.x<b.x||(a.x==b.x && a.y<b.y);} //
const double eps = 1e-;
//三态函数
int dcmp(double x){if(fabs(x)<eps)return ;else return x < ? - : ;}
//相等
bool operator == (const Point& a,const Point& b){return dcmp(a.x-b.x)== && dcmp(a.y-b.y)==;} //点积 x1*x2+y1*y2
//向量垂直点积为0;
//利用点积,求向量的夹角和长度;
double Dot(Vector A,Vector B){return A.x*B.x+A.y*B.y;}
double length(Vector A){return sqrt(Dot(A,A));}
double Angle(Vector A,Vector B){return acos(Dot(A,B)/length(A)/length(B));} //叉积 x1*y2-x2*y1
//向量共线叉积为0;
//叉积为三角形有向面积的2倍
//已知三点求三角形面积
double Cross(Vector A,Vector B){return A.x*B.y-B.x*A.y;}
double Area2(Point A,Point B,Point C){return Cross(B-A,C-A);} double DistanceToLine(Point P,Point A,Point B)
{
Vector v1=B-A, v2=P-A;
return fabs(Cross(v1,v2))/length(v1);//如果不取绝对值,得到的是有向距离;
} Point GetLineProjection(Point P,Point A,Point B)
{
Vector v=B-A;
return A+v*(Dot(v,P-A)/Dot(v,v));
} Point div(Point &A,Point &B)
{
Point E;
E.x=(A.x+B.x)/;
E.y=(A.y+B.y)/;
return E;
}
int main()
{
Point A,B,C,D;
Point AB,BC,CD,DA;
while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y,&D.x,&D.y)!=EOF)
{
AB=div(A,B);
BC=div(B,C);
CD=div(C,D);
DA=div(D,A); // printf("%lf%lf\n%lf%lf\n%lf%lf\n%lf%lf\n",A.x,A.y,B.x,B.y,C.x,C.y,D.x,D.y);
int cnt=;
Point P1,P2,P3,P4;
double x1,x2,x3,x4;
//A--C
P1=GetLineProjection(B,A,C);
P2=GetLineProjection(D,A,C);
x1=DistanceToLine(B,A,C);
x2=DistanceToLine(D,A,C);
if(P1==P2&&x1==x2) cnt+=;
// if(Area2(A,B,C)==Area2(A,D,C)) cnt+=2; //B--D
P1=GetLineProjection(A,B,D);
P2=GetLineProjection(C,B,D);
x1=DistanceToLine(A,B,D);
x2=DistanceToLine(C,B,D);
if(P1==P2&&x1==x2) cnt+=;
// if(Area2(B,A,D)==Area2(B,C,D)) cnt+=2; //BC--DA
P1=GetLineProjection(A,BC,DA);
P2=GetLineProjection(D,BC,DA);
P3=GetLineProjection(B,BC,DA);
P4=GetLineProjection(C,BC,DA);
x1=DistanceToLine(A,BC,DA);
x2=DistanceToLine(D,BC,DA);
x3=DistanceToLine(B,BC,DA);
x4=DistanceToLine(C,BC,DA);
if(P1==P2&&P3==P4&&x1==x2&&x3==x4) cnt+=;
// if(Area2(D,DA,BC)+Area2(D,BC,C)==Area2(A,DA,BC)+Area2(A,BC,B)) cnt+=2; //AB--CD
P1=GetLineProjection(A,AB,CD);
P2=GetLineProjection(B,AB,CD);
P3=GetLineProjection(C,AB,CD);
P4=GetLineProjection(D,AB,CD);
x1=DistanceToLine(A,AB,CD);
x2=DistanceToLine(B,AB,CD);
x3=DistanceToLine(C,AB,CD);
x4=DistanceToLine(D,AB,CD);
if(P1==P2&&P3==P4&&x1==x2&&x3==x4) cnt+=;
// if(Area2(A,AB,CD)+Area2(A,CD,D)==Area2(B,AB,CD)+Area2(B,CD,C)) cnt+=2; printf("%d\n",cnt);
}
return ;
}
Kite(几何+镜面对称)的更多相关文章
- C - Kite URAL - 1963 (几何+四边形判断对称轴)
题目链接:https://cn.vjudge.net/problem/URAL-1963 题目大意:给你一个四边形的n个点,让你判断对称点的个数(对称轴的个数*2). 具体思路:感谢qyn的讲解,具体 ...
- 关于Three.js基本几何形状之SphereGeometry球体学习
一.有关球体SphereGeometry构造函数参数说明 <1>.SphereGeometry(radius, widthSegments, heightSegments, phiStar ...
- 几何服务,cut功能测试
关于几何服务 几何服务用于辅助应用程序执行各种几何计算,如缓冲区.简化.面积和长度计算以及投影.在 ArcGIS Server 管理器中启动几何服务之后,您才能够在应用程序开发过程中使用该服务. 问题 ...
- 几何服务,cut功能,输入要素target(修改后)内容。
几何服务,cut功能测试,输入要素target(修改后)内容. {"displayFieldName":"","fieldAliases": ...
- 几何服务,cut功能,输入要素target(修改前)内容。
几何服务,cut功能测试,输入要素target(修改前)内容. {"geometryType":"esriGeometryPolyline","geo ...
- 如何让你的UWP应用程序无缝调用几何作图
有时候需要编辑一些几何图形,如三角形,圆锥曲线等,在UWP应用中加入这些几何作图功能是件费时间又很难做好的事.其实Windows 10 应用商店中已有一些专业的几何作图工具了,那么能借来一用吗?答案是 ...
- poj 2031Building a Space Station(几何判断+Kruskal最小生成树)
/* 最小生成树 + 几何判断 Kruskal 球心之间的距离 - 两个球的半径 < 0 则说明是覆盖的!此时的距离按照0计算 */ #include<iostream> #incl ...
- NOIP2002矩形覆盖[几何DFS]
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- DOM 元素节点几何量与滚动几何量
当在 Web 浏览器中查看 HTML 文档时,DOM 节点被解析,并被渲染成盒模型(如下图),有时我们需要知道一些信息,比如盒模型的大小,盒模型在浏览器中的位置等等,本文我们就来详细了解下元素节点的几 ...
随机推荐
- Maths | Metropolis-Hastings algorithm
目录 1. 随机模拟的基本思想 2. 拒绝抽样 3. Metropolis-Hastings抽样 3.1. 引入思想 3.2. 理论基础:细致平稳条件 3.3. MH算法实现 3.4. 算法升级 3. ...
- bash编程-执行流程
1.顺序执行 shell脚本按从上到下的顺序依次执行,除非使用了选择.循环等执行流程. 2.选择执行 2.1 if # 格式一 if 条件; then # 语句 fi # 格式二 if 条件; the ...
- WeexSDK之注册Components
先来看一下注册Components的源码: + (void)_registerDefaultComponents { [self registerComponent:@"container& ...
- EF生成实体自动添加数据库字段注释
我们在用EF从数据库生成模型的时候,默认实体类是没有注释的,但是我们已经在数据库字段添加说明了,能不能自动把注释也拿过来? 答案是:能. 那么我们开始 首先随便开一个ASP.NET MVC项目,我 ...
- ASP.NET MVC下使用AngularJs语言(二):ng-click事件
程序用户交互,用户使用mouse点击,这是一个普通的功能. 在angularjs的铵钮点击命令是ng-click. 创建Angularjs的app使用前一篇<ASP.NET MVC下使用Angu ...
- String的substring方法
string.substring(beginIndex, endIndex) 左闭右开. 测试 public static void main(String[] args) { String a = ...
- Web开发经验谈之F12开发者工具/Web调试[利刃篇]
引语:如今的整个Web开发行业甚至说整个软件开发行业,已经相当成熟,基本上已经很少找不到没有前人做过的东西了,或者换句话说,你想要实现的功能,你总能在某个地方搜索到答案,关键是你有没有这个时间精力去搜 ...
- 使用cygwin中的awk工具进行mysql binlog日志查看[利刃篇]
linux工具确实强悍,然而作为没有linux机器使用权以及开发没有使用linux进行的人,有时想用一些命令确实不方便,所以,才去试着用用cygwin,一款在windows平台上运行的类UNIX模拟环 ...
- HttpClient和HttpURLConnection的使用和区别(下)
转自来自点击打开链接 接着上一篇,我们继续来分析HttpURLConnection的使用,以及两者的共同点和区别. 目录 用法 HttpURLConnection 区别 引用资料 用法 HttpURL ...
- Spring Boot日志集成实战
Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用 ...