矩阵变换原理与应用详解

版权申诉
0 下载量 105 浏览量 更新于2024-10-04 收藏 218KB ZIP 举报
资源摘要信息:"矩阵变换(PPT)" 矩阵变换是线性代数中的一个核心概念,它在计算机图形学、图像处理、物理仿真、机器人学和工程学等多个领域都有广泛的应用。矩阵变换可以用于描述和实现几何对象在空间中的平移、旋转、缩放以及其他更复杂的变换。 在计算机图形学中,矩阵变换通常用于变换2D和3D图形。2D变换包括平移、缩放、旋转和倾斜;3D变换则扩展到包括绕任意轴的旋转、透视投影等。变换可以通过乘以变换矩阵来实现,而变换矩阵定义了图形空间中点的新位置。 1. 平移变换: 平移变换通过矩阵向量乘法来实现,它将图形对象沿指定方向移动指定距离。在二维空间中,一个点 (x, y) 经过平移变换后的位置可以用以下矩阵乘法计算得出: ``` |x'| |1 0 dx| |x| | | = | | * | | |y'| |0 1 dy| |y| ``` 其中 dx 和 dy 分别表示在 x 和 y 方向上的平移量。 2. 缩放变换: 缩放变换可以独立地对图形对象进行放大或缩小。在二维空间中,对于一个点 (x, y),缩放变换可以表示为: ``` |x'| |sx 0 0| |x| | | = | | * | | |y'| |0 sy 0| |y| ``` 其中,sx 和 sy 分别表示在 x 轴和 y 轴方向上的缩放因子。 3. 旋转变换: 旋转变换用于绕原点旋转图形对象。在二维空间中,一个点 (x, y) 绕原点旋转角度 θ 后的位置可以由以下矩阵乘法得出: ``` |x'| |cosθ -sinθ 0| |x| | | = | | * | | |y'| |sinθ cosθ 0| |y| ``` 在三维空间中,旋转变换更为复杂,因为存在三个互相垂直的轴,可以根据需要绕 x、y 或 z 轴旋转。 4. 倾斜变换(Shear): 倾斜变换会使得图形在某一个方向上产生拉伸效果,但不改变图形的面积。在二维空间中,通过以下矩阵乘法实现: ``` |x'| |1 shx 0| |x| | | = | | * | | |y'| |shy 1 0| |y| ``` 其中 shx 和 shy 分别表示在 x 方向和 y 方向上的倾斜因子。 5. 齐次坐标和投影变换: 在三维空间中,为了方便处理平移变换,引入了齐次坐标系统。齐次坐标通过添加一个额外的维度来表示点的位置,这样就可以用一个四维向量来表示一个三维点,并且使用一个 4x4 的变换矩阵来执行包括平移在内的所有变换。透视投影变换是将三维场景映射到二维视图的过程,它模拟了人眼对远近物体的不同感知,即近大远小的效果。 6. 变换矩阵的组合: 当需要对图形进行多个连续变换时,可以通过矩阵乘法将各个变换矩阵组合起来,形成一个总的变换矩阵。组合变换的顺序非常重要,因为矩阵乘法一般不满足交换律。变换矩阵通常从右向左依次应用,即先计算最右边的变换矩阵。 本压缩包中的 PPT 文件很可能详细介绍了上述概念,并可能通过实际的图形示例,使学生或者观众更容易理解矩阵变换的应用和效果。文件可能包含动画或图表来展示各种变换的实际效果,也可能提供了数学证明和公式的推导。此外,对于熟悉编程的听众,PPT 可能还提供了变换矩阵在编程语言(如 C++, Java, Python)中的应用示例,以帮助他们更好地将理论应用于实际开发中。

