一个平面通常是由一个平面法线向量,如v1(1,2,3),和点到原点(0,0,0)到平面的距离确定的。
当然数学中还有其他定义方法,但是DirectX和OpenGL都是使用这种定义方法的。这样定义的平面叫一般平面,其实是由点法式平面变形来的。
点我们可以使用Vector3类来确定,这个类既可以确定点,也可以确定向量。
Vector3这个类定义:http://blog.csdn.net/kenden23/article/details/16901331
下面定义一个平面:
class Plane
{
public:
float a, b, c, d;
enum PLAN_STATES
{
PLANT_FRONT,
PLANT_BACK,
PLANT_ON_PLANE
};
Plane():a(0), b(0), c(0), d(0){}
Plane(float a1, float b1, float c1, float d1):a(a1), b(b1), c(c1), d(d1){}
void createPlane(Vector3 v1, Vector3 v2, Vector3 v3);
float distance(float x, float y, float z);
float distance(Vector3 v);
PLAN_STATES classifyPoint(float x, float y, float z, float &dist);
};
CreatePlane函数是用三个点确定一个平面,并计算成一般平面,存储好。classfyPoint这个函数就是用来计算点和平面的关系的。
实现代码:
void Plane::createPlane(Vector3 v1, Vector3 v2, Vector3 v3)
{
Vector3 t1, t2, n;
t1 = v2 - v1;
t2 = v3 - v1;
n = t1.crossProduct(t2);
n.normalize();
a = n.x;
b = n.y;
c = n.z;
d = -(a*v1.x + b*v1.y + c*v1.z);
}
float Plane::distance(float x, float y, float z)
{
return a*x+b*y+c*z+d;
}
float Plane::distance(Vector3 v)
{
return a*v.x+b*v.y+c*v.z+d;
}
//Claaisyf a point's position about the plane
Plane::PLAN_STATES Plane::classifyPoint(float x, float y, float z, float &dist)
{
dist = distance(x,y,z);
if (dist > uZero)
{
return PLANT_FRONT;
}
if (dist < -uZero)
{
return PLANT_BACK;
}
return PLANT_ON_PLANE;
}
以平面的法向量为标准,如果在法向量正方向,那么就是在平面前面,如果在法向量反方向就是在平面后面,在Vector3文件中定义了个uZero = 1e-6 (=0.000001);如果距离少于uZero,那么就是在平面上。因为浮点数是有误差的,所以最好不用0作为比较。
测试代码:
#include<iostream>
#include"Plane.h"
using namespace std;
int main()
{
Plane p1;
Vector3 v1(1.0f, 0.0f, 0.0f);
Vector3 v2(0.0f, 1.0f, 0.0f);
Vector3 v3(0.0f, 0.0f, 1.0f);
p1.createPlane(v1, v2, v3);
cout<<"We have create a plane:\n";
cout<<"Plane's a = "<<p1.a<<endl;
cout<<"Plane's b = "<<p1.b<<endl;
cout<<"Plane's c = "<<p1.c<<endl;
cout<<"Plane's d = "<<p1.d<<endl;
cout<<"v1 to Plane's distance is: "<<p1.distance(v1)<<endl;
Vector3 v4(8.0f, 8.0f, 8.0f);
cout<<"Vector3 v4 is: ";
v4.printVec3();
cout<<"v4's relationship with plane is: ";
float dist = 0;
switch (p1.classifyPoint(v4.x, v4.y, v4.z, dist))
{
case Plane::PLANT_BACK:
cout<<"on the back of the plane.\n";
break;
case Plane::PLANT_FRONT:
cout<<"on the front of the plane.\n";
break;
case Plane::PLANT_ON_PLANE:
cout<<"right on the plane\n";
break;
default:
break;
}
cout<<"v4 to plane's distance is: "<<dist<<endl;
system("pause");
return 0;
}
运行结果:
分享到:
相关推荐
2. 求点到线段所在直线垂线的垂足 4 3. 点到线段的最近点 4 4. 点到线段所在直线的距离 4 5. 点到折线集的最近距离 4 6. 判断圆是否在多边形内 5 7. 求矢量夹角余弦 5 8. 求线段之间的夹角 5 9. 判断线段是否...
C++语言实现一些基本算法(两点距离、点是否在直线上、点与直线的关系、两直线的夹角、两直线的交点、两个举行的重合面积等等)
1.建立三个类,点、线、面。 2.在线和面的输入时,不同方式进行建立完成时,进行标准式进行标准化 3 运用数学知识进行进行线面关系,线线关系等关系的计算 4运用数学知识进行距离的计算。
各种三维变换算法,包括:几何变换:平移、旋转、变比、对称、错切。投影变换:平行投影(三视图、正轴测图、斜轴测图)、透视图。
算法主要利用向量的叉积判断点和线段的位置关系,详见 向量叉积,然后从左下角点按逆时针方向寻找最边缘的线段,利用的原理就是从凸包上任意一点逆时针出发,每到一个节点,一定会向左拐.资源包包含完整的代码实现,部分...
主要介绍了C++/STL实现判断平面内两条线段的位置关系代码示例,具有一定参考价值,需要的朋友可以了解下。
1.按照下图给出的层次关系来定义类。 2.所有形状支持无参数构造,有参数构造,拷贝构造,析构。 3.所有形状支持平移操作,需要重载 operator+。 4.所有形状(除去无意义的),均支持计算周长。 5.所有形状(除去无...
二维计算几何整合而成的一个库,涵盖了点线面圆之间的各种关系求解,一般计算几何问题直接调用函数就可以解决,每个函数都有功能注释。
判断一个点在三角形内,通过矢量的叉积判断一个点是不是在三角形内,判断准确
C++实验报告,为最终版本 1) 下面是“平面上点”类的定义: class CPoint { private: int x, y; static int nCount; // nCount用于保存点的个数 public: CPoint(int px=0, int py=0); CPoint(CPoint&); ~...
给定一个二维点,判断该点是否在二维多边形中
Pillow 是一个用 C++ 从头开始构建的 3D 软件渲染引擎。 它故意不使用API(不使用opengl / directx / vulkan等)或库来渲染图形。 因此,所有计算和算法都是从头开始实现的。 这样做是为了学习目的和个人...
1) 下面是“平面上点”类的定义: class CPoint { private: int x, y; static int nCount; // nCount用于保存点的个数 public: CPoint(int px=0, int py=0); CPoint(CPoint&); ~CPoint(); int GetX(); int ...
基于无限小平面的姿态估计 (IPPE):一种使用 4 个或更多点对应关系从平面物体的单个图像计算相机姿态的非常快速和准确的方法。 这已用于多种应用,包括增强现实、3D 跟踪和使用平面标记的姿势估计以及 3D 场景理解。...
{/*用path[][]记录从i到j的最短路径上点j的前驱景点的序号*/ shortest[j]=shortest[k]+shortest[k][j]; path[j]=k; path[j]=k; display(int i,int j)函数:打印两个景点之间的最短路径。 if(shortest[j]!=INT_...
这些约束极大地减少了在平面N $$ \ mathcal {N} $$ = 4超对称Yang-Mills理论中自举七个点幅度所需的函数数量,从而使对这些幅度的更高环路贡献更易于计算。 特别地,双重超共形对称性和定义明确的共线极限足以确定...
光流(optical flow)是空间运动物体在观察成像平面上的像素运动的瞬时速度。 光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的... 通常将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量C++.zip
运动关系正确,相对速度合理,且地球绕太阳,月亮绕地球的轨道不能在一个平面内。 地球绕太阳,月亮绕地球可以使用简单圆或者椭圆轨道。 对球体纹理的处理,至少地球应该有纹理贴图。 增加光照处理,光源设在太阳...
光流(optical flow)是空间运动物体在观察成像平面上的像素运动的瞬时速度。光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来...通常将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量。