matrix4

//Writed by YaoPu, Oct 10,2016
//if any problem,send email yaopu@iccas.ac.cn
#include"mpi.h"
#include"stdio.h"
#include<stdlib.h>
void matgen(float *a,int Width)
{
int i,j;
for(i=0;i<Width;i++){
for(j=0;j<Width;j++){
a[i*Width+j]=1.00;
}
}
}


int main(int argc,char **argv)
{
float *M,*N,*P,*buffer,*ans;
int Width=1000;
int myid,numprocs;
MPI_Status status;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
int line = Width/numprocs;
M = (float *)malloc(sizeof(float)*Width*Width);
N = (float *)malloc(sizeof(float)*Width*Width);
P = (float *)malloc(sizeof(float)*Width*Width);
buffer = (float *)malloc(sizeof(float)*Width*line);
ans = (float *)malloc(sizeof(float)*Width*line);
if(myid==0)
{
matgen(M,Width);
matgen(N,Width);
for(int i=1;i<numprocs;i++){
MPI_Send(N,Width*Width,MPI_FLOAT,i,0,MPI_COMM_WORLD);
}

for(int m=1;m<numprocs;m++){
MPI_Send(M+(m-1)*line*Width,Width*line,MPI_FLOAT,m,m,MPI_COMM_WORLD);
}

//receive result
for(int k=1;k<numprocs;k++)
{
MPI_Recv(ans,line*Width,MPI_FLOAT,k,3,MPI_COMM_WORLD,&status);
for(int i=0;i<line;i++){
for(int j=0;j<Width;j++){
P[((k-1)*line+i)*Width+j]=ans[i*Width+j];
}
}
}

for(int i=(numprocs-1)*line;i<Width;i++){
for(int j=0;j<Width;j++){
float temp=0.0;
for(int k=0;k<Width;k++)
temp+=M[i*Width+k]*N[k*Width+j];
P[i*Width+j]=temp;
}
}

///test
float sum1=0;
float sum2=0;
for(int i=0;i<Width;i++){
sum1+=M[i];
sum2+=P[600*Width+i];
}
printf("sum1=%f sum2=%f\n",sum1,sum2);
}
else{
MPI_Recv(N,Width*Width,MPI_FLOAT,0,0,MPI_COMM_WORLD,&status);
MPI_Recv(buffer,Width*Width,MPI_FLOAT,0,1,MPI_COMM_WORLD,&status);
for (int i=0;i<line;i++){
for(int j=0;j<Width;j++){
float temp=0.0;
for(int k=0;k<Width;k++)
temp+=buffer[i*Width+k]*N[k*Width+j];
ans[i*Width+j]=temp;
}
}
MPI_Send(ans,line*Width,MPI_FLOAT,0,3,MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
}

在 **Cesium** 中,`Matrix4` 是一个非常核心的类,用于表示 **4x4 的变换矩阵**。它广泛用于 3D 图形变换,包括 **平移(Translation)、旋转(Rotation)、缩放(Scale)、投影(Projection)** 等操作。 --- ## ✅ `Matrix4` 表示什么? `Matrix4` 是一个 **4x4 的矩阵**,常用于表示 **仿射变换(Affine Transformation)**,即包含线性变换(旋转、缩放、剪切)和平移的组合。 在 3D 图形中,一个 4x4 矩阵可以表示如下: $$ \begin{bmatrix} R_{11} & R_{12} & R_{13} & T_x \\ R_{21} & R_{22} & R_{23} & T_y \\ R_{31} & R_{32} & R_{33} & T_z \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} $$ 其中: - $ R $ 表示旋转或缩放等线性变换部分(3x3 矩阵) - $ T $ 表示平移向量($ T_x, T_y, T_z $) --- ## ✅ `Matrix4` 的常见用途 | 用途 | Cesium 方法 | |------|-------------| | 构建单位矩阵 | `Cesium.Matrix4.IDENTITY` | | 平移 | `Cesium.Matrix4.fromTranslation(...)` | | 旋转 | `Cesium.Matrix4.fromRotationTranslation(...)` | | 缩放 | `Cesium.Matrix4.fromScale(...)` | | 视图矩阵(相机) | `Cesium.Matrix4.lookAt(...)` | | 投影矩阵 | `Cesium.Matrix4.perspective(...)` | | 模型变换矩阵 | `Entity.model.modelMatrix` / `Cesium3DTileset.modelMatrix` | --- ## ✅ 示例代码:创建和使用 `Matrix4` ### 1. 创建一个包含平移、旋转、缩放的 `Matrix4` ```javascript const viewer = new Cesium.Viewer('cesiumContainer'); // 定义缩放、旋转和平移 const scale = new Cesium.Cartesian3(2, 2, 2); // 缩放因子 const rotation = Cesium.Matrix3.fromRotation(Math.PI / 4); // 绕 Z 轴旋转 45 度 const translation = new Cesium.Cartesian3(1000, 2000, 3000); // 平移向量 // 构建变换矩阵 const modelMatrix = Cesium.Matrix4.fromRotationTranslation(rotation, translation); // 应用到模型上 const entity = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883), model: { uri: 'path/to/model.gltf', modelMatrix: modelMatrix } }); viewer.zoomTo(viewer.entities); ``` ### 2. 获取模型的 `modelMatrix` 并查看其内容 ```javascript tileset.readyPromise.then(() => { const matrix = tileset.modelMatrix; console.log('Model Matrix:', matrix); }); ``` --- ## ✅ `Matrix4` 的结构(以数组形式查看) 你可以通过 `.elements` 属性查看 `Matrix4` 的 16 个元素(按列优先顺序): ```javascript const matrix = Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(100, 200, 300)); console.log(matrix.elements); ``` 输出类似: ``` [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 200, 300, 1 ] ``` --- ## ✅ 常用 `Matrix4` 操作 | 操作 | 方法 | |------|------| | 矩阵乘法 | `Cesium.Matrix4.multiply(left, right, result)` | | 矩阵逆 | `Cesium.Matrix4.inverse(matrix, result)` | | 矩阵转置 | `Cesium.Matrix4.transpose(matrix, result)` | | 提取平移部分 | `Cesium.Matrix4.getTranslation(matrix, result)` | | 提取旋转部分 | `Cesium.Matrix4.getRotation(matrix, result)` | --- ## ✅ `Matrix4` 在 Cesium 中的典型应用场景 ### 场景 1:模型变换(ModelMatrix) ```javascript modelMatrix = Cesium.Matrix4.multiply( Cesium.Matrix4.fromTranslation(translation), Cesium.Matrix4.fromRotationMatrix(rotation), new Cesium.Matrix4() ); ``` ### 场景 2:相机视图变换(View Matrix) ```javascript const viewMatrix = Cesium.Matrix4.lookAt( cameraPosition, targetPosition, Cesium.Cartesian3.UNIT_Z, new Cesium.Matrix4() ); ``` ### 场景 3:投影变换(Projection Matrix) ```javascript const projectionMatrix = Cesium.Matrix4.perspective({ fov: Math.PI / 3, aspectRatio: canvas.clientWidth / canvas.clientHeight, near: 1, far: 10000000 }); ``` --- ## ✅ 总结 | 操作 | 描述 | |------|------| | `Matrix4` | 4x4 矩阵,用于表示 3D 空间中的仿射变换 | | 用途 | 平移、旋转、缩放、相机视图、投影等 | | 核心方法 | `fromTranslation`, `fromRotationMatrix`, `lookAt`, `perspective`, `multiply`, `inverse` | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值