Trapezoidal Shadow Map(1)

博客介绍了在light’s post−perspective space中根据视锥构建的梯形,用贴图表示相关参数。重点展示了从light’s post−perspective space到trapezoidal space的矩阵计算过程,包含平移、旋转、变换等多个步骤。

before.jpg

  在light’s post−perspective space中根据视锥构建的梯形,为了方便表示,贴了一张贴图表示.贴图中的Top表示靠近视锥前截面的梯形的上底,Bottom表示靠近视锥后截面的梯形的下底.

after.jpg

梯形转换到trapezoidal space后的显示情况

light’s post−perspective space->trapezoidal space的距阵计算:

HRESULT CTrapezoidalShadowMap::ComputeTrapezoidalMatrix(D3DXMATRIX& matrix,D3DXVECTOR3& topl,D3DXVECTOR3& topr,D3DXVECTOR3& bottoml,D3DXVECTOR3& bottomr,D3DXVECTOR3& intersection)
{
 // 平移TopLine的中点到Light's Post-Perspective Space的中点
 D3DXMatrixTranslation(&matrix,-(topl.x+topr.x)/2.0f,-(topl.y+topr.y)/2.0f,0);
 
 // 旋转梯形使得TopLine和Light's Post-Perspective Space的x轴重合
 D3DXVECTOR3 t_topline=(topl-topr);
 D3DXVec3Normalize(&t_topline,&t_topline);

 float t_angle=D3DXVec3Dot(&t_topline,&D3DXVECTOR3(1,0,0));
 
 D3DXMATRIX t_matrix;
 D3DXMatrixRotationZ(&t_matrix,-acosf(t_angle));

 matrix*=t_matrix;

 // 平移梯形使得两侧边交点到Light's Post-Perspective Space的中点
 D3DXVECTOR3 t_intersection;

 D3DXVec3TransformCoord(&t_intersection,&intersection,&matrix);

 D3DXMatrixTranslation(&t_matrix,-t_intersection.x,-t_intersection.y,0);

 matrix*=t_matrix;

 // 变换使得成为等边梯形
 D3DXVECTOR3 t_point1,t_point2;
 D3DXVec3TransformCoord(&t_point1,&topl,&matrix);
 D3DXVec3TransformCoord(&t_point2,&topr,&matrix);

 t_point1+=t_point2;

 D3DXMatrixIdentity(&t_matrix);
 t_matrix._21=-t_point1.x/t_point1.y;

 matrix*=t_matrix;

 // 变换使得两侧边成90度,TopLine的两点在[-1,1]和[1,1]上
 D3DXVec3TransformCoord(&t_point1,&topr,&matrix);

 D3DXMatrixScaling(&t_matrix,1.0f/t_point1.x,1.0f/t_point1.y,1.0f);

 matrix*=t_matrix;

 // 变换使得梯形变成矩形
 t_matrix._11=t_matrix._22=t_matrix._33=t_matrix._24=t_matrix._42=1.0f;
 t_matrix._12=t_matrix._13=t_matrix._14=t_matrix._21=t_matrix._23=0.0f;
 t_matrix._31=t_matrix._32=t_matrix._34=t_matrix._41=t_matrix._43=t_matrix._44=0.0f;

 matrix*=t_matrix;

 // 平移使得矩形的中心到Light's Post-Perspective Space的中点
 D3DXVec3TransformCoord(&t_point1,&topl,&matrix);
 D3DXVec3TransformCoord(&t_point2,&bottomr,&matrix);

 D3DXMatrixTranslation(&t_matrix,0,-(t_point1.y+t_point2.y)/2.0f,0);

 matrix*=t_matrix;

 // 拉伸矩形的Y方向,使得充满整个Light's Post-Perspective Space
 D3DXVECTOR4 t_point3;
 D3DXVec3Transform(&t_point3,&topl,&matrix);

 D3DXMatrixIdentity(&t_matrix);

 t_matrix._22=-t_point3.w/t_point3.y;

 matrix*=t_matrix;

 //
 return S_OK;
};

转载于:https://www.cnblogs.com/sevecol/archive/2005/08/03/206136.html

