Skip to main content

3 posts tagged with "math"

View All Tags

光线—三角形相交算法

· 3 min read

背景

在图形学编程中,经常需要求玩家准心对准的物体。该问题可转化为求与玩家视线相交且离玩家最近的三角形面片所对应的物体。因此需要一种光线-三角形相交算法来求出视线是否与某三角形相交、若相交,距离又是多少。下面介绍一种简单的基于参数和矩阵求解的算法。

原理

已知三角形的三个顶点 v0,v1,v2\pmb v_0,\pmb v_1,\pmb v_2,可以给出三角形内点的参数方程:

h=v0+α(v1v0)+β(v2v0)\pmb h=\pmb v_0+\alpha(\pmb v_1- \pmb v_0)+\beta(\pmb v_2- \pmb v_0)

其中参数 α,β\alpha,\beta 满足下面的条件:

α0,β0,α+β1\alpha\ge0,\beta\ge0,\alpha+\beta\le1

e1=v1v0e2=v2v0\pmb e_1=\pmb v_1-\pmb v_0\\ \pmb e_2=\pmb v_2-\pmb v_0\\

则可简记为:

h=v0+αe1+βe2\pmb h=\pmb v_0+\alpha\pmb e_1+\beta\pmb e_2

玩家从 p\pmb p 点往 r\pmb r 方向看去,与三角形所在平面的交点为 h\pmb h 的参数方程:

h=p+tr\pmb h=\pmb p+t\pmb r

其中参数 tt 满足:

t0t\ge0

如图所示:

联立两个方程

v0+αe1+βe2=p+tr\pmb v_0+\alpha\pmb e_1+\beta\pmb e_2=\pmb p+t\pmb r

移项

αe1+βe2tr=pv0\alpha\pmb e_1+\beta\pmb e_2-t\pmb r=\pmb p-\pmb v_0

(e1,e2,r)(αβt)=pv0(\pmb e_1,\pmb e_2,-\pmb r) \left(\begin{array}{r} \alpha\\ \beta\\ t\\ \end{array}\right)=\pmb p-\pmb v_0

A=(e1,e2,r)x=(αβt)b=pv0\pmb A=(\pmb e_1,\pmb e_2,-\pmb r)\\ \pmb x=\left(\begin{array}{r} \alpha\\ \beta\\ t\\ \end{array}\right)\\ \pmb b=\pmb p-\pmb v_0

也就是说

Ax=b\pmb A\pmb x=\pmb b

根据克拉默法则

xj=detAj(b)detAx_j=\dfrac{\det \pmb A_j(\pmb b)}{\det \pmb A}

α=det(b,e2,r)det(e1,e2,r)β=det(e1,b,r)det(e1,e2,r)t=det(e1,e2,b)det(e1,e2,r)\begin{array}{lll} \alpha&=&\dfrac{\det(\pmb b,\pmb e_2,-\pmb r)}{\det(\pmb e_1,\pmb e_2,-\pmb r)}\\ \beta&=&\dfrac{\det(\pmb e_1,\pmb b,-\pmb r)}{\det(\pmb e_1,\pmb e_2,-\pmb r)}\\ t&=&\dfrac{\det(\pmb e_1,\pmb e_2,\pmb b)}{\det(\pmb e_1,\pmb e_2,-\pmb r)} \end{array}

如果计算得出的参数在其限制范围内,则可以认为玩家的视线与三角形相交。解出的参数 tt 即为三角形面片与玩家的距离。

实现

该实现使用了 GLM 库。这里构造的矩阵实际上是所需矩阵的转置,但由于 detAT=detA\det A^T=\det A,因此不影响结果。

函数返回 -1 表示光线与三角形不相交,返回非负数表示三角形面片与玩家的距离。

#include <glm/glm.hpp>

float raytrace(glm::vec3 v0, glm::vec3 v1, glm::vec3 v2, glm::vec3 p, glm::vec3 r) {
glm::vec3 e1 = v1 - v0;
glm::vec3 e2 = v2 - v0;
glm::vec3 b = p - v0;
float den = glm::determinant(glm::mat3(e1, e2, -r));
if (den == 0) return -1;
float nom_u = glm::determinant(glm::mat3(b, e2, -r));
float nom_v = glm::determinant(glm::mat3(e1, b, -r));
float nom_t = glm::determinant(glm::mat3(e1, e2, b));
float u = nom_u / den;
float v = nom_v / den;
float t = nom_t / den;
if (u >= 0.0 && v >= 0.0 && u + v <= 1.0 && t >= 0) {
return t;
}
return -1;
}

速通统计学

· 2 min read

本文为 UESTC 《概率论与数理统计》课程统计学部分(6-10章)期末考试复习速通笔记,旨在背多分。

四个统计学分布

正态分布

XN(μ,σ2)E(X)=μ,D(X)=σ2X\sim N(\mu, \sigma^2)\\ E(X)=\mu,D(X)=\sigma^2

卡方分布

