可使用TransformBy方法给定一个4×4转换矩阵移动、比例缩放或旋转对象。
下表示范了转换矩阵结构,这里R为旋转,T为转换:
转换矩阵结构
R00 R01 R02 T0
R10 R11 R12 T1
R20 R21 R22 T2
0 0 0 1
转换对象,首先要初始化转换矩阵。下例显示了一个分配给变量tMatrix的转换矩阵,它将围绕点(0, 0, 0)按90度旋转图元:
tMatrix(0,0) = 0.0
tMatrix(0,1) = -1.0
tMatrix(0,2) = 0.0
tMatrix(0,3) = 0.0
tMatrix(1,0) = 1.0
tMatrix(1,1) = 0.0
tMatrix(1,2) = 0.0
tMatrix(1,3) = 0.0
tMatrix(2,0) = 0.0
tMatrix(2,1) = 0.0
tMatrix(2,2) = 1.0
tMatrix(2,3) = 0.0
tMatrix(3,0) = 0.0
tMatrix(3,1) = 0.0
tMatrix(3,2) = 0.0
tMatrix(3,3) = 1.0
当完成了转换矩阵后,使用TransformBy方法应用矩阵到对象上。以下代码行示范了应用矩阵(tMatrix)到对象(anObj):
anObj.TransformBy tMatrix
使用转换矩阵旋转直线
本例创建一直线并使用转换矩阵将其旋转90度。
Sub Ch4_TransformBy()
' 创建一直线
Dim lineObj As AcadLine
Dim startPt(0 To 2) As Double
Dim endPt(0 To 2) As Double
startPt(0) = 2
startPt(1) = 1
startPt(2) = 0
endPt(0) = 5
endPt(1) = 1
endPt(2) = 0
Set lineObj = ThisDrawing.ModelSpace. _
AddLine(startPt, endPt)
ZoomAll
' 初始化transMat转换矩阵的变量,
'以使其围绕点(0,0,0)并按90度旋转对象。
Dim transMat(0 To 3, 0 To 3) As Double
transMat(0, 0) = 0#: transMat(0, 1) = -1#
transMat(0, 2) = 0#: transMat(0, 3) = 0#
transMat(1, 0) = 1#: transMat(1, 1) = 0#
transMat(1, 2) = 0#: transMat(1, 3) = 0#
transMat(2, 0) = 0#: transMat(2, 1) = 0#
transMat(2, 2) = 1#: transMat(2, 3) = 0#
transMat(3, 0) = 0#: transMat(3, 1) = 0#
transMat(3, 2) = 0#: transMat(3, 3) = 1#
'使用定义了的转换矩阵转换直线
lineObj.TransformBy transMat
lineObj.Update
End Sub
以下为转换矩阵的更多例子:
旋转矩阵:围绕点(0,0,0)按90度
0.0 -1.0 0.0 0.0
1.0 0.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
旋转矩阵:围绕点(5, 5, 0)按45度
0.707107 -0.707107 0.0 5.0
0.707107 0.707107 0.0 -2.071068
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
转换矩阵:通过(10,10,0)移动图元
1.0 0.0 0.0 10.0
0.0 1.0 0.0 10.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
比例矩阵:按点(0, 0, 0)比例为10,10缩放
10.0 0.0 0.0 0.0
0.0 10.0 0.0 0.0
0.0 0.0 10.0 0.0
0.0 0.0 0.0 1.0
比例矩阵:按点(2, 2, 0)比例10,10缩放
10.0 0.0 0.0 -18.0
0.0 10.0 0.0 -18.0
0.0 0.0 10.0 0.0
0.0 0.0 0.0 1.0