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 节点被解析,并被渲染成盒模型(如下图),有时我们需要知道一些信息,比如盒模型的大小,盒模型在浏览器中的位置等等,本文我们就来详细了解下元素节点的几 ...
随机推荐
- System.exit(int status)
这个方法是用来结束当前正在运行中的Java虚拟机 System.exit(0); /* 实参为0表示正常终止 */ System.exit(1); /* 实参为非0表示异常终止 */
- Python自动化开发 - Python操作Memcached、Redis、RabbitMQ
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速 ...
- Unity面试题2
1.Animation.CrossFade命令作用是(C) A 动画消失 B动画转换 C东环的淡入为其他动画 2.Application.loadedLevel命令为(A) A加载关卡 B异步加载关卡 ...
- flask_SQLALchemy之多表查询
1. join 查询 假设这样一个业务场景,知道一个邮箱地址,要查询这个地址所属的用户,第一个办法是用连接多个 filter() 来查询. for u, a in session.query(User ...
- 小程序基础知识点讲解-WXML + WXSS + JS,生命周期
小程序基础 小程序官方地址,小程序开发者工具,点击此处下载.在微信小程序中有一个配置文件project.config.json,此文件可以让开发者在不同设备中进行开发. 微信小程序共支持5种文件,wx ...
- Android Fragment用法知识点的讲解
Android Fragment用法的讲解 碎片,它的出现是为了更好展示UI的设计,让程序更加得到充分的展示.Fragment的出现,如微信的额主界面包含多个Fragment,使得微信功能更加简洁明了 ...
- C语言中const关键字的用法
关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理 ...
- 机器学习技法笔记:05 Kernel Logistic Regression
Roadmap Soft-Margin SVM as Regularized Model SVM versus Logistic Regression SVM for Soft Binary Clas ...
- resin远程调试配置
1.进入resin的安装路径下的conf目录,下面有个resin.conf的文件,打开它,将下面这段配置添加进去,然后重启resin(大家应该知道如何重启吧): <jvm-arg>-Xde ...
- [每天解决一问题系列 - 0009] File System Redirector
问题描述: 在64位操作系统下,知道Wow64是干什么的,但一直不知道是怎么工作的 相关解释: https://msdn.microsoft.com/en-us/library/windows/des ...