HDU4741

news/2024/12/22 21:05:42/

额有必要写写了~

公式啊。

两条直线:

构造方程:


求出公垂线向量:


记公垂线和l1形成的平面为alpha,下面求它:


令:


联立:


不难得到如下代码:

#include <iostream>
#include <math.h>
#include <iomanip>
#include <algorithm>

#define eps 1e-8
#define zero(x) (((x)>0?(x):-(x))<eps)

struct point3{ double x, y, z; };
struct line3{ point3 a, b; };
struct plane3{ point3 a, b, c; };

using namespace std;

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;
}
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;
}
double dmult(point3 u, point3 v)
{
    return u.x*v.x + u.y*v.y + u.z*v.z;
}
double vlen(point3 p)
{
    return sqrt(p.x*p.x + p.y*p.y + p.z*p.z);
}
double linetoline(line3 u, line3 v)
{
    point3 n = xmult(subt(u.a, u.b), subt(v.a, v.b));
    return fabs(dmult(subt(u.a, v.a), n)) / vlen(n);
}
double linetoline(point3 u1, point3 u2, point3 v1, point3 v2)
{
    point3 n = xmult(subt(u1, u2), subt(v1, v2));
    return fabs(dmult(subt(u1, v1), n)) / vlen(n);
}
int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        point3 a, b, c, d;
        cin >> c.x >> c.y >> c.z >> d.x >> d.y >> d.z >> a.x >> a.y >> a.z >> b.x >> b.y >> b.z;
        cout << fixed << setprecision(6) << linetoline(a, b, c, d) << endl;

        double H = b.x - a.x, I = b.y - a.y, J = b.z - a.z;
        double K = d.x - c.x, L = d.y - c.y, M = d.z - c.z;
        double N = H * I * L - I * I * K - J * J * K + H * J * M;
        double O = H * H * L - H * I * K - I * J * M + J * J * L;
        double P = H * J * K - H * H * M - I * I * M + I *J * L;
        double Q = -a.x * N + a.y * O - a.z * P;
        double k = (O * c.y - N * c.x - P * c.z - Q) / (N * K - O * L + P * M);
        cout << fixed << setprecision(6) << K * k + c.x << ' ' << L * k + c.y << ' ' << M * k + c.z << ' ';
        swap(a, c);
        swap(b, d);
        H = b.x - a.x, I = b.y - a.y, J = b.z - a.z;
        K = d.x - c.x, L = d.y - c.y, M = d.z - c.z;
        N = H * I * L - I * I * K - J * J * K + H * J * M;
        O = H * H * L - H * I * K - I * J * M + J * J * L;
        P = H * J * K - H * H * M - I * I * M + I *J * L;
        Q = -a.x * N + a.y * O - a.z * P;
        k = (O * c.y - N * c.x - P * c.z - Q) / (N * K - O * L + P * M);
        cout << fixed << setprecision(6) << K * k + c.x << ' ' << L * k + c.y << ' ' << M * k + c.z << endl;
    }
}


http://www.ppmy.cn/news/124700.html

相关文章

在 Arch Linux 上使用 Docker 运行 Mac OS - Catalina

背景介绍 MacOS默认不对其他电脑平台发布&#xff0c;在 Apple 目前的战略中不把 os 作为可交易的商品&#xff0c;而是一种卖硬件附送的高价值软件。因此对于非 A 家的设备&#xff0c;想要整个 Mac OS 就需要自己想办法了&#xff0c;黑苹果的驱动问题不太好解决 -.- 个人已…

hdu 4747

这题思路有点纠结啊啊啊啊啊&#xff01;&#xff01;&#xff01; 类似于今年多校的线段数&#xff0c;多校的时候是固定左端点&#xff0c;此处是固定右端点。。。这类题还是要多想想维护啊。。。。 考虑一组数&#xff0c;那么最小的肯定是0,1,2...递增的数&#xff0c;那…

朗润国际期货:茶饮争霸赛,你最爱喝哪个?

茶饮争霸赛&#xff0c;你最爱喝哪个&#xff1f; 蜜雪冰城&#xff1a;全国22503个门店&#xff0c;人均消费8.85元瑞幸咖啡&#xff1a;全国7480个门店&#xff0c;人均消费19.34元西巴克&#xff1a;全国6706个门店&#xff0c;人均消费39.59元古茗&#xff1a;全国6688个门…

HDU 4741

题目 求异面直线的间的最短距离&#xff0c;并且求出最短距离的线段在两直线上的点。比赛时&#xff0c;在网上找了个资料&#xff0c;需要解个二元一次的方程&#xff0c;估计自己写龊了&#xff0c;奇葩数据&#xff0c;总会出现误差。 后来重新找了个&#xff0c;在这 先求…

Hdu 4715

打素数表&#xff0c;分类讨论 给出一个偶数n&#xff0c;有这样两个素数a和b&#xff0c;使得na-b&#xff0c;要求ab最小。分三类&#xff1a;1. n0&#xff1b; 2. n<0&#xff1b; 3. n>0. AC代码&#xff1a; #include <cstdio> #include <cstdlib> #in…

HDU4715

思路&#xff1a; 1.不存在输出FAIL的情况 2.素数打表 实现判断素数 和 查找第i个素数 3.二分查找素数表&#xff0c;从比x大的下一个素数now开始&#xff0c;判断这now-n是否素数 /*Code By Aquariuslt*/ /*HDU 4715 Difference Between Primes*/ #include<iostream>…

14443-4

14443-4 传输协议激活 RATS-Request for answer to select 第3节14443-3中&#xff0c;当PCD发出选择命令之后&#xff0c;卡片返回SAK&#xff0c;指示PICC是否支持14443-4。 如果PICC支持14443-4&#xff0c;并且PCD需要进入14443-4层&#xff0c;进行协议层的数据传输&…

HDU 4745 Two Rabbits(非连续最长回文子序列,区间DP)

HDU 4745 Two Rabbits(非连续最长回文子序列&#xff0c;区间DP) HDU 4745 Two Rabbits 题目地址 题意&#xff1a; 两只兔子&#xff0c;在n块围成一个环形的石头上跳跃&#xff0c;每块石头有一个权值ai&#xff0c;一只从左往右跳&#xff0c;一只从右往左跳&#xff0c;每跳…