《3D 数学基础》12 几何图元

目录

1. 直线、线段和射线

1.1 直线

1.2 射线

2. 球

3. AABB

4. 平面

5. 三角形

6. 多边形


1. 直线、线段和射线

经典定义

 书中对射线定义做了修改:有向线段。

1.1 直线

 算法定义

Class line3D
{
public: 
    Vector3D origin;  // 直线中的两个点表示该直线,其中这两个点用3d向量表示
    Vector3D end;
    //成员函数
}

1.2 射线

p0是起始点,d是方向向量,单位向量。 自变量是t,可以很大超过1. p(0)=p0. p(2)=p0+2d;

算法实现

Class rayLine3D
{
public: 
    Vector3D rayOrigin;  // p0, 射线起始点,用3d向量表示
    Vector3D rayDelta;   // d,一般是单位向量。
    //成员函数
}

2. 球

 其中||p - c|| = r是球面公式,D=2r是直径,C是过球心切面的周长,A是切面面积。

S是球面面积,V是球体积。

 向量表示的点p到球心c的距离为给定距离r的点的集合,p为球面上点。另一种表示法:

算法实现

class Sphere
{
public:
    Vector3D center;  // 用一个球心和半径表示球
    float radius;
};

3. AABB

AABB有8个顶点坐标,AABB内部点坐标都在[xmin,ymin,zmin]和[xmax,ymax,zmax]内部;

Pmin是坐标值最小的, Pmax是坐标值最大的;

c是AABB中心;

s是AABB的大小,使用向量表示;

r是AABB的大小的一半。

算法实现

class AABB3
{
	Vector3 min;
	Vector3 max;

	Vector3 size() const (return max - min;);
	float xSize() { return max.x - min.x; };
	float xSize() { return max.x - min.x; };
	float xSize() { return max.x - min.x; };
	Vector3 center() { return (min + max) * 0.5f; };

	Vector3 corner(int i) const;  // 返回其中一个顶点
};

Vector3 Vector3::corner(int i) const
{
	assert(i >= 0);
	assert(i <= 7);
	if (i == 0) return Vector3(min.x, min.y, min.z);  // 左手坐标系
	if (i == 1) return Vector3(max.x, min.y, min.z);
	if (i == 2) return Vector3(min.x, max.y, min.z); 
	//...
}

4. 平面

定义:点p到空间中的两个点q和r之间的距离相等的点的集合,组成的就是平面;

(1)使用两个向量pn表示,p·n=d,如下。

其中向量p是平面上的任一点,n是单位向量(平面的法向量),两者向量点乘就是ax+by+cz=d;

d是平面到原点的距离。

平面的正面是法向量的方向。

(2)另一种定义平面常见做法是,使用平面上3个点p1,p2,p3,如下。

 方向问题,是使用左手法则,大拇指指向法向量方向,其他指头的弯曲方向就是p1->p2->p3.

(3)多个点拟合一个最佳平面,先求法向量(nx,ny,nz),再求d即可,加上平面上的点p(x,y,z),则表示位pn=d;

(4)点到平面的距离a = qn - d

 这样求点到平面的距离,只需要直到该点本身q,单位向量n和d即可。不需要求p.

5. 三角形

使用三个顶点表示三角形。

(1)边长和周长

(2)正弦公式,正弦值和对面的边长比例

(3)余弦公式

(4) 面积

(1)已知底b和高h,则A = bh/2;

(2)已知边长,则使用海伦公式;

(3)只是知道三个顶点,则使用任意两条边向量的叉乘/2。

 两条边叉乘的模长是平行四边形的面积。

6. 多边形

(1) 简单多边形,是内部没有点,按顺时针将边界点存储即可;

(2)复杂多边形,是内部有洞的,可以插入一个缝隙,使其变成简单多边形,再按顺时针访问边界点即可。

 (3)凸多边形和凹多边形

所有的内角都小于180度,则是凸多边形 。

参考:30.几何图元_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值