⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plane.h

📁 一个纹理地形渲染器
💻 H
字号:
// Plane primitive

#pragma once

#include "Vector.h"
#include "Matrix.h"


namespace Mathematics
{
    /// A plane in 3-space.
    /// Defined by a point and a normal.

    class Plane
    {
    public:

        /// default constructor.
        /// does nothing for speed.

	    Plane() {}

        /// construct plane from a point and normal.

	    Plane(const Vector &point, const Vector &normal)
	    {
            this->point = point;
            this->normal = normal;
	    }

        /// construct plane from a normal and d.

	    Plane(const Vector &normal, float d)
	    {
            this->point = normal * d;
            this->normal = normal;
	    }

        /// calculate minimum distance from point to plane

	    float distance(const Vector &point) const
	    {
		    Vector p = point - this->point;
		    return normal.dot(p);
	    }

        /// calculate nearest point on plane to point

        Vector nearest(const Vector &point) const
        {
            return point - (normal.dot(point) + this->point.dot(normal)) * normal;
        }

		/// calculate d for plane equation

		float d() const
		{
			return point.dot(normal);
		}

		/// transform plane by matrix.

		Plane transform(const Matrix &matrix, const Matrix &inverse) const
		{
			Plane plane;
			plane.point = matrix * point;
			plane.normal = normal * inverse;	// note: equivalent to inverse.transpose() * normal
			plane.normal.normalize();
			return plane;
		}

		/// get basis vectors for 

		void basis(Vector &u, Vector &v) const
		{
			u = normal.perpendicular();
			v = normal.cross(u);
		}

		/// get plane matrix that transforms parametric plane coordinates (u,v) into world (x,y,z) coordinates

		Matrix matrix() const
		{
			Vector u,v;
			Vector::orthonormal_basis(normal, u, v);

			Matrix matrix(u,v,normal);

            matrix.m14 = -point.x;
            matrix.m24 = -point.y;
            matrix.m34 = -point.z;

			return matrix;
		}

		/// project a point in three space into the plane

		Vector project(const Vector &u, const Vector &v, const Vector &point) const
		{
			return Vector(point.dot(u), point.dot(v), 0);
		}

		/// unproject a point in plane space to three space

		Vector unproject(const Vector &u, const Vector &v, const Vector &point) const
		{
			return u*point.x + v*point.y;
		}

        Vector point;           ///< a point on the plane
        Vector normal;          ///< normal of the plane
    };
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -