https://cn.vjudge.net/problem/Gym-101991J

题目很长,其实就是给你一个正三角形,并且告诉你它的中点在Z轴上以及法向量,边长和顶点A的坐标(自由度已定),让你求A,B,C到Z轴上一点H的距离。

题解:高考向量题,考虑正三角形ABC,我们把OB拆成OD加DB,OD=-OA/2,DB可以通过连立三个方程得到(它垂直于AO和法向量,他的长度为L/2)

坑:

我一开始拆的是OA+AB,公式太长不可解orz,

后来解方程的时候写错了orz

然后y写成xorz

最后没考虑逆时针输出orz(这里要用叉积判一下,OA X OB 的方向要与法向量同)

#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<vector>
#include<queue>
#include<string>
#include<ctime>
#include<stack>
#include<map>
#include<set>
#include<list>
using namespace std;
#define rep(i,j,k) for(int i = (int)j;i <= (int)k;i ++)
#define per(i,j,k) for(int i = (int)j;i >= (int)k;i --)
#define debug(x) cerr<<#x<<" = "<<(x)<<endl
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
//#define x first
//#define y second typedef double db;
typedef long long ll;
const int MAXN = ;;
const int maxn = MAXN;
struct V {
db x, y,z;
V() {}
void sc() { scanf("%lf%lf", &x, &y); }
V(db a, db b) : x(a), y(b) { }
V operator+(V o) { return V(x + o.x, y + o.y); }
V operator-(V o) { return V(x - o.x, y - o.y); }
db L() { return sqrt(x * x + y * y); }
V N() {
db l = L();
return V(x / l, y / l);
}
V rot(db th) { return V(x * cos(th) - y * sin(th), x * sin(th) + y * cos(th)); }
V operator*(db z) { return V(x * z, y * z); }
db operator*(V o) { return x * o.x + y * o.y; }
db operator|(V o) { return x * o.y - o.x * y; }
void pr() { printf("%lf %lf\n", x, y); }
} p[maxn]; //三维几何函数库 #define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)
struct point3 { db x, y, z; };
struct line3 { point3 a, b; };
struct plane3 { point3 a, b, c; }; //计算cross product U x V
point3 xmult(point3 u, point3 v) {
point3 ret;
ret.x = u.y*v.z - v.y*u.z;
ret.y = u.z*v.x - u.x*v.z;
ret.z = u.x*v.y - u.y*v.x;
return ret;
} //计算dot product U . V
db dmult(point3 u, point3 v) {
return u.x*v.x + u.y*v.y + u.z*v.z;
} //矢量差 U - V
point3 subt(point3 u, point3 v) {
point3 ret;
ret.x = u.x - v.x;
ret.y = u.y - v.y;
ret.z = u.z - v.z;
return ret;
}
point3 addt(point3 u, point3 v) {
point3 ret;
ret.x = u.x + v.x;
ret.y = u.y + v.y;
ret.z = u.z + v.z;
return ret;
} //取平面法向量
point3 pvec(plane3 s) {
return xmult(subt(s.a, s.b), subt(s.b, s.c));
}
point3 pvec(point3 s1, point3 s2, point3 s3) {
return xmult(subt(s1, s2), subt(s2, s3));
} //两点距离,单参数取向量大小
db distance(point3 p1, point3 p2) {
return sqrt((p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y) + (p1.z - p2.z)*(p1.z - p2.z));
} //向量大小
db vlen(point3 p) {
return sqrt(p.x*p.x + p.y*p.y + p.z*p.z);
} int main() {
freopen("jupiter.in", "r", stdin);
int t; cin >> t;
while (t--) {
point3 N, A;
db l, h;
scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &N.x, &N.y, &N.z, &A.x, &A.y, &A.z, &l, &h);
//scanf("%f%f%f%f%f%f%f%f", &N.x, &N.y, &N.z, &A.x, &A.y, &A.z, &l, &h);
//cin >> N.x >> N.y >> N.z >> A.x >> A.y >> A.z >> l >> h;
point3 H = { .,.,-h };
db La, Lb, Lc; db up = N.z*A.x - A.z*N.x;
db under = N.y*A.x - A.y*N.x;
db coy = -up / under;
db cox =( N.z + N.y*coy)/(-N.x);
cox = (A.z + A.y*coy) / (-A.x);
db zz=l*l / 4.0/(coy*coy + cox*cox + 1.0) ;
db z = l/sqrt(coy*coy + cox * cox + 1.0)/2.0;
//db z = l / 2.0 / (coy + cox + 1.0);
db x = cox * z;
db y = coy * z;
point3 b = { x,y,z };
point3 c = { -x,-y,-z };
point3 t = xmult(A, b);
if (t.z*N.z > );
else swap(b, c);
point3 unA = { -A.x / .,-A.y / .,-A.z / . };
point3 B = addt(unA, b);
point3 C = addt(unA, c);
La = distance(A, H);
Lb = distance(B, H);
Lc = distance(C, H);
//if (N.z < 0)swap(Lb, Lc);
printf("%.6lf %.6lf %.6lf\n", La,Lb,Lc); }
//cin >> t;
}
/*
2
13 -18 1 7 5 -1 15 12
-12 -17 1 7 -5 -1 15 3 2
13 -18 1 7 5 -1 15 12
-12 -17 1 7 -5 -1 15 3
*/