χ2=i=1nXi2χ2(n) 其中 XN(0,1)E(χ2)=n,D(χ2)=2n\chi^2=\sum_{i=1}^n X_i^2\sim\chi^2(n)\\ \text{ 其中 } X \sim N(0, 1)\\ E(\chi^2)=n,D(\chi^2)=2n

t 分布

又叫学生分布

T=XY/nt(n) 其中 XN(0,1),Yχ2(n)T=\dfrac{X}{\sqrt{Y/n}} \sim t(n)\\ \text{ 其中 } X \sim N(0, 1), Y\sim\chi^2(n)

F 分布

又叫费希尔(Fisher)分布

F=X/n1Y/n2F(n1,n2) 其中 Xχ2(n1),Yχ2(n2)F=\dfrac{X/n_1}{Y/n_2}\sim F(n_1,n_2)\\ \text{ 其中 } X\sim\chi^2(n_1), Y\sim\chi^2(n_2)

参数估计与假设检验

距估计

μ^=Xσ^2=n1nS2\hat{\mu}=\overline{X}\\ \hat{\sigma}^2=\dfrac{n-1}nS^2

极大似然估计

核心思想是使似然函数 LL 取极大值。即求出一个 θ\theta,使取出这个样本的概率最大。

L=i=1nP(Xi=xi)lnL=i=1nlnP(Xi=xi)lnLθ=0L=\prod_{i=1}^nP(X_i=x_i)\\ \ln L=\sum_{i=1}^n \ln P(X_i=x_i)\\ \dfrac{\partial \ln L}{\partial\theta}=0

区间估计与假设检验

  • 估计或检验 μ\mu,当 σ\sigma 已知时
U=Xμσ/nN(0,1)U=\dfrac{\overline{X}-\mu}{\sigma/\sqrt{n}}\sim N(0,1)
  • 估计或检验 μ\mu,当 σ\sigma 未知时
T=XμS/nt(n1)T=\dfrac{\overline{X}-\mu}{S/\sqrt{n}}\sim t(n-1)
  • 估计或检验 σ\sigma,当 μ\mu 未知时
χ2=n1σ2S2χ2(n1)\chi^2=\dfrac{n-1}{\sigma^2}S^2\sim\chi^2(n-1)

第一类错误:弃真(犯错概率为 α\alpha

第二类错误:纳伪

线性回归

lxy=i=1nxiyinxˉyˉlxx=i=1nxi2nxˉ2lyy=i=1nyi2nyˉ2b^=lxylxx,a^=yˉb^xˉσ^2=lyyb^2lxxn2R=lxylxxlyy>Rα(n2)l_{xy}=\sum_{i=1}^nx_iy_i-n\bar{x}\bar{y}\\ l_{xx}=\sum_{i=1}^nx_i^2-n\bar{x}^2\\ l_{yy}=\sum_{i=1}^ny_i^2-n\bar{y}^2\\ \hat{b}=\dfrac{l_{xy}}{l_{xx}}, \hat{a}=\bar{y}-\hat{b}\bar{x}\\ \hat{\sigma}^2=\dfrac{l_{yy}-\hat{b}^2l_{xx}}{n-2}\\ R=\dfrac{l_{xy}}{\sqrt{l_{xx}l_{yy}}}>R_\alpha(n-2)

高中圆锥曲线结论

· One min read

若椭圆(b2>0b^2>0)或双曲线(b2<0b^2<0

x2a2+y2b2=1\frac{x^2}{a^2}+\frac{y^2}{b^2}=1

与直线

y=kx+my=kx+m

交于A(x1,y1),B(x2,y2)A(x_1,y_1),B(x_2,y_2),联立消 yy

(b2+a2k2)x2+2kma2x+a2(m2b2)=0(b^2+a^2k^2)x^2+2kma^2x+a^2(m^2-b^2)=0

Δ=4a2b2(b2+a2k2m2)0\Delta = 4a^2b^2(b^2+a^2k^2 - m^2) \geq 0 x1+x2=2kma2b2+a2k2,x1x2=a2(m2b2)b2+a2k2x_1+x_2=\frac{-2kma^2}{b^2+a^2k^2}, x_1x_2=\frac{a^2(m^2-b^2)}{b^2+a^2k^2} y1+y2=2mb2b2+a2k2,y1y2=b2(m2a2k2)b2+a2k2y_1+y_2=\frac{2mb^2}{b^2+a^2k^2}, y_1y_2=\frac{b^2(m^2-a^2k^2)}{b^2+a^2k^2} x1y2+x2y1=2ka2b2b2+a2k2x_1y_2+x_2y_1=\frac{-2ka^2b^2}{b^2+a^2k^2} x1y2x2y1=mΔb2+a2k2|x_1y_2-x_2y_1|=|m|\frac{\sqrt{\Delta}}{b^2+a^2k^2} AB=1+k2Δb2+a2k2|AB|=\sqrt{1+k^2}\frac{\sqrt{\Delta}}{b^2+a^2k^2}