谢谢!!!

解决方案 »

  1.   

    原点旋转:
    X'=x*cos(th)-y*sin(th)
    Y'=y*sin(th)+x*cos(th)绕基准点旋转需要:平移、旋转、再平移回去
      

  2.   


            x1 = x * Cos(α) + y * Sin(α)
            y1 = -x * Sin(α) + y * Cos(α)x1 和 Y1是新的坐标,α是旋转的弧度,这个公式是绕坐标原点进行旋转,如果要绕某一确定的点,要将坐标相对该点进行坐标变换
      

  3.   

    不小心写错了
    X'=x*cos(th)-y*sin(th)
    Y'=x*sin(th)+y*cos(th)
      

  4.   

    给你一个我以前为一个帖子写的三维点旋转的例子吧。窗体中放置line控件数组,命名为line1,下标从0~11,然后粘铁下面的代码Option Explicit
    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
      

  5.   

    To chewinggum(口香糖·dotnet转型中) :
    你这个公式我怎么越看越像(3D)Y轴旋转公式
    只不过将Z替换成Y了
      

  6.   

    2D的都是以Z轴位旋转轴,旋转XY坐标
      

  7.   

    画的图形是2d的,按照上面的公式好像短很多啊。Private Sub Command1_Click()
    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度
      

  8.   

    to zyl910(910:分儿,我又来了!) 
    我的那段代码前面的说明补救已经说是3D的旋转了吗,这段代码是从2D旋转改过来的,只是为了让楼主龛格例子而已,理解了在改回2D根本就是非常简单的问题,只不过我懒得改回去而已
      

  9.   

    OK 现在再来一段二维的旋转,窗体内直接拷贝下面的代码,按左右方向键旋转三角形Option Explicit
    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
      

  10.   

    我来回答这个问题:
    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