【数学】解析几何

【数学】解析几何

直线

构成

1
2
float3 Origin;
float3 Normal;

定义

1
2
3
4
5
6
7
8
9
10
11
12
float3 p;//射线上任意一点
float t;//上述任意点到射线原点的距离
Origin + Normal * t = p;
//参数方程
float x = p.x,y = p.y,z = p.z;
float Ox = Origin.x;
float Oy = Origin.y;
float Oz = Origin.z;
float Nx = Normal.x;
float Ny = Normal.y;
float Nz = Normal.z;
(x - Ox) / Nx = (y - Oy) / Ny = (z - Oz) / Nz

平面

构成

1
2
float3 Origin;
float3 Normal;

定义

1
2
3
4
5
6
7
8
9
10
float3 p;//平面上任意一点
Dot(p - Origin,Normal) = 0;
//参数方程
Dot(p,Normal)-Dot(Origin,Normal) = 0
float x = p.x,y = p.y,z = p.z;
float A = Normal.x;
float B = Normal.x;
float C = Normal.x;
float D = -Dot(Origin,Normal);
Ax + By + Cz + D = 0;

三角形

构成

1
float3 p0,p1,p2;

运算

面积计算

1
2
3
4
5
6
7
8
9
10
    p1
- -
p0-------p2

公式:S = 1/2 * 底 * 高
变形:S = 1/2 * 底 * 斜 * Sin(θ)
其中:
底 = Length(p2-p0)
斜 = Length(p1-p0)
θ = Angle(p2-p0,p1-p0);

重心插值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
对于一维线性插值:
若有
float3 A,B;//需要插值的线段
float3 D;//A,B的插值结果
float t;//插值比率

D - A = (B - A) * t
D = Bt - At + A;
D = A(1 - t) + Bt;

现在增加
float3 C;//和A,B组成三角形的第三个顶点
float3 E;//C,D的插值结果
float3 s//插值比率
根据上文推导可得
E = C(1 - s) + Ds
带入上文公式
E = C(1 - s) + A(1 - t) * s + B * t * s;

float α = (1 - s);
float β = (1 - t) * s;
float γ = t * s;
则三角形插值可写作
E = Cα + Aβ + Bγ;
其中
α + β + γ
= (1 - s) + (1 - t) * s + t * s
= 1 - s + (1 - t + t) * s
= 1 - s + s
= 1

相交测试

直线和平面

1
2
Line //直线
Plane //平面

计算交点

结论:
  • 交点 = Line.Origin + Line.Normal * Dot(Plane.Origin - Line.Origin,Plane.Normal) / Dot(Line.Normal,Plane.Normal);
  • 其中 Dot(Line.Normal,Plane.Normal)不能等于 0
过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
float3 p; //设存在同时位于直线和平面上的点p
float3 t; //tp点距离直线原点的长度

//带入直线定义公式可得
p = Line.Origin + Line.Normal * t;
//进一步带入到平面公式可得
Dot(
(Line.Origin + Line.Normal * t) - Plane.Origin,
Plane.Normal
) = 0;

//根据Dot结合律拆分公式
Dot(Line.Origin,Plane.Normal) +
Dot(Line.Normal * t,Plane.Normal) -
Dot(Plane.Origin,Plane.Normal) = 0;
//调换常数部分到右侧,并化简Dot函数
Dot(Line.Normal,Plane.Normal) * t = Dot(Plane.Origin - Line.Origin,Plane.Normal);

//化简出t的计算公式(可见Line.NormalPlane.Normal不能垂直,否则会除以0)
t = Dot(Plane.Origin - Line.Origin,Plane.Normal) / Dot(Line.Normal,Plane.Normal)
//计算出结果
p = Line.Origin + Line.Normal * t

【数学】解析几何
https://bdffzi-blog.pages.dev/posts/1885603555.html
作者
BDFFZI
发布于
2024年10月10日
许可协议