已知空间两点组成的直线求线上某点的Z值,为什么会有这种看起来比较奇怪的求值需求呢?因为真正三维空间的几何计算是比较麻烦的,很多时候需要投影到二维,再反推到三维空间上去。
复习下空间直线方程:已知空间上一点\(M0(x0,y0,z0)\)和方向向量\(S(m,n,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值的更多相关文章
-
已知空间三点组成的面求该面上某点的Z值
已知空间三点,那么可以就可以确定空间三点组成的平面.此时可以根据某一点的X值和Y值,来求取该点在平面上的Z值.这个过程对于求三角面片上某点的高程或者权值特别有用,其本身也可以看作一种线性插值. 其算法 ...
-
已知三角形ABC为锐角三角形,求 sinA + sinB&#183;sin(C/2) 的最大值。
已知三角形ABC为锐角三角形,求 sinA + sinBsin(C/2) 的最大值. 解:Δ := sinA + sinB·sin(C/2) = sin(B+C) + sinB·sin(C/2) = ...
-
poj 2002(好题 链式hash+已知正方形两点求另外两点)
Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 18493 Accepted: 7124 Descript ...
-
计算机网络-已知IP地址和子网掩码,求广播地址
首先说结论--广播地址=该IP所在的下一跳-1 例题: 已知IP地址是192.72.20.111,子网掩码是255.255.255.224,求广播地址 要知道下一跳就需要先求出网段间隔,网段间隔=25 ...
-
PAT A1020——已知后序中序遍历求层序遍历
1020 Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Give ...
-
golang实现已知三角形三点坐标,求三角形面积
代码如下: func GetTriangleAreaByVector(x vector.Vector3,y vector.Vector3,z vector.Vector3) float64 { //根 ...
-
已知空间三个点,解算外接圆圆心坐标,C++编程实现
struct PT3 { double x, y, z; }; int solveCenterPointOfCircle(std::vector<PT3> pt, double cente ...
-
已知一个日期和天数, 求多少天后的日期(是那个超时代码的AC版)
#include <stdio.h> #include <string.h> ; int judge_year(int x) { == || x % == && ...
-
Benefit UVA - 11889(已知LCM和其中一个数,求另一个数)
首先对于C不能整除A的状况肯定排除 然后得到B=C/A 然后取G=GCD(A,B) 如果G==1,那么此时B就是解 否则的话,就证明A,B,的最小公倍数肯定不是C,因为其最小公倍数是A*B/G 那么我 ...
随机推荐
-
post请求报文
POST /02_WEB_HTTP/index.html HTTP/1.1 Accept: application/x-ms-application, image/jpeg, application/ ...
-
在SQLite Expert上用日期类型字段作为条件查询时注意日期的格式化
经验之谈: 情况一:没有查询结果 and R_CheckInTime > '2015-7-12 18:47:00' and R_CheckInTime < '2015-7-18 18:48 ...
-
【软件使用】TortoiseSVN版本管理软件使用简单说明
TortoiseSVN版本管理软件使用简单说明 很多时候在写一个小的项目不想使用github等工具,只想简单在本地搭建一个版本管理器.那么TortoiseSVN就非常适合. 第一步:下载Tortois ...
-
hdu1054Strategic Game(树形DP)
链接 归属简单树形DP 挺简单的 跟第一道一样 就是我跑偏了题意..以为要覆盖点 纠结啊 推了N久 推不出啊 然后就郁闷了 打了局游戏 边想边打 实在想不出 看下题解 跑偏了 分两种情况D 方程见代码 ...
-
无聊写了一个最简单的MVC4+Highcharts连数据库例子
乱搞了个数据库 后面发现没定INT类型 直接将ID当数据显示了 效果图: 前端 @{ Layout = null; } <!DOCTYPE html> <html> <h ...
-
ASP.NET 2.0 页(Page)生命周期概述
原文:ASP.NET 2.0 页(Page)生命周期概述 引用MSDNASP.NET 页生命周期概述 ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤.这些步骤包括初 ...
-
hadoop 完全分布式
转自:http://blog.itpub.net/26613085/viewspace-1219710/ 1.JDK安装和SSH互信(略过) 2.各节点IP和hostname如下(各节点需配置) [h ...
-
HDU [P3605] Escape
二分图多重匹配 改进版的匈牙利,加入了一个cnt数组作为找到增广路的标志 本题有一个重要的优化见注释 #include <iostream> #include <cstdio> ...
-
hook 9大类
HOOK技术主要分为两大类,一是内核层HOOK,一是用户层HOOK. 用户层HOOK也就是在ring3环境下hook kenerl32.dll.User3.dll.Gui32.dll.Advapi.d ...
-
【招聘】这一次,我们Hold住了世界杯
作为国内最大的云计算服务商,阿里云在视频领域拥有绝对的技术优势,全球范围内拥有1500多个CDN节点,带宽储备120多T,不仅为优酷.CNTV.CCTV5提供技术支撑,还承担了全网70%的世界杯流量. ...