齐次坐标变换矩阵是这样的:2维角度逆时针旋转:
Cosθ Sinθ 0
-Sinθ Cosθ 0
0 0 1x=x*Cosθ-y*Sinθ+0
y=x*Sinθ+y*Cosθ+02维角度顺时针旋转:
Cosθ -Sinθ 0
Sinθ Cosθ 0
0 0 1x=x*Cosθ+y*Sinθ+0
y=-x*Sinθ+y*Cosθ+03维的情况比较复杂了,稍后给你。
Cosθ Sinθ 0
-Sinθ Cosθ 0
0 0 1x=x*Cosθ-y*Sinθ+0
y=x*Sinθ+y*Cosθ+02维角度顺时针旋转:
Cosθ -Sinθ 0
Sinθ Cosθ 0
0 0 1x=x*Cosθ+y*Sinθ+0
y=-x*Sinθ+y*Cosθ+03维的情况比较复杂了,稍后给你。
cosθ -sinθcosφ -sinθsinφ 0
0 sinφ -cosφ 0
0 0 ρ 1根据这个可以转成公式:
x=-x*sinθ+y*cosθ
y=-x*cosθcosφ-y*sinθ*cosφ+z*sinφ
z=-x*cosθsinφ-y*sinθ*sinφ-z*cosφ+ρ最后取2维投影是这样的:
LookX=D*x/z
LookY=D*y/zD>ρ
Type tpCoordDbl
dblX As Double
dblY As Double
End TypeType tpTranMatrixDbl
dblCells(0 To 2, 0 To 2) As Double
End TypeFunction TranMatrixTierSet(pTranMatrix As tpTranMatrixDbl, pA As Double, pB As Double, pC As Double, pTier As Integer) As tpTranMatrixDbl
Dim tOutData As tpTranMatrixDbl
tOutData = pTranMatrix
tOutData.dblCells(0, pTier) = pA
tOutData.dblCells(1, pTier) = pB
tOutData.dblCells(2, pTier) = pC
TranMatrixTierSet = tOutData
End FunctionFunction CoordTranByMatrix(pCoord As tpCoordDbl, pTranMatrix As tpTranMatrixDbl) As tpCoordDbl
Dim tOutData As tpCoordDbl
tOutData.dblX = pCoord.dblX * pTranMatrix.dblCells(0, 0) + pCoord.dblY * pTranMatrix.dblCells(0, 1) + pTranMatrix.dblCells(0, 2)
tOutData.dblY = pCoord.dblX * pTranMatrix.dblCells(1, 0) + pCoord.dblY * pTranMatrix.dblCells(1, 1) + pTranMatrix.dblCells(1, 2)
CoordTranByMatrix = tOutData
End FunctionFunction CoordSet(pCoord As tpCoordDbl, pX As Double, pY As Double) As tpCoordDbl
Dim tOutData As tpCoordDbl
With tOutData
.dblX = pX
.dblY = pY
End With
CoordSet = tOutData
End Function
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 4125
ClientLeft = 60
ClientTop = 345
ClientWidth = 4680
LinkTopic = "Form1"
ScaleHeight = 275
ScaleMode = 3 'Pixel
ScaleWidth = 312
StartUpPosition = 3 '窗口缺省
Begin VB.TextBox Text1
Height = 270
Left = 600
TabIndex = 1
Text = "Text1"
Top = 3360
Width = 3975
End
Begin VB.Timer Timer1
Left = 120
Top = 3360
End
Begin VB.PictureBox Picture1
Appearance = 0 'Flat
AutoRedraw = -1 'True
BackColor = &H00000000&
BorderStyle = 0 'None
ForeColor = &H80000008&
Height = 3135
Left = 120
ScaleHeight = 209
ScaleMode = 3 'Pixel
ScaleWidth = 297
TabIndex = 0
Top = 120
Width = 4455
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Dim sysTranMatrixA As tpTranMatrixDbl
Dim sysTranMatrixB As tpTranMatrixDbl
Dim sysX As Double
Dim sysY As Double
Dim sysCoord As tpCoordDbl
Dim sysRadian As Double
Dim sysA As DoublePrivate Sub Form_Load()
Show
sysRadian = (45 * 355) / (113 * 180)
sysTranMatrixA = TranMatrixTierSet(sysTranMatrixA, 10, 0, 0, 0)
sysTranMatrixA = TranMatrixTierSet(sysTranMatrixA, 10, 0, 0, 1)
sysTranMatrixA = TranMatrixTierSet(sysTranMatrixA, 0, 0, 0, 2)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, Cos(sysRadian) * 5, -Sin(sysRadian) * 5, 0, 0)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, Sin(sysRadian) * 5, Cos(sysRadian) * 5, 0, 1)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, 0, 0, 0, 2)
sysCoord = CoordSet(sysCoord, 10, 0)
sysCoord = CoordTranByMatrix(sysCoord, sysTranMatrixB)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, Cos(sysRadian) * 5, -Sin(sysRadian) * 5, sysCoord.dblX, 0)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, Sin(sysRadian) * 5, Cos(sysRadian) * 5, sysCoord.dblY, 1)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, 0, 0, 0, 2)
Timer1.Interval = 1
End SubPrivate Sub Timer1_Timer()
For sysX = 0 To 19
For sysY = 0 To 19
sysCoord = CoordSet(sysCoord, sysX, sysY)
sysCoord = CoordTranByMatrix(sysCoord, sysTranMatrixB)
With sysCoord
Picture1.PSet (.dblX, .dblY), RGB(0, 0, 0)
End With
Next
Next
sysA = (sysA + 1) Mod 360
sysRadian = sysA * 3.1415926 / 180
Text1.Text = sysA
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, -Cos(sysRadian) * 10, Sin(sysRadian) * 10 / 2, 0, 0)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, -Sin(sysRadian) * 10, -Cos(sysRadian) * 10 / 2, 0, 1)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, 100, 100, 0, 2)
sysCoord = CoordSet(sysCoord, 5, 5)
sysCoord = CoordTranByMatrix(sysCoord, sysTranMatrixB)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, Cos(sysRadian) * 10, -Sin(sysRadian) * 10 / 2, 0, 0)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, Sin(sysRadian) * 10, Cos(sysRadian) * 10 / 2, 0, 1)
sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, sysCoord.dblX, sysCoord.dblY, 0, 2)
'sysCoord = CoordSet(sysCoord, 10, 0)
'sysCoord = CoordTranByMatrix(sysCoord, sysTranMatrixB)
'sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, Cos(sysRadian) * 5, -Sin(sysRadian) * 5, 0, 0)
'sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, Sin(sysRadian) * 5, Cos(sysRadian) * 5, 0, 1)
'sysTranMatrixB = TranMatrixTierSet(sysTranMatrixB, sysCoord.dblX, sysCoord.dblY, 0, 2)
For sysX = 0 To 10
For sysY = 0 To 10
sysCoord = CoordSet(sysCoord, sysX, sysY)
sysCoord = CoordTranByMatrix(sysCoord, sysTranMatrixB)
With sysCoord
Picture1.PSet (.dblX, .dblY), RGB(255, 255, 255)
End With
Next
Next
End Sub