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. PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers

    微擎出错信息: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2054] Server s ...

  2. Zabbix 3.4过滤多余的windows网卡监控

    在服务器上安装了zabbix 3.4.14之后,zabbix自动发现规则Network interface discovery会自动发现windows服务器上的所有网卡信息,包括一大堆的虚拟网卡等等, ...

  3. matplotlib绘图不显示问题解决plt.show()

    最近在看<Python数据分析>这本书,而自己写代码一直用的是Pycharm,在练习的时候就碰到了plot()绘图不能显示出来的问题.网上翻了一下找到知乎上一篇回答,试了一下好像不行,而且 ...

  4. git 创建tag , 查看tag , 删除tag

    简介  用git了很久了,也喜欢这个版本控制工具,今天来分享下,怎么用命令创建tag,查看tag,删除tag和把本地tag推到远程git服务器上 C:\Users\\WandaPuHuiProject ...

  5. hive sql求多个字段的最小值和最大值的办法

    1. 准备数据表test2 create table test2( a int, b int, c int, d int, e int); 2. 准备2条数据 ,,,,); ,,,,); 查询显示如下 ...

  6. stl综合

    区别: List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]. Vector ...

  7. Java分布式集群,使用synchronized和Redis保证Job的原子性

    1.使用synchronized保证并发时,同时只会有一个请求执行该代码段: 2.在执行前先设置并获取Reids标记,先设置然后获取确保是否已经执行:SetOption.SET_IF_ABSENT 可 ...

  8. Java线程生命周期

    当你需要使用Java线程在多线程环境下进行编程时,理解Java的线程周期与线程的状态是非常重要的.通过实现Runnale接口或者继承Thread类,我们可以创建线程,为了启动一个线程,我们需要创建一个 ...

  9. 【ORACLE】SQL查询出每个组中的第一条记录

    CREATE TABLE [TestTable] ( ) NOT NULL , ) NOT NULL , ) ))) GO ALTER TABLE [TestTable] ADD PRIMARY KE ...

  10. Tensorflow Seq2seq attention decode解析

    tensorflow基于 Grammar as a Foreign Language实现,这篇论文给出的公式也比较清楚. 这里关注seq2seq.attention_decode函数, 主要输入 de ...