已知空间三点组成的面求该面上某点的Z值
已知空间三点,那么可以就可以确定空间三点组成的平面。此时可以根据某一点的X值和Y值,来求取该点在平面上的Z值。这个过程对于求三角面片上某点的高程或者权值特别有用,其本身也可以看作一种线性插值。
其算法思路也特别简单,首先算出其三点组成的平面法向量(可参看《已知三点求平面法向量》);然后根据平面法向量\(n=(A,B,C)\)和平面上某点\(m=(x0,y0,z0)\),有平面的点法式方程:
\]
最后根据欲求点的X、Y值,代入公式解算Z值即可。
具体实现代码如下:
#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;
}
};
//计算三点成面的法向量
void Cal_Normal_3D(const Vec3d& v1, const Vec3d& v2, const Vec3d& v3, Vec3d &vn)
{
//v1(n1,n2,n3);
//平面方程: na * (x – n1) + nb * (y – n2) + nc * (z – n3) = 0 ;
double na = (v2.y - v1.y)*(v3.z - v1.z) - (v2.z - v1.z)*(v3.y - v1.y);
double nb = (v2.z - v1.z)*(v3.x - v1.x) - (v2.x - v1.x)*(v3.z - v1.z);
double nc = (v2.x - v1.x)*(v3.y - v1.y) - (v2.y - v1.y)*(v3.x - v1.x);
//平面法向量
vn.Set(na, nb, nc);
}
void CalPlanePointZ(const Vec3d& v1, const Vec3d& v2, const Vec3d& v3, Vec3d& vp)
{
Vec3d vn;
Cal_Normal_3D(v1, v2, v3, vn);
if (vn.z != 0) //如果平面平行Z轴
{
vp.z = v1.z - (vn.x * (vp.x - v1.x) + vn.y * (vp.y - v1.y)) / vn.z; //点法式求解
}
}
int main()
{
Vec3d v1(1.0, 5.2, 3.7);
Vec3d v2(2.8, 3.9, 4.5);
Vec3d v3(7.6, 8.4, 6.2);
Vec3d vp;
vp.x = 5.6;
vp.y = 6.4;
vp.z = 0.0;
CalPlanePointZ(v1, v2, v3, vp);
return 0;
}
已知空间三点组成的面求该面上某点的Z值的更多相关文章
- 已知空间三个点,解算外接圆圆心坐标,C++编程实现
struct PT3 { double x, y, z; }; int solveCenterPointOfCircle(std::vector<PT3> pt, double cente ...
- 已知空间两点组成的直线求线上某点的Z值
已知空间两点组成的直线求线上某点的Z值,为什么会有这种看起来比较奇怪的求值需求呢?因为真正三维空间的几何计算是比较麻烦的,很多时候需要投影到二维,再反推到三维空间上去. 复习下空间直线方程:已知空间上 ...
- C语言:已知三角形三边长求面积
//已知三角形三边长求面积 #include <stdio.h> #include <math.h> int main() { float a,b,c,p,s; int x=0 ...
- 【C语言】已知三角形三边长,求三角形面积
一. 数学基础: 已知三角形的三边,计算三角形面积,需要用到海伦公式: 即p=(a+b+c)/2 二. 算法: 输入三个边长,套用海伦公式计算面积,并输出. 可以先判断是否可以构成三角形,即任意两边之 ...
- 已知ip地址和其子网掩码如何求网络号子网号主机号
已知ip地址为10.130.89.95,其子网掩码为255.255.255.224,求其网络号.子网号和主机号. 要看子网掩码变长在第几节,255.255.255.224是在第四节借了位 把224转换 ...
- golang实现已知三角形三点坐标,求三角形面积
代码如下: func GetTriangleAreaByVector(x vector.Vector3,y vector.Vector3,z vector.Vector3) float64 { //根 ...
- DS Tree 已知先序、中序 => 建树 => 求后序
参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...
- DS实验题 Order 已知父节点和中序遍历求前、后序
题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...
- 已知某一天是周几 求给定的一天是周几的算法 C++实现
#include<iostream> using namespace std; struct Date{ int year,month,day; }; enum Week{ MON=, T ...
随机推荐
- socketserver模块(实现并发)
socketserver模块(实现并发) 一.基于UDP协议实现的并发 # 服务端 import socketserver class MyServer(socketserver.BaseReques ...
- Java面向对象private
1. 类 package cn.itcast.day06.demo03; /* 对于基本类型当中的boolean值,Getter方法一定要写成isXxx的形式,而setXxx规则不变. */ publ ...
- 【前端之BOM和DOM】
" 目录 #. window对象介绍 #. window子对象 1. 浏览器对象 navigator 2. 屏幕对象 screen 3. 历史 history 4. 地址(URL) loc ...
- 关于 checkbox 的一些操作
获取checkbox选中的状态 $("#checkbox").is(":checked"); 设置 checkbox 的状态 $("#checkbox ...
- django登陆界面报错InternalError at /admin/polls/question/add/
登陆界面报错信息如下: 改为输入英文,正确
- Java AQS 的胡言乱语修正版
前言 适合读者:3 年以上经验的同学 谈到并发编程,基本上都会想到JDK 的 JUC 工具包,它包含 锁,并发工具类,原子类,线程池,还有阻塞队列,这是从网上找的一个大致的知识体系. 相信这些工具读者 ...
- Druid数据源SQL数据库与Spring监控
Druid监控概要说明 为什么要监控? Druid是什么?德鲁伊 URL监控配置说明 配置步骤 步骤 配置 第一步 web.xml 配置 WebStatFilter 第二步 WebStatFilter ...
- idea开发web项目${pageContext.request.contextPath}无法转义
web-app版本问题,我的web.xml中头文件的配置是: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web ...
- webpack-bundle-analyzer插件的使用方式
第一步: npm install --save-dev webpack-bundle-analyzer 第二步: 在build/webpack.prod.config.js中的module.expor ...
- cssdiv设置高宽百分比不起作用的问题
div等元素设置宽高百分比都是基于包含他的块级对象的百分比高度,所以必须先设置包含它的块级对象高度与宽度,但是光设置body是不起作用的,必须同时设置html和body. 要使用百分比设置div宽 ...