已知空间两点组成的直线求线上某点的Z值,为什么会有这种看起来比较奇怪的求值需求呢?因为真正三维空间的几何计算是比较麻烦的,很多时候需要投影到二维,再反推到三维空间上去。

复习下空间直线方程:已知空间上一点\(M0(x0,y0,z0)\)和方向向量\(S(m,n,p)\),则直线方程的点向式为:

\[\frac{X-x0}{m}=\frac{Y-y0}{n}=\frac{Z-z0}{p}
\]

根据该公式可以解决该计算几何问题,具体实现代码如下:

#include<iostream>

using namespace std;

//三维double矢量
struct Vec3d
{
double x, y, z; Vec3d()
{
x = 0.0;
y = 0.0;
z = 0.0;
}
Vec3d(double dx, double dy, double dz)
{
x = dx;
y = dy;
z = dz;
}
void Set(double dx, double dy, double dz)
{
x = dx;
y = dy;
z = dz;
}
}; bool CalLinePointZ(const Vec3d & v1, const Vec3d & v2, Vec3d & vp)
{
const double eps = 0.0000001; //方向向量
Vec3d s(v2.x-v1.x, v2.y - v1.y, v2.z - v1.z); //此时无法求值
if (abs(s.x) == eps && abs(s.y) == eps)
{
return false;
} double t = 0;
if (abs(s.x) > eps && abs(s.y) == eps)
{
double t = (vp.x - v1.x) / s.x;
}
else if (abs(s.x) == eps && abs(s.y) > eps)
{
double t = (vp.y - v1.y) / s.y;
}
else
{
double tx = (vp.x - v1.x) / s.x;
double ty = (vp.y - v1.y) / s.y; //说明点不可能在直线上
if (abs(tx - ty) > eps)
{
return false;
}
t = tx;
} vp.z = t * s.z + v1.z;
return true;
} int main()
{
Vec3d v1(0.0, 0.0, 3.7);
Vec3d v2(5.0, 5.0, 4.5); Vec3d vp;
vp.x = 4.6;
vp.y = 4.6;
vp.z = 0.0; if (CalLinePointZ(v1, v2, vp))
{
cout << "该点的高程:" << vp.z << endl;
} return 0;
}

注意根据方向向量的值做特殊情况判断,当直线的方向向量\(S(m,n,p)\)的\(m=n=0\)时,是无法正确求值的。

已知空间两点组成的直线求线上某点的Z值的更多相关文章

  1. 已知空间三点组成的面求该面上某点的Z值

    已知空间三点,那么可以就可以确定空间三点组成的平面.此时可以根据某一点的X值和Y值,来求取该点在平面上的Z值.这个过程对于求三角面片上某点的高程或者权值特别有用,其本身也可以看作一种线性插值. 其算法 ...

  2. 已知三角形ABC为锐角三角形,求 sinA + sinB·sin(C/2) 的最大值。

    已知三角形ABC为锐角三角形,求 sinA + sinBsin(C/2) 的最大值. 解:Δ := sinA + sinB·sin(C/2) = sin(B+C) + sinB·sin(C/2) = ...

  3. poj 2002(好题 链式hash+已知正方形两点求另外两点)

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 18493   Accepted: 7124 Descript ...

  4. 计算机网络-已知IP地址和子网掩码,求广播地址

    首先说结论--广播地址=该IP所在的下一跳-1 例题: 已知IP地址是192.72.20.111,子网掩码是255.255.255.224,求广播地址 要知道下一跳就需要先求出网段间隔,网段间隔=25 ...

  5. PAT A1020——已知后序中序遍历求层序遍历

    1020 Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Give ...

  6. golang实现已知三角形三点坐标,求三角形面积

    代码如下: func GetTriangleAreaByVector(x vector.Vector3,y vector.Vector3,z vector.Vector3) float64 { //根 ...

  7. 已知空间三个点,解算外接圆圆心坐标,C++编程实现

    struct PT3 { double x, y, z; }; int solveCenterPointOfCircle(std::vector<PT3> pt, double cente ...

  8. 已知一个日期和天数, 求多少天后的日期(是那个超时代码的AC版)

    #include <stdio.h> #include <string.h> ; int judge_year(int x) { == || x % == && ...

  9. Benefit UVA - 11889(已知LCM和其中一个数,求另一个数)

    首先对于C不能整除A的状况肯定排除 然后得到B=C/A 然后取G=GCD(A,B) 如果G==1,那么此时B就是解 否则的话,就证明A,B,的最小公倍数肯定不是C,因为其最小公倍数是A*B/G 那么我 ...

随机推荐

  1. 吴裕雄 python 机器学习——人工神经网络与原始感知机模型

    import numpy as np from matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D from ...

  2. 发现一个比较好玩的,git的仓库可以转换

    我们通过 git clone 下载一个仓库到本地, 1.这个本地的文件夹名字可以随便改. 2.如果你把本地仓库的全部文件,剪切到另一个文件夹内,这个新的文件夹就是git的本地仓库.

  3. 安装rpm包时提示错误:依赖检测失败的解决方法

    安装rpm包时提示错误:依赖检测失败 解决方法: 命令末尾加上--nodeps --force

  4. HTML-based script和URL-based script使用规则

     选择哪种模式应该根据实际需要来进行,下面是一些常见的参考原则: 1.基于浏览器的应用程序推荐使用HTML-based script 2.不是基于浏览器的应用程序推荐使用URL-based scrip ...

  5. Abaqus中的单位制

    量纲 SI SI/mm US/ft US/inct 长度 m mm ft in 载荷 N N lbf lbf 质量 kg kg3 slug lbfs2/in 时间 s s s s 量纲 SI SI/m ...

  6. Android9 http网络请求的问题

    Google表示,为保证用户数据和设备的安全,针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的 ...

  7. Java面向对象编程 -6

    数组的基本概念 数组的本质:一组相关变量的集合. 但是需要注意的一点是:在java里面讲数组定义为了引用数据类型,所以数组的使用一定要牵扯到内存分配,那么首先一定要想到使用关键字new来处理 数组的定 ...

  8. 【struts 报错】 No action config found for the specified url

    1 type Exception report message org.apache.struts.chain.commands.InvalidPathException: No action con ...

  9. Java 枚举(enum)的学习

    Java 枚举(enum)的学习 本文转自:https://blog.csdn.net/javazejian/article/details/71333103 枚举的定义 在定义枚举类型时我们使用的关 ...

  10. go语言快速入门教程

    go快速入门指南 by 小强,2019-06-13 go语言是目前非常火热的语言,广泛应用于服务器端,云计算,kubernetes容器编排等领域.它是一种开源的编译型程序设计语言,支持并发.垃圾回收机 ...