首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >已知三点求平面法向量

已知三点求平面法向量

作者头像
charlee44
发布于 2019-08-13 02:33:16
发布于 2019-08-13 02:33:16
3.6K00
代码可运行
举报
文章被收录于专栏:代码编写世界代码编写世界
运行总次数:0
代码可运行

空间已知三点的位置p1(x1,y1,z1),p2(x2,y2,z2),p3(x3,y3,z3),令它们逆时针在空间摆放。这样就可以得到平面的两个向量p1p2(x2-x1,y2-y1,z2-z1),p1p3(x3-x1,y3-y1,z3-z1),而平面法线总是和这两个向量垂直。也就是说,p1p2与p1p3的向量积就是平面的法向量n。

复习一下向量积,已知向量 a=(a1,a2,a3) b=(b1,b2,b3) 其向量积可表示为: a×b=(a2b3-a3b2,a3b1-a1b3,a1b2-a2b1)

将其套入到p1p2和p1p3即可。 具体实现代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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);
}

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 vn;
    Cal_Normal_3D(v1, v2, v3, vn);
    cout <<"法向量为:"<< vn.x << '\t' << vn.y << '\t' << vn.z << '\n';

    return 0;
}

对于一个空间的平面而言,其法向量可以是两个方向,可以向上也可以向下。所以在OpenGL中默认规定的也是右手法则,右手除拇指之外的四指根据点的逆时针握住,大拇指的方向即为法线方向。其逆时针的一面为正面,可以接受到光照;顺时针为反面,无法接受光照。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
已知空间三点组成的面求该面上某点的Z值
已知空间三点,那么可以就可以确定空间三点组成的平面。此时可以根据某一点的X值和Y值,来求取该点在平面上的Z值。这个过程对于求三角面片上某点的高程或者权值特别有用,其本身也可以看作一种线性插值。
charlee44
2020/01/02
8480
使用GDAL实现DEM的地貌晕渲图(一)
以前一直以为对DEM的渲染就是简单的根据DEM的高度不同赋予不同的颜色就可以。后来实际这么做的时候获取的效果跟别的软件相比,根本体现不出地形起伏的变化。如果要体现出地形的起伏变化,需要得到地貌晕渲图才行。晕渲法假设地形接受固定于某一位置光源的平行光线,随坡面与光源方向的夹角不同,产生不同色调明暗效果。 根据文献[1][2],可以通过计算DEM格网点的法向量与日照方向的的夹角,来确定该格网点的像素值。
charlee44
2019/08/13
1.2K0
平面中判断点在三角形内算法(同向法)
平面中判断点在三角形内外有很多中算法,文献1中提到了一种同向法,我认为是比较好的解法,兼顾了效率和可理解性。不过这个算法有两个要注意的地方。
charlee44
2021/06/10
1.4K0
已知空间两点组成的直线求线上某点的Z值
已知空间两点组成的直线求线上某点的Z值,为什么会有这种看起来比较奇怪的求值需求呢?因为真正三维空间的几何计算是比较麻烦的,很多时候需要投影到二维,再反推到三维空间上去。
charlee44
2020/01/02
1.2K0
OpenGL ES GLSL马赛克滤镜实现(3)
01 — 矩形马赛克滤镜GLSL 算法解析 片元着色器代码实现: precision mediump float; varying vec2 TextureCoordsVarying; unifor
CC老师
2019/07/30
1.3K0
OpenGLES(十)-GLSL案例:矩形、六边形、三角形马赛克OpenGLES(十)-GLSL案例:矩形、六边形、三角形马赛克
通过一个给定的六边形把原纹理分割成若干块(一般选择六边形的中心点的纹素)。原理和矩形马赛克是一样的,只是当前像素点隶属的六边形计算会有一些难度。
用户8893176
2021/08/09
9460
OpenGLES(十)-GLSL案例:矩形、六边形、三角形马赛克OpenGLES(十)-GLSL案例:矩形、六边形、三角形马赛克
格网DEM生成不规则三角网TIN
在GIS(地理信息科学)中,地形有两种表达方式,一种是格网DEM,一种是不规则三角网TIN。一般情况下规则格网DEM用的比较多,因为可以将高程当作像素,将其存储为图片类型的数据(例如.tif)。但是规则格网存储的数据量大,按规则取点,并不能最大程度的保证地形特征,所以很多情况下需要将其表达为不规则三角网,也就是TIN。
charlee44
2021/05/07
2.1K0
格网DEM生成不规则三角网TIN
空间射线与三角形相交算法的两种实现
任何复杂的三维模型都可以视作空间三角面片的集合,很容易碰到的一个问题就是空间射线与三角形相交的问题,例如拾取、遮蔽检测等。这里就总结下该问题的两种算法实现。
charlee44
2020/02/24
2.7K1
在两条直线相交处添加圆角,算法该如何实现?
然后基于圆心作两条直线的垂足得到两个点,这两个点就是圆弧起点和终点,然后确定方向就可以了。
前端西瓜哥
2024/06/17
3300
在两条直线相交处添加圆角,算法该如何实现?
[Silverlight动画]转向行为 - 2D向量
转向行为已经被各种语言实现过多次了,其最底层是用向量来描述的(也是最常见的实现方式)。 概括的看,一个向量由两部分组成:一个方向和一个大小。比如,一个运动中对象的速度由它要去哪里(方向)和移动快慢(大小)两部分组成。因此,把速度看作一 个向量是最贴切不过的。加速度——任何改变对象速度的作用力——同样也是由力的方向和大小组成(另一个向量)。向量同样也可以用来描述对象间的位置关系, 其中大小代表距离,方向代表角度。 向量还可以用来表示一个角色(脸)的朝向,这种情况下就只管方向,而忽视大小,也可以说大小等于1。这
用户1172164
2018/01/16
6340
空间中判断点在三角形内算法(方程法)
三维空间中判断点在三角形内外的算法与平面中有所不同,《平面中判断点在三角形内算法(同向法)》中提到的算法在三维空间中已经无法生效,也很难利用上。一个最简单的思路就是,获取三角形的空间向量方程,判断点是否能让这个空间向量方程成立。
charlee44
2021/06/10
1.8K0
运算符重载(看完这篇彻底掌握重载问题)
运算符重载:用同一个运算符完成不同的运算功能。 C++运算符重载的相关规定如下:
海盗船长
2020/08/27
9.9K1
CSS3与页面布局学习总结(七)——前端预处理技术(Less、Sass、CoffeeScript、TypeScript)
根据给定的文章内容,撰写摘要总结。
张果
2018/01/04
2.5K0
CSS3与页面布局学习总结(七)——前端预处理技术(Less、Sass、CoffeeScript、TypeScript)
基于均值坐标(Mean-Value Coordinates)的图像融合算法的优化实现
我在之前的文章《基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现》中,根据《Coordinates for Instant Image Cloning》这篇论文,详细论述了图像融合中泊松融合算法的优化算法——均值坐标(Mean-Value Coordinates)融合算法的具体实现。其实在这篇论文中,还提出了两种优化实现,能够进一步提升效率,这里就论述一下其优化算法的具体实现。
charlee44
2020/03/21
1.2K0
大学生数学竞赛非数专题四(5)
专题四 多元函数积分学 (5) 4.5 曲线积分的计算 ---- 4.14 (江苏省2016年竞赛题) 设 \varGamma 为曲线 y=2^x+1 上从点 A(0,2) 到点 B(1,3) 的一段弧,试着求曲线积分 \displaystyle \int_{\varGamma}e^{xy}(1+xy)dx+e^{xy}x^2dy 【解析】:可以采用曲线积分与路径无关或者直接计算法 【法一】:记 P=e^{xy}(1+xy) , Q=e^{xy}x^2 , \dfrac{\partial Q}{\par
用户9628320
2022/11/14
4550
大学生非数竞赛专题四 (5)
非数专题四 多元函数积分学 (5) 4.5 曲线积分的计算 4.14 (江苏省2016年竞赛题) 设 \varGamma 为曲线 y=2^x+1 上从点 A(0,2) 到点 B(1,3) 的一段弧,试着求曲线积分 \displaystyle \int_{\varGamma}e^{xy}(1+xy)dx+e^{xy}x^2dy 【解析】:可以采用曲线积分与路径无关或者直接计算法 【法一】:记 P=e^{xy}(1+xy0) , Q=e^{xy}x^2 , \dfrac{\partial Q}{\parti
用户9628320
2022/11/23
4800
【Unity面试篇】Unity 面试题总结甄选 |算法相关 | ❤️持续更新❤️
进阶答案 检测数字的二进制最低位是否为0。将最低位和1相与,如果结果为0,则为偶数,否则为奇数。
呆呆敲代码的小Y
2023/07/24
1K0
【Unity面试篇】Unity 面试题总结甄选 |算法相关 | ❤️持续更新❤️
当InternalsVisibleToAttribute特性遭遇"强签名"
一、如何让Intenal成员暴露给另一个程序集 我们知道Modifier为Internal的类型成员仅限于当前程序集能够访问,但是在某些情况下,我们希望将它们暴露给另一个程序集。比较典型的应用场景包括如下两种: 将一个组件或者模块定义成两个或者两个以上程序集,一个程序集需要访问另一个程序集的Internal成员。比如将一个Logging组件定义成三个程序集:Logging.dll、Logging.Client.dll和Logging.Server.dll。其中后两个分别用于客户端和服务端的日志记录,而它们共
蒋金楠
2018/01/16
6910
当InternalsVisibleToAttribute特性遭遇"强签名"
unity3d 第三人称视角摄像机(线性锁视域)
private const float radian = Mathf.PI / 180.0f; //1弧度的浮点数
用户5875740
2019/07/22
1.4K0
4.6平面上的分治法(1)
利用分治后左平面和右平面的最小d来限制第二种情况的查询,绝了。关于第二种情形的算法采用平面扫描法,但前提y需要排序。
用户1147447
2019/05/26
3550
推荐阅读
相关推荐
已知空间三点组成的面求该面上某点的Z值
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档