SELECT PIS.SHOW_FLT_DETAIL AS SHOW_FLT_DETAIL -- new , PIS.SHOW_AWB_DETAIL AS SHOW_AWB_DETAIL -- new , PIS.DISPLAY_AIRLINE_CODE AS CARRIER_CODE , DECODE(PIS.REVERT_FLOW,'N',PIS.FLOW_TYPE,DECODE(PIS.FLOW_TYPE,'I','E','I')) AS FLOW_TYPE , PIS.SHIP_TO_LOCATION AS SHIP_TO_LOCATION , PIS.INVOICE_SEQUENCE AS INVOICE_SEQUENCE , PFT.FLIGHT_DATE AS FLIGHT_DATE , PFT.FLIGHT_CARRIER_CODE AS FLIGHT_CARRIER_CODE , PFT.FLIGHT_SERIAL_NUMBER AS FLIGHT_SERIAL_NUMBER , PFT.FLOW_TYPE AS AIRCRAFT_FLOW , FAST.AIRCRAFT_SERVICE_TYPE AS AIRCRAFT_SERVICE_TYPE , PPT.AWB_NUMBER AS AWB_NUMBER , PPT.WEIGHT AS WEIGHT , PPT.CARGO_HANDLING_OPERATOR AS CARGO_HANDLING_OPERATOR , PPT.SHIPMENT_PACKING_TYPE AS SHIPMENT_PACKING_TYPE , PPT.SHIPMENT_FLOW_TYPE AS SHIPMENT_FLOW_TYPE , PPT.SHIPMENT_BUILD_TYPE AS SHIPMENT_BUILD_TYPE , PPT.SHIPMENT_CARGO_TYPE AS SHIPMENT_CARGO_TYPE , PPT.REVENUE_TYPE AS REVENUE_TYPE , PFT.JV_FLIGHT_CARRIER_CODE AS JV_FLIGHT_CARRIER_CODE , PPT.PORT_TONNAGE_UID AS PORT_TONNAGE_UID , PPT.AWB_UID AS AWB_UID , PIS.INVOICE_SEPARATION_UID AS INVOICE_SEPARATION_UID , PFT.FLIGHT_TONNAGE_UID AS FLIGHT_TONNAGE_UID FROM PN_FLT_TONNAGES PFT , FZ_AIRLINES FA , PN_TONNAGE_FLT_PORTS PTFP , PN_PORT_TONNAGES PPT , FF_AIRCRAFT_SERVICE_TYPES FAST , SR_PN_INVOICE_SEPARATIONS PIS --new , SR_PN_INVOICE_SEP_DETAILS PISD--new , SR_PN_INV_SEP_PORT_TONNAGES PISPT --new WHERE PFT.FLIGHT_OPERATION_DATE >= trunc( CASE :rundate WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN ADD_MONTHS(SYSDATE,-1) ELSE ADD_MONTHS(:rundate,-1) END, 'MON') AND PFT.FLIGHT_OPERATION_DATE < trunc( CASE :rundate WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN TRUNC(SYSDATE) ELSE TRUNC(:rundate) END, 'MON') AND PFT.TYPE IN ('C', 'F') AND PFT.RECORD_TYPE = 'M' AND (PFT.TERMINAL_OPERATOR NOT IN ('X', 'A') OR (PFT.TERMINAL_OPERATOR <> 'X' AND FA.CARRIER_CODE IN (SELECT * FROM SPECIAL_HANDLING_AIRLINE) AND PPT.REVENUE_TYPE IN (SELECT * FROM SPECIAL_REVENUE_TYPE) AND PPT.SHIPMENT_FLOW_TYPE IN (SELECT * FROM SPECIAL_SHIPMENT_FLOW_TYPE) AND PFT.FLIGHT_OPERATION_DATE >= (select EFF_DATE from SPECIAL_HANDLING_EFF_DATE) )) AND PFT.DELETING_DATETIME IS NULL AND FA.AIRLINE_UID = PFT.AIRLINE_UID AND FA.DELETING_DATETIME IS NULL AND PTFP.FLIGHT_TONNAGE_UID = PFT.FLIGHT_TONNAGE_UID AND PTFP.RECORD_TYPE = 'M' AND PTFP.DELETING_DATETIME IS NULL AND PPT.TONNAGE_FLIGHT_PORT_UID (+)= PTFP.TONNAGE_FLIGHT_PORT_UID AND PPT.RECORD_TYPE (+)= 'M' AND PPT.DISCREPANCY_TYPE (+)= 'NONE' AND PPT.ADJUSTMENT_INC_FLAG (+)= 'Y' AND PPT.DELETING_DATETIME (+) IS NULL AND FAST.AIRCRAFT_SERVICE_TYPE_UID = PFT.AIRCRAFT_SERVICE_TYPE_UID AND FAST.DELETING_DATETIME IS NULL AND PIS.TEMPORAL_NAME = TO_CHAR((CASE :rundate --new WHEN TO_DATE('01/01/1900', 'DD/MM/YYYY') THEN TRUNC(SYSDATE) ELSE TRUNC(:rundate) END ), 'YYYYMM') || '00' AND PIS.INVOICE_SEPARATION_UID = PISD.INVOICE_SEPARATION_UID --new AND PISD.INVOICE_SEP_DETAIL_UID = PISPT.INVOICE_SEP_DETAIL_UID --new AND PISPT.PORT_TONNAGE_UID = PPT.PORT_TONNAGE_UID --new AND PIS.PRINT_SUPPORTING_DOC = 'Y';上面是oracle的写法,请转成spark SQL的写法。

2023-06-02 上传