CodeForces 23D Tetragon 给定凸四边形3条同边长的中点求4个顶点 计算几何

题目链接:点击打开链接

题意:

给定3个二维平面上的点

这3个点是一个凸四边形的其中3个中点

且所在的3条边边长相等

问是否存在这样的四边形,若存在则输出四边形顶点

思路:

那个外面的点是一个中点关于另一个中点对称得到的

然后得到一个圆的2条弦,圆心就是4个顶点之一,剩下对称出来即可

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <set>
#include <stdlib.h>
using namespace std;
#define ST 1001
#define EN 1002
#define M 10000
#define inf 1000000
#define eps 1e-8
#define PR 1e-8
#define node Point
struct Point{//点是2维的
    double x,y;
}p[50],aa[3],ans[4];    

double Cross(Point p1,Point p2,Point p3,Point p4){//二维向量(p1p2)X(p3p4) 返回第三向量长度
    double x1=p2.x-p1.x,y1=p2.y-p1.y;
    double x2=p4.x-p3.x,y2=p4.y-p3.y;
    return x1*y2-x2*y1; //为0表示 p1p2 与p3p4共线
    //直线:不为0就是相交
}
bool On_Segment(Point p1,Point p2,Point p3){//p3点在 p1p2线段上
    if(Cross(p1,p2,p1,p3)!=0)return false;
    bool iny=(p1.y<=p3.y && p3.y<=p2.y)||(p1.y>=p3.y && p3.y>=p2.y);
    bool inx=(p1.x<=p3.x && p3.x<=p2.x)||(p1.x>=p3.x && p3.x>=p2.x);
    if(inx && iny)return true;
    return false;
}
bool Segmentintersect(Point p1,Point p2,Point p3,Point p4){//p1p2 是否与 p3p4相交
    double cross_1=Cross(p3,p4,p3,p1),cross_2=Cross(p3,p4,p3,p2);//cross_1 2必须一正一负且都不为0
    double cross_3=Cross(p1,p2,p1,p3),cross_4=Cross(p1,p2,p1,p4);//cross_2 4必须一正一负且都不为0
    //表示a线段 2点 在b线段 2侧
    if(cross_1*cross_2<0 && cross_3*cross_4<0)return true;    

    //a线段端点在 b线段上 视情况取舍这种位置
//  if(cross_1==0 && On_Segment(p3,p4,p1))return true;
//  if(cross_2==0 && On_Segment(p3,p4,p2))return true;
//  if(cross_3==0 && On_Segment(p1,p2,p3))return true;
//  if(cross_4==0 && On_Segment(p1,p2,p4))return true;
    return false;
}
#define N 105
#define eps 1e-8
double Abs(double x){return x>0?x:-x;}
bool equal(double a,double b){return Abs(a-b)<eps;}

node dui(node xx, node yy){
	node now ;
	now.x = 2*yy.x-xx.x;
	now.y = 2*yy.y-xx.y;
	return now;
}
double dis(node xx,node yy){
	return sqrt((xx.x-yy.x)*(xx.x-yy.x)+(xx.y-yy.y)*(xx.y-yy.y));
}
node hehe(node a,node b,node c){
	node now;
	double a1=b.x-a.x, b1=b.y-a.y, c1=(a1*a1+b1*b1)/2;
	double a2=c.x-a.x, b2=c.y-a.y, c2=(a2*a2+b2*b2)/2;
	double d =a1*b2-a2*b1;
	now.x = a.x+(c1*b2-c2*b1)/d;
	now.y = a.y+(a1*c2-a2*c1)/d;
	return now;
}
bool gongxian(node a,node b,node c){
	if(!(equal((b.x+c.x)/2.0,a.x)&&equal((b.y+c.y)/2.0,a.y)))
		swap(a,b);
	if(!(equal((b.x+c.x)/2.0,a.x)&&equal((b.y+c.y)/2.0,a.y)))
		return false;
	return equal(dis(a,b),dis(a,c));
}
bool work(node a,node b,node c){
	if(gongxian(a,b,c))return false;
	node bb = dui(b,a);
	if(gongxian(a,bb,c))return false;
	ans[1] = hehe(a,bb,c);
	ans[2] = dui(ans[1],a);
	ans[3] = dui(ans[2],b);
	ans[0] = dui(ans[1],c);
	return Segmentintersect(ans[1],ans[3],ans[0],ans[2]);
}
int main(){
	int T;scanf("%d",&T);
	while(T--){
		for(int i = 0; i < 3; i++)scanf("%lf %lf",&aa[i].x,&aa[i].y);
		if(work(aa[0],aa[1],aa[2])||work(aa[1],aa[0],aa[2])||work(aa[2],aa[1],aa[0])){
				puts("YES");
			for(int i = 0; i < 4; i++){
				printf("%.10lf %.10lf",ans[i].x,ans[i].y);
				if(i==3)puts("");
				else printf(" ");
			}
		}
		else puts("NO"), puts("");
	}
	return 0;
}