ps:第一次霸榜??

然后抄一个三维模板,

这个板子的话就厉害了 ,有了二维向量的一切操作。

这里的旋转操作,可以让向量V绕一个法向量n逆时针转theta度。

于是我们就只有两行代码了,

V3 B = N.rot(A, PI*2.0 / 3.0);
V3 C = N.rot(A, PI*4.0 / 3.0);
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<vector>
#include<queue>
#include<string>
#include<ctime>
#include<stack>
#include<map>
#include<set>
#include<list>
using namespace std;
#define rep(i,j,k) for(int i = (int)j;i <= (int)k;i ++)
#define per(i,j,k) for(int i = (int)j;i >= (int)k;i --)
#define debug(x) cerr<<#x<<" = "<<(x)<<endl
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
//#define x first
//#define y second typedef double db;
typedef long long ll;
const int MAXN = ;;
const int maxn = MAXN;
const double eps = 1e-;
const double PI = acos(-1.0);
struct V3 {
db x, y, z;
V3() {}
V3(db xx, db yy, db zz) :x(xx), y(yy), z(zz) {}
void sc() {scanf("%lf%lf%lf", &x, &y, &z);}
db L() { return sqrt(x*x + y * y + z * z); }
V3 N() { db l = L(); return V3(x / l, y / l, z / l); }
V3 operator+(V3 o) { return V3(x + o.x, y + o.y,z+o.z); }
V3 operator-(V3 o) { return V3(x - o.x, y - o.y,z-o.z); }
V3 operator*(db zz) { return V3(x * zz, y * zz,z*zz); }
db operator*(V3 o) { return x * o.x + y * o.y+z*o.z; }
V3 operator|(V3 o) { return V3(y*o.z-z*o.y,z*o.x-x*o.z,x * o.y - o.x * y); }
};
int sgn(db x) {
if (fabs(x) < eps)return ;
else if (x > )return ;
else return -;
}
struct L3 {
V3 s, e;
L3() {}
L3(V3 ss, V3 ee) :s(ss), e(ee) {}
V3 rot(V3 p, db arg) {
if (sgn(((s - p) | (e - p)).L()) == )return p;
V3 f1 = (e - s) | (p - s);
V3 f2 = (e - s) | (f1);
db len = ((s - p) | (e - p)).L() / (s - e).L();
f1 = f1.N()*len; f2 = f2.N() * len;
V3 h = p + f2;
V3 pp = h + f1;
return h + ((p - h)*cos(arg)) + ((pp - h)*sin(arg));
} }; int main() {
freopen("jupiter.in", "r", stdin);
int t; cin >> t;
while (t--) {
V3 n, A;
n.sc(); A.sc();
db L, H;
scanf("%lf%lf", &L, &H);
L3 N = L3(V3(, , ), n);
V3 base = V3(, , -H);
V3 B = N.rot(A, PI*2.0 / 3.0);
V3 C = N.rot(A, PI*4.0 / 3.0);
printf("%.6lf %.6lf %.6lf\n", (base - A).L(), (base - B).L(), (base - C).L());
}
//cin >>t;
}
/*
2
13 -18 1 7 5 -1 15 12
-12 -17 1 7 -5 -1 15 3 2
13 -18 1 7 5 -1 15 12
-12 -17 1 7 -5 -1 15 3
*/

