谢谢!!!
解决方案 »
- ocx控件
- 请教高手:vsprint8中如何获得TableCell画的的某条线的坐标(即该线条的x1,y1--x2,y2)
- vb的数据报表能打印一个字段不确定(会变化)的表吗?
- 请教数据库问题
- statusBar的width属性是只读的,窗口变化时,怎样调整其width?
- 俺想问个很菜的问题!
- 会动态生成按扭吗?
- 如何才能访问WebBrowser控件的内部元素?
- 怎样用VB写收发邮件的控件,现成的也可以,多谢!!!
- VB中想用EXCEL做数据源,但引用和加载时都出错,详见图片!
- 大家谈谈使用Oracle数据进行编程,与Sqlserver编程有哪些注意事项
- 保存文件时如何检测并提示用户在目标目录中已有相同的文件名?
X'=x*cos(th)-y*sin(th)
Y'=y*sin(th)+x*cos(th)绕基准点旋转需要:平移、旋转、再平移回去
x1 = x * Cos(α) + y * Sin(α)
y1 = -x * Sin(α) + y * Cos(α)x1 和 Y1是新的坐标,α是旋转的弧度,这个公式是绕坐标原点进行旋转,如果要绕某一确定的点,要将坐标相对该点进行坐标变换
X'=x*cos(th)-y*sin(th)
Y'=x*sin(th)+y*cos(th)
Const Lenth = 1000
Const StartPoint = 2000
Private Type Point_3D
x As Double
y As Double
z As Double
End Type
Dim P_3D(7) As Point_3DPrivate Sub Form_Load()
P_3D(0).x = Lenth
P_3D(0).y = Lenth
P_3D(0).z = Lenth
P_3D(1).x = Lenth
P_3D(1).y = -Lenth
P_3D(1).z = Lenth
P_3D(2).x = -Lenth
P_3D(2).y = Lenth
P_3D(2).z = Lenth
P_3D(3).x = -Lenth
P_3D(3).y = -Lenth
P_3D(3).z = Lenth
P_3D(4).x = Lenth
P_3D(4).y = Lenth
P_3D(4).z = -Lenth
P_3D(5).x = Lenth
P_3D(5).y = -Lenth
P_3D(5).z = -Lenth
P_3D(6).x = -Lenth
P_3D(6).y = Lenth
P_3D(6).z = -Lenth
P_3D(7).x = -Lenth
P_3D(7).y = -Lenth
P_3D(7).z = -Lenth
Call Draw_3D
End Sub
Private Sub Draw_3D()
Line1(0).X1 = P_3D(0).x + StartPoint
Line1(0).Y1 = P_3D(0).y + StartPoint
Line1(0).X2 = P_3D(1).x + StartPoint
Line1(0).Y2 = P_3D(1).y + StartPoint Line1(1).X1 = P_3D(0).x + StartPoint
Line1(1).Y1 = P_3D(0).y + StartPoint
Line1(1).X2 = P_3D(2).x + StartPoint
Line1(1).Y2 = P_3D(2).y + StartPoint Line1(2).X1 = P_3D(2).x + StartPoint
Line1(2).Y1 = P_3D(2).y + StartPoint
Line1(2).X2 = P_3D(3).x + StartPoint
Line1(2).Y2 = P_3D(3).y + StartPoint Line1(3).X1 = P_3D(3).x + StartPoint
Line1(3).Y1 = P_3D(3).y + StartPoint
Line1(3).X2 = P_3D(1).x + StartPoint
Line1(3).Y2 = P_3D(1).y + StartPoint Line1(4).X1 = P_3D(4).x + StartPoint
Line1(4).Y1 = P_3D(4).y + StartPoint
Line1(4).X2 = P_3D(5).x + StartPoint
Line1(4).Y2 = P_3D(5).y + StartPoint Line1(5).X1 = P_3D(5).x + StartPoint
Line1(5).Y1 = P_3D(5).y + StartPoint
Line1(5).X2 = P_3D(7).x + StartPoint
Line1(5).Y2 = P_3D(7).y + StartPoint Line1(6).X1 = P_3D(6).x + StartPoint
Line1(6).Y1 = P_3D(6).y + StartPoint
Line1(6).X2 = P_3D(7).x + StartPoint
Line1(6).Y2 = P_3D(7).y + StartPoint Line1(7).X1 = P_3D(4).x + StartPoint
Line1(7).Y1 = P_3D(4).y + StartPoint
Line1(7).X2 = P_3D(6).x + StartPoint
Line1(7).Y2 = P_3D(6).y + StartPoint Line1(8).X1 = P_3D(2).x + StartPoint
Line1(8).Y1 = P_3D(2).y + StartPoint
Line1(8).X2 = P_3D(6).x + StartPoint
Line1(8).Y2 = P_3D(6).y + StartPoint Line1(9).X1 = P_3D(0).x + StartPoint
Line1(9).Y1 = P_3D(0).y + StartPoint
Line1(9).X2 = P_3D(4).x + StartPoint
Line1(9).Y2 = P_3D(4).y + StartPoint Line1(10).X1 = P_3D(5).x + StartPoint
Line1(10).Y1 = P_3D(5).y + StartPoint
Line1(10).X2 = P_3D(1).x + StartPoint
Line1(10).Y2 = P_3D(1).y + StartPoint Line1(11).X1 = P_3D(3).x + StartPoint
Line1(11).Y1 = P_3D(3).y + StartPoint
Line1(11).X2 = P_3D(7).x + StartPoint
Line1(11).Y2 = P_3D(7).y + StartPoint
End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim j As Double
Select Case KeyCode
Case 39 '右
j = 1 / 180 * 3.1415926
rote_y j
Case 37 '左
j = -1 / 180 * 3.1415926
rote_y j
Case 40 '下
j = -1 / 180 * 3.1415926
rote_x j
Case 38 '上
j = 1 / 180 * 3.1415926
rote_x j
End Select
Draw_3D
End Sub
Private Sub rote_y(j As Double)
'x=x*cosa+z*sina,y=y,z=-x*sina+z*cosa
Dim i As Integer
For i = 0 To 7
P_3D(i).x = P_3D(i).x * Cos(j) + P_3D(i).z * Sin(j)
P_3D(i).z = -P_3D(i).x * Sin(j) + P_3D(i).z * Cos(j)
NextEnd Sub
Private Sub rote_x(j As Double)
'x=x,y=y*cosa-z*sina,z=y*sina+z*cosa
Dim i As Integer
For i = 0 To 7
P_3D(i).y = P_3D(i).y * Cos(j) - P_3D(i).z * Sin(j)
P_3D(i).z = P_3D(i).y * Sin(j) + P_3D(i).z * Cos(j)
Next
End Sub
你这个公式我怎么越看越像(3D)Y轴旋转公式
只不过将Z替换成Y了
Picture1.Line (20, 45)-(50, 45)
End SubPrivate Sub Command2_Click()
Dim a, b, c, d As Single
a = Math.Abs(50 * Math.Cos(120) - 45 * Math.Sin(120))
b = Math.Abs(50 * Math.Sin(120) + 45 * Math.Cos(120))
c = Math.Abs(20 * Math.Cos(120) - 45 * Math.Sin(120))
d = Math.Abs(20 * Math.Sin(120) + 45 * Math.Cos(120))Picture1.Line (c, d)-(a, b)End Sub这个是旋转120度
我的那段代码前面的说明补救已经说是3D的旋转了吗,这段代码是从2D旋转改过来的,只是为了让楼主龛格例子而已,理解了在改回2D根本就是非常简单的问题,只不过我懒得改回去而已
Private Type Point_2D
x As Double
y As Double
End Type
Dim RoteCenter As Point_2D '旋转中心
Dim P_2D(2) As Point_2DPrivate Sub Form_Load()
Me.AutoRedraw = True
'Me.Cls
P_2D(0).x = 1000
P_2D(0).y = 1000
P_2D(1).x = 2000
P_2D(1).y = 2500
P_2D(2).x = 2000
P_2D(2).y = 1000
RoteCenter.x = P_2D(1).x '设定旋转中心为P_2D(1)
RoteCenter.y = P_2D(1).y
Call draw
End SubPrivate Sub draw()
Dim i As Integer
Me.CurrentX = P_2D(0).x
Me.CurrentY = P_2D(0).y
For i = 0 To 2
Me.Line -(P_2D(i).x, P_2D(i).y)
Next
Me.Line -(P_2D(0).x, P_2D(0).y)
End SubPrivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Dim j As Double
Select Case KeyCode
Case 39 '右
j = 1 / 180 * 3.1415926
rote j
Case 37 '左
j = -1 / 180 * 3.1415926
rote j
End Select
Me.Cls
Call draw
End SubPrivate Sub rote(j As Double)
'x=x*cosa+z*sina,y=y,z=-x*sina+z*cosa
Dim i As Integer
For i = 0 To 2
P_2D(i).x = P_2D(i).x - RoteCenter.x * Cos(j) + (P_2D(i).y - RoteCenter.y) * Sin(j) + RoteCenter.x
P_2D(i).y = -(P_2D(i).x - RoteCenter.x) * Sin(j) + (P_2D(i).y - RoteCenter.y) * Cos(j) + RoteCenter.y
NextEnd Sub
1、选定旋转中心点(XCen,YCen);
2、旋转点相对于中心点的自然数学坐标(X从左向右为正向,与屏幕坐标方向一致;Y从下向上为正向,与屏幕坐标相反。);
XNew=XOld-XCen
YNew=-(YOld-YCen)
3、旋转公式推导:
旋转前所处位置
ZNew=re^(ja),j=√-1 XNew=rCos(a)
YNew=rSin(a)
旋转
ZRot=re^(j(a+b)),j=√-1,b—旋转角(弧度),逆时针为正。 XRot=rCos(a+b)=r(Cos(a)Cos(b)-Sin(a)Sin(b))=XNew*Cos(b)-YNew*Sin(b)
YRot=rSin(a+b)=r(Sin(a)Cos(b)+Cos(a)Sin(b))=YNew*Cos(b)+XNew*Sin(b)
XResult=XCen+XRot
YResult=YCen-YRot