CodeForces 23D Tetragon 给定凸四边形3条同边长的中点求4个顶点 计算几何,布布扣,bubuko.com

时间: 2024-08-26 09:50:37

CodeForces 23D Tetragon 给定凸四边形3条同边长的中点求4个顶点 计算几何的相关文章

zoj 1806 This Takes the Cake 计算凸四边形和三角形的面积

题目来源: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=806 题意: 凸四边形上 有8个点, 4个顶点 , 和 每2个顶点的中点.经过这8个点的每一条线段,将四边形分成2份, 求这两份面积最近的面积. 分析:  枚举, 每条线段, 计算 一边面积 S(较小), 另一边 面积 s1 = sum - S  ,   找使 S / S1 最大的 面积, 即可. 代码如下: double add(double a, double

FZU Problem 2148 Moon Game (判断凸四边形)

题目链接 题意 : 给你n个点,判断能形成多少个凸四边形. 思路 :如果形成凹四边形的话,说明一个点在另外三个点连成的三角形内部,这样,只要判断这个内部的点与另外三个点中每两个点相连组成的三个三角形的面积和要与另外三个点组成的三角形面积相同. 中途忘了加fabs还错了好几次 1 //FZU2148 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <cmath>

Codeforces Round #261 (Div. 2)459D. Pashmak and Parmida&#39;s problem(求逆序数对)

题目链接:http://codeforces.com/contest/459/problem/D D. Pashmak and Parmida's problem time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Parmida is a clever girl and she wants to participate in O

给定斐波那契数列的项数求对应的数值的普通方法和优化处理

1 /** 2 给定斐波那契数列的项数求对应的数值 3 参考:剑指Offer 4 */ 5 #include <stdio.h> 6 7 int fib(int n); 8 long long fibonacci(unsigned int n); 9 int main(int argc, const char * argv[]) { 10 11 int n; 12 13 while (1) { 14 15 printf("请输入你想知道到的斐波那契数列的项数:\t"); 1

codeforces 321E Ciel and Gondolas 四边形不等式

题目大意:给定n个人,需要分k次过河,两个人i,j如果同乘一条船就会产生ai,j的代价,求最终代价的最小值 这个玩应显然满足四边形不等式(虽然我并不知道这个不等式是啥 然后就是决策单调(虽然我并不知道为何满足四边形不等式一定决策单调 然后就能分治做辣... 定义Solve(l,r,optl,optr)表示当前在处理区间[l,r],最优决策区间为[optl,optr] 然后我们用区间[optl,min(optr,mid?1)]的f值来更新f[mid],并记录最优决策点pos 那么[l,mid?1]

判断点在凸四边形内

#include <stdio.h> #include <stdlib.h> struct pt { float x,y; }; struct quat { pt points[4]; }; float crossmulti2d( float x1, float y1, float x2, float y2) { return x1 * y2 - x2 * y1; } bool inquat( quat _q, pt _pt) { pt vec1, vec2; vec1.x = _

Codeforces Round #Pi (Div. 2) E. President and Roads (最短路+强连通求割边)

题目地址:codeforces #pi (DIV2) E 题目很水..就是先求两边最短路,然后把可能为最短路的边挑出来,然后判断是否yes只需要转化成无向图跑一遍tarjan,找出割边,割边就是yes,然后剩下的边就让它的值为最短路-1就行了,如果-1后变成了非正数,就是no. 但是!!!居然卡spfa!!那是不是说cf以后就不能用可以卡的算法了..完全可以出组数据来卡这些算法...比如spfa,isap... 于是为了这题,又看了一遍迪杰斯特拉算法.. 代码如下: #include <cstd

Codeforces 390E Inna and Large Sweet Matrix 树状数组改段求段

题目链接:点击打开链接 题意:给定n*m的二维平面 w个操作 1.0 (x1,y1) (x2,y2) value for i : x1 to x2 for j : y1 to y2 mp[i][j] += value; 2.1 (x1, y1) (x2 y2) ans1 = 纵坐标在 y1,y2间的总数 ans2 = 横坐标不在x1,x2间的总数 puts(ans1-ans2); 因为n最大是4e6, 所以用树状数组改段求段代替线段树 #include <stdio.h> #include &

CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段)

树状数组只能实现线段树区间修改和区间查询的功能,可以代替不需要lazy tag的线段树,且代码量和常数较小 首先定义一个数组 int c[N]; 并清空 memset(c, 0, sizeof c); 1.单点修改 : c[x] += y; 对应的函数是 change(x, y); 2.求前缀和 :  对应的函数是 int sum(x) 两种操作的复杂度都是O(logn) 模板如下: int c[N], maxn; inline int Lowbit(int x){return x&(-x);}