【立体几何】Journey to Jupiter Gym - 101991J 立体几何模板的更多相关文章

  1. ACM/ICPC 之 三维计算几何+暴力枚举+判重(HDU5839)

    CCPC网赛第八题,求立体几何数量,题解见注释 //立体几何-求满足要求的四面体个数 //要求1:至少4条边相等 //要求2:四条边相等时,另两条边一定不相邻(即对边) //题解:以当前边为不相邻的其 ...

  2. 【立体几何】分类讨论很细节 Gym - 101967I Путешествие по тору

    http://codeforces.com/gym/101967/attachments 题意:定义了一个甜甜圈.(torus) 不是让你二重积分啦233 现在有一个星球是甜甜圈形状的,它有四条很关键 ...

  3. three.js初探,立体几何入手(一)

    前言:首先先推荐一篇博客,关于webgl原理,讲的非常之通俗易懂了 图解WebGL&Three.js工作原理  webGL可以理解为openGL ES2.0 (webGL2.0 - openG ...

  4. [数]昨天欠下的一道立体几何题HDU-4741

    并没有做到这道题,后来听学长说了题意,总之就是立体几何嗯 看了好几份题解,是的我知道是异面线段的距离了,可是看码完全不明orz. 这时候出现了一份清晰易懂甚至给出了公式来源的blog╰(*°▽°*)╯ ...

  5. Gym 102056L - Eventual … Journey - [分类讨论][The 2018 ICPC Asia-East Continent Final Problem L]

    题目链接:https://codeforces.com/gym/102056/problem/L LCR is really an incredible being. Thinking so, sit ...

  6. Gym 100801 J. Journey to the “The World’s Start” DP+单调队列优化+二分

    http://codeforces.com/gym/100801 题目大意:有从左到右有n个车站,有n-1种车票,第i种车票一次最多可以坐 i 站(1<=i<=n)   每种票有固定的价钱 ...

  7. MT【107】立体几何中用阿波罗尼乌斯圆的一道题

    分析:利用内外圆知识知道,B,C两点到 AD 的距离$\le4$. 利用体积公式$V=\frac{1}{3}S_{截面}|AD|\le2\sqrt{15}$

  8. hdu 5726 tetrahedron 立体几何

    tetrahedron/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Given four p ...

  9. MT【117】立体几何里的一道分类讨论题

    评:最后用到了中间的截面三角形两边之和大于第三边.能不能构成三棱锥时考虑压扁的"降维"打击是常见的方式.

随机推荐

  1. libfacedetection简单使用记录

    目录 1.源码下载 2.编译 2.1.linux 2.2.Windows MINGW64 2.3.VS2017 NMake编译 3.简单测试程序 3.1.测试截图 3.2.测试代码如下 1.源码下载 ...

  2. Ubuntu18.04下可以完美运行Quake3 Arena

    安装 其实很早就知道Linux下面可以跑Quake3, 但是一直没有付诸行动, 在硬盘上躺了很多年的Quake III Arena, 和Brood一起从来不舍得删, 昨天终于想起来试试. 安装很简单, ...

  3. 构建自己的 Smart Life 私有云(二)-> 连通 IFTTT & Slack

    博客搬迁至https://blog.wangjiegulu.com RSS订阅:https://blog.wangjiegulu.com/feed.xml 原文链接:https://blog.wang ...

  4. 面经 cisco 2

    1. cpu中的cache结构及cache一致性 一. 引子 在多线程环境中,经常会有一些计数操作,用来统计线上服务的一些qps.平均延时.error等.为了完成这些统计,可以实现一个多线程环境下的计 ...

  5. springboot整合三 共享session,集成springsession

    官网介绍 - spring:session:https://docs.spring.io/spring-session/docs/current/reference/html5/ 1. Mave依赖 ...

  6. 【转载】VMware虚拟机NAT模式网络配置图文教程

    原文:https://blog.csdn.net/dingguanyi/article/details/77829085 一.引言 在Windows上搭建集群实验环境时,为能够让集群结点之间相互通信, ...

  7. hive SQL 静态分区和 动态分区

    Hive 分区介绍: hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区(static partition) hive中创建分区表没 ...

  8. 国外优秀C/C++网站

    1.https://en.cppreference.com/w/ 2.https://www.geeksforgeeks.org/ 3.https://www.tutorialspoint.com/c ...

  9. 远程调试Android手机上网页的记录

    1.手机需要开启USB调试模式: 2.电脑和手机上都要安装最新的Chrome浏览器: 3.手机连接电脑,会出现下载安装驱动的提示并安装成功(并不是所有的手机都会这么顺利,比如我的魅族就无法安装驱动,公 ...

  10. Android设备真实DPI与系统标示DPI——ldpi/mdpi/hdpi/xhdpi/xxhdpi/xxxhdpi

    1.设备真实DPI与系统标示DPI 2.drawable允许的标示DPI值         drawable文件的合法名称如下: 3.如何验证         Demo如下,建立不同dpi的drawa ...