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 节点被解析,并被渲染成盒模型(如下图),有时我们需要知道一些信息,比如盒模型的大小,盒模型在浏览器中的位置等等,本文我们就来详细了解下元素节点的几 ...
随机推荐
- Go语言正则模块
基本使用 import "bytes" import "fmt" import "regexp" func main() { //这个测试一 ...
- Python序列结构--列表(一)
列表 列表**包含若干元素的有序连续内存空间**,当列表增加或删除元素时,**列表对象自动进行内存的扩展或收缩**,从而**保证相邻元素之间没有缝隙**.但插入和删除非尾部元素时涉及列表元素大量的移动 ...
- CUDA-存储器
1.类型(8种) register: GPU片内 device可读\写 shared memory:GPU片内 device可读\写 local memory:板载显存 device可读\写 cons ...
- nlog 的手动配置
使用nlog的时候,有时候需要手动配置.比如数据库链接和密码不配在文件里,或者统计配置在一个位置之类的. var config = new NLog.Config.LoggingConfigurati ...
- Cordova - IOS浏览器里面数字被当做电话号码
网页上有连续超过5个数字,ios浏览器就会当做手机号码,如果某行文字有颜色,那么这个连续的数字就没颜色,变黑色了. 解决方法:在html页面头部加入下面代码 <meta name="f ...
- MFS 服务扫描与爆破
MSF 服务发现 常用来发现局域网内,的常见服务,比如HTTP,FTP,TELNET等. MSF模块搜索: [root@localhost ~]# msfconsole msf5 > searc ...
- Django 通过 mongoengine 连接 MongoDB 进而使用orm进行CRUD
一. 在python脚本中, 我们通常可以使用pymongo模块实现与mongodb数据库的交互, 但是在使用Django框架进行定制开发的web server 项目中, 仍然使用pymongo模块的 ...
- 15:IO之File、Properties类
第一 File类 一.概述:File类是有文件或文件件封装而来的对象,可以操作其属性信息,这个类的出现弥补了流的不足,流只能操作数据 1.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与 ...
- Linux - YUM包管理
简述 rpm是由红帽公司开发的软件包管理方式,使用rpm可以方便的进行软件的安装.查询.卸载.升级等工作. 但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时. Yum(全称 ...
- 【sping揭秘】17、@Around,@Introduction
package cn.cutter.start.bean; import org.apache.commons.logging.Log; import org.apache.commons.loggi ...