栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3608 Signal Detection

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3608 Signal Detection

#include <cstdlib>#include <cstdio>#include <cstring>#include <cmath>#include <iostream>#include <algorithm>#include <string>#include <vector>#include <set>#include <map>#include <queue>#include <time.h>using namespace std;typedef long long llong;inline int bit(int x, int i){ return (x>>i) & 1;}inline int setb(int x, int i){ return x | (1 << i);}inline int clrb(int x, int i){ return x & (~(1 << i));}inline int lowb(int x){return x & (-x);}const double eps = 1e-9;struct Point{double x, y, z;Point(){}Point(double x, double y, double z):x(x), y(y), z(z){}double len(){return sqrt(x * x + y * y + z * z);}Point shrink(double l = 1.0){double s = l / len();return Point(x * s, y * s, z * s);}void input(){scanf("%lf %lf %lf", &x, &y, &z);}};Point operator +(const Point &p, const Point &q){return Point(p.x + q.x, p.y + q.y, p.z + q.z);}Point operator -(const Point &p, const Point &q){return Point(p.x - q.x, p.y - q.y, p.z - q.z);}Point operator *(const Point &p, const double &s){return Point(p.x * s, p.y * s, p.z * s);}Point operator *(const Point &p, const Point &q){return Point(p.y * q.z - p.z * q.y, p.z * q.x - p.x * q.z, p.x * q.y - p.y * q.x);}double operator &(const Point &p, const Point &q){return p.x * q.x + p.y * q.y + p.z * q.z;}Point p, q, v[8];double r;int face[][4] ={{3, 2, 1, 0},{4, 5, 6, 7},{0, 1, 5, 4},{2, 3, 7, 6},{1, 2, 6, 5},{0, 4, 7, 3},};Point fn[6];double fb[6];double inter(const Point &p, const Point &d, const Point &n, double b){return (b - (n & p)) / (n & d);}bool collide(double R){int hf = -1;double ht;Point d = (q - p);for(int i = 0;i < 6; ++i){if(fabs(fn[i] & d) < eps) continue;double t = inter(p, d, fn[i], fb[i]);if(t <= eps) continue;Point hit = p + d * t;bool ok = true;for(int j = 0;j < 4; ++j){if((((v[face[i][j]]-hit) * (v[face[i][(j + 1)%4]] - hit)) & fn[i]) <= 0) ok = false;}if(ok && (hf < 0 || t < ht)){hf = i;ht = t;}}if(hf < 0) return false;Point hit = p + d * ht;Point vx = fn[hf].shrink();if(fabs((vx * d).len()) < eps){p = hit;q = hit + d;return true;}double dx = vx & d;if(dx < 0) vx = vx * -1, dx = -dx;Point vy = ((vx * d) * vx).shrink();double dy = vy & d;if(dy < 0) vy = vy * -1, dy = -dy;double theta0 = atan2(dy, dx);double theta = asin(sin(theta0) / R);d = vx * cos(theta) + vy * sin(theta);p = hit;q = hit + d;return true;}int main(){int TT;scanf("%d", &TT);for(int cas = 1; cas <= TT; ++cas){p.input();q.input();v[0].input();v[1].input();v[3].input();v[2] = v[1] + v[3] - v[0];v[4].input();v[5] = v[4] + v[1] - v[0];v[6] = v[4] + v[2] - v[0];v[7] = v[4] + v[3] - v[0];scanf("%lf", &r);for(int i = 0;i < 6; ++i){fn[i] = (v[face[i][1]] - v[face[i][0]]) * (v[face[i][3]] - v[face[i][0]]);fb[i] = fn[i] & v[face[i][0]];}if(collide(r)){collide(1./r);}Point norm(0, 0, 1);Point dir = q - p;if(fabs(norm & dir) < eps) puts("Error");else{double t = inter(p, dir, norm, 0);if(t < 0) puts("Error");else{Point hit = p + dir * t;printf("%.3f %.3fn", hit.x, hit.y);}}}return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/371593.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号