S.15 Double Toruses (Tori)

目次のページ; 前のページ; 次のページ

Public Sub Proc15() 'Double torus
    Dim id
    Dim r1, r2, k1, k2, ip, lastp, zzzw, ippw
    Dim th1, th2, th3, xs1, ys1, xs2, ys2, xs3, ys3, xs4, ys4
    Dim thz, thy, x1, y1, zw, xw
    Dim xs(50, 17), ys(50, 17), zs(50, 17), zc(50, 17)
    Dim zzz(), ipp()
    Dim points(4) As POINTAPI
    r1 = 150: r2 = 50: k1 = 24: k2 = 16
    lastp = 2 * k1 * k2
    ReDim zzz(lastp), ipp(lastp)
    Select Case Ivar
        Case 1: thy = 0.2: th3 = 0
        Case 2: thy = 0.6: th3 = 0
        Case 3: thy = 0.6: th3 = 1
        Case 4: thy = -0.6: th3 = 1
        Case Else: thy = 0.2: th3 = 0
    End Select
    Dperas
    Dpwind 0, 0, 640
'------ Camera Position
    CamP(1) = 1200
    CamP(2) = 0
    CamP(3) = 0
    Dpcam 0.6, 0, Flen
    Dpwind 0, 0, 640
    N = 0
    For id = -1 To 1 Step 2
        For th1 = 0 To 2 * pie + 0.1 Step 2 * pie / k1
            N = N + 1: m = 0
            For th2 = 0 To 2 * pie + 0.1 Step 2 * pie / k2
                m = m + 1
                Y = r1 + r2 * Cos(th2)
                z = r2 * Sin(th2)
                X = 0
                thz = th1
                Rotz X, Y, X, Y, thz
                Y = Y + r1 / 2 * id
                If id = 1 Then
                    zw = z: xw = X
                    z = zw * Cos(pie / 2) - xw * Sin(pie / 2)
                    X = zw * Sin(pie / 2) + xw * Cos(pie / 2)
                End If
                thz = th3
                Rotz X, Y, X, Y, thz
                
                Roty z, X, z, X, thy
                
                Projection X, Y, z
                ys(N, m) = Gxxx
                zs(N, m) = Gyyy
                xs(N, m) = X
            Next th2
        Next th1
    Next id
'------ distance from the camera
    ip = 1
    For N = 1 To k1 * 2 + 1
        If N <> k1 + 1 Then
            For m = 1 To k2
                zc(N, m) = (xs(N, m) + xs(N + 1, m + 1)) / 2
                zzz(ip) = zc(N, m): ipp(ip) = ip
                ip = ip + 1
            Next m
        End If
    Next N
'sort---------------------------------
    For i = 2 To lastp
        For j = i - 1 To 1 Step -1
            If zzz(j) > zzz(j + 1) Then
                zzzw = zzz(j): zzz(j) = zzz(j + 1): zzz(j + 1) = zzzw
                ippw = ipp(j): ipp(j) = ipp(j + 1): ipp(j + 1) = ippw
            End If
        Next j
    Next i
'draw--------------------------------
    For ip = 1 To lastp
            N = Int((ipp(ip) - 1) / k2) + 1
            If N > k1 Then N = N + 1
            m = (ipp(ip) - 1) Mod k2 + 1
            xs1 = ys(N, m): ys1 = zs(N, m)
            xs2 = ys(N + 1, m): ys2 = zs(N + 1, m)
            xs3 = ys(N + 1, m + 1): ys3 = zs(N + 1, m + 1)
            xs4 = ys(N, m + 1): ys4 = zs(N, m + 1)
            If Int((ys4 - ys2) * (xs3 - xs1) + _
                 (ys3 - ys1) * (xs2 - xs4)) > 100 Then
                points(1).X = Ipixelx(xs1)
                points(2).X = Ipixelx(xs2)
                points(3).X = Ipixelx(xs3)
                points(4).X = Ipixelx(xs4)
                points(1).Y = Ipixely(ys1)
                points(2).Y = Ipixely(ys2)
                points(3).Y = Ipixely(ys3)
                points(4).Y = Ipixely(ys4)
                Dpolyg points, 4
            End If
    Next ip
    Dptext 150, 200, ("thy=" + CStr(thy))
End Sub

次のページ