1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
<think>我们被要求回答关于梯形法公式的问题。梯形法是一种数值积分方法,用于近似计算定积分。其基本思想是将积分区间划分为若干小区间,在每个小区间上用梯形面积近似代替曲边梯形的面积。 梯形法的公式推导: 设函数 $f(x)$ 在区间 $[a, b]$ 上连续,将区间 $[a, b]$ 分成 $n$ 等份,每份长度 $h = \frac{b-a}{n}$,则分点为 $x_i = a + i h$,$i=0,1,\dots,n$。 在每一个小区间 $[x_{i-1}, x_i]$ 上,用梯形面积 $\frac{f(x_{i-1}) + f(x_i)}{2} \cdot h$ 来近似该小区间上的曲边梯形面积。将所有小区间的梯形面积相加,得到整个区间上的积分近似值: $$ \int_a^b f(x) dx \approx \frac{h}{2} \left[ f(x_0) + 2f(x_1) + 2f(x_2) + \cdots + 2f(x_{n-1}) + f(x_n) \right] $$ 这就是梯形法(也称为梯形公式)的复合形式。 梯形法的误差分析: 梯形法的局部截断误差为 $O(h^2)$,整体截断误差为 $O(h^2)$。当被积函数二阶导数连续时,误差公式为: $$ E = -\frac{(b-a)^3}{12n^2} f''(\xi), \quad \xi \in (a,b) $$ 梯形法的算法步骤(伪代码): 1. 输入积分区间 [a, b] 和分割数 n。 2. 计算 h = (b - a) / n。 3. 初始化积分值 integral = (f(a) + f(b)) / 2。 4. 循环 i 从 1 到 n-1: - 计算 x = a + i * h。 - integral += f(x)。 5. integral = integral * h。 6. 输出积分近似值 integral。 下面用Python代码实现梯形法: ```python def trapezoidal_rule(f, a, b, n): """ 使用梯形法计算函数f在区间[a, b]上的定积分,n为区间等分数。 """ h = (b - a) / n # 计算端点函数值之和的一半 integral = (f(a) + f(b)) / 2.0 # 循环累加中间点的函数值 for i in range(1, n): x = a + i * h integral += f(x) integral *= h return integral # 示例:计算函数 f(x)=x^2 在区间[0,1]上的积分,理论值为1/3 f = lambda x: x**2 a = 0 b = 1 n = 1000 # 分割数 result = trapezoidal_rule(f, a, b, n) print("梯形法计算的积分近似值:", result) ``` 梯形法在工程计算中应用广泛,因为它简单且易于实现。对于光滑函数,当分割数足够大时,可以得到较好的近似值。 梯形法的变体: - 如果函数在区间上变化剧烈,可以使用自适应梯形法,动态调整步长。 - 梯形法也可以用于求解常微分方程(如梯形法则用于求解ODE的隐式方法)。 注意事项: - 梯形法对于线性函数是精确的。 - 当被积函数有高阶导数时,可以考虑使用更高阶的方法(如辛普森法)来获得更精确的结果。 §§相关问题§§: 1. 梯形法在数值积分中的误差如何估计? 2. 梯形法与辛普森法有什么区别?各自的优缺点是什么? 3. 如何用梯形法求解一阶常微分方程?</think>### 梯形法公式详解 梯形法(Trapezoidal Rule)是一种数值积分方法,用于近似计算定积分 $\int_a^b f(x) dx$。其核心思想是将积分区间分割为若干子区间,在每个子区间上用线性函数(梯形)逼近曲线,再累加梯形面积作为积分近似值。 #### 基本公式 设函数 $f(x)$ 在区间 $[a, b]$ 上连续,将 $[a, b]$ 分为 $n$ 等份,每份宽度 $h = \frac{b-a}{n}$。分点为: $$x_i = a + ih, \quad i=0,1,2,\dots,n$$ 梯形法公式为: $$\int_a^b f(x) dx \approx \frac{h}{2} \left[ f(x_0) + 2\sum_{i=1}^{n-1} f(x_i) + f(x_n) \right]$$ #### 公式推导 1. 每个子区间 $[x_{i-1}, x_i]$ 的梯形面积为: $$A_i = \frac{h}{2} \left[ f(x_{i-1}) + f(x_i) \right]$$ 2. 总面积为所有子区间面积之和: $$\sum_{i=1}^n A_i = \frac{h}{2} \left[ f(x_0) + 2f(x_1) + 2f(x_2) + \cdots + 2f(x_{n-1}) + f(x_n) \right]$$ #### 误差分析 局部截断误差为 $O(h^3)$,全局误差为 $O(h^2)$。误差公式: $$E_T = -\frac{(b-a)^3}{12n^2} f''(\xi), \quad \xi \in [a, b]$$ #### Python 实现 ```python def trapezoidal_rule(f, a, b, n): """ 梯形法数值积分 :param f: 被积函数 :param a: 积分下限 :param b: 积分上限 :param n: 区间分割数 :return: 积分近似值 """ h = (b - a) / n integral = 0.5 * (f(a) + f(b)) for i in range(1, n): integral += f(a + i * h) return h * integral # 示例:计算 ∫_0^1 x^2 dx (理论值=1/3) f = lambda x: x**2 result = trapezoidal_rule(f, 0, 1, 1000) print(f"近似值: {result:.6f}, 理论值: {1/3:.6f}") ``` #### 应用场景 - 工程计算(如结构力学中的面积矩计算) - 物理实验数据处理 - 金融衍生品定价 - 缺乏原函数解析解时的积分近似 #### 注意事项 1. 函数需在区间内连续 2. 增加 $n$ 可提高精度(误差以 $1/n^2$ 速度减小) 3. 对周期函数或线性函数可精确计算 4. 若函数曲率大,需结合自适应细分或高阶方法(如辛普森法)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值