mirror of
https://github.com/QB64Official/qb64.git
synced 2024-08-30 23:30:17 +00:00
365 lines
No EOL
7.4 KiB
QBasic
365 lines
No EOL
7.4 KiB
QBasic
DECLARE SUB roteron (vinkel!)
|
||
DECLARE SUB roterhv (vinkel!)
|
||
DECLARE SUB angpunkt (nr%, x%, y%, z%)
|
||
DECLARE SUB tegnpunkt (nr%)
|
||
TYPE vektor
|
||
x AS SINGLE
|
||
y AS SINGLE
|
||
z AS SINGLE
|
||
END TYPE
|
||
|
||
TYPE poin
|
||
x AS INTEGER
|
||
y AS INTEGER
|
||
z AS INTEGER
|
||
END TYPE
|
||
|
||
|
||
PRINT "Welcome to my second go at displaying"
|
||
PRINT "points in a threedimentional space."
|
||
PRINT
|
||
PRINT "This program uses vectorcalculations"
|
||
PRINT "to calculate where a given point in"
|
||
PRINT "a virtual space should be placed on the"
|
||
PRINT "screen. The math behind the program"
|
||
PRINT "could be disciphered by someone with a"
|
||
PRINT "lot of experience with math, and if you"
|
||
PRINT "are one, please feel free to do so and"
|
||
PRINT "use it in a program of your own."
|
||
PRINT
|
||
PRINT "I can't copyright math, after all."
|
||
PRINT
|
||
PRINT "But do give me credits... :)"
|
||
PRINT
|
||
PRINT "Press any key to see instructions"
|
||
WHILE INKEY$ = "": WEND
|
||
CLS
|
||
PRINT "How to navigate in the virtual space:"
|
||
PRINT
|
||
PRINT " w These control your direction"
|
||
PRINT "a s d of view."
|
||
PRINT
|
||
PRINT "u i o These are used to move the"
|
||
PRINT "j k l point of view in the space."
|
||
PRINT
|
||
PRINT "q This is the most useful key"
|
||
PRINT " in the program. It makes it"
|
||
PRINT " go away."
|
||
PRINT
|
||
PRINT "Press any key to enter the chamber of horrors!"
|
||
WHILE INKEY$ = "": WEND
|
||
|
||
|
||
SCREEN 7, 0, 1, 0
|
||
|
||
pnkt% = 49
|
||
DIM SHARED punkt(1 TO pnkt%) AS poin
|
||
DIM SHARED perspunkt AS vektor
|
||
DIM SHARED retning AS vektor
|
||
DIM SHARED nedad AS vektor
|
||
DIM SHARED vinkel
|
||
|
||
perspunkt.x = 50
|
||
perspunkt.y = 50
|
||
perspunkt.z = 3
|
||
|
||
vinkel = 3.8
|
||
retning.x = SIN(vinkel)
|
||
retning.y = COS(vinkel)
|
||
retning.z = 0
|
||
|
||
angpunkt 1, 10, 5, 1
|
||
angpunkt 2, 10, 5, 2
|
||
angpunkt 3, 10, 5, 3
|
||
angpunkt 4, 10, 5, 4
|
||
angpunkt 5, 10, 5, 5
|
||
angpunkt 6, 10, 4, 1
|
||
angpunkt 7, 10, 4, 2
|
||
angpunkt 8, 10, 4, 3
|
||
angpunkt 9, 10, 4, 4
|
||
angpunkt 10, 10, 4, 5
|
||
angpunkt 11, 10, 3, 1
|
||
angpunkt 12, 10, 3, 2
|
||
angpunkt 13, 10, 3, 3
|
||
angpunkt 14, 10, 3, 4
|
||
angpunkt 15, 10, 3, 5
|
||
angpunkt 16, 10, 2, 1
|
||
angpunkt 17, 10, 2, 2
|
||
angpunkt 18, 10, 2, 3
|
||
angpunkt 19, 10, 2, 4
|
||
angpunkt 20, 10, 2, 5
|
||
angpunkt 21, 10, 1, 1
|
||
angpunkt 22, 10, 1, 2
|
||
angpunkt 23, 10, 1, 3
|
||
angpunkt 24, 10, 1, 4
|
||
angpunkt 25, 10, 1, 5
|
||
angpunkt 26, 10, 0, 1
|
||
angpunkt 27, 10, 0, 2
|
||
angpunkt 28, 10, 0, 3
|
||
angpunkt 29, 10, 0, 4
|
||
angpunkt 30, 10, 0, 5
|
||
angpunkt 31, 10, 1, 6
|
||
angpunkt 32, 10, 2, 6
|
||
angpunkt 33, 10, 3, 6
|
||
angpunkt 34, 10, 4, 6
|
||
angpunkt 35, 10, 5, 6
|
||
angpunkt 36, 10, -1, 1
|
||
angpunkt 37, 10, -1, 2
|
||
angpunkt 38, 10, -1, 3
|
||
angpunkt 39, 10, -1, 4
|
||
angpunkt 40, 10, -1, 5
|
||
angpunkt 41, 10, -1, 6
|
||
angpunkt 42, 10, 0, 7
|
||
angpunkt 43, 10, 1, 7
|
||
angpunkt 44, 10, 2, 7
|
||
angpunkt 45, 10, 3, 7
|
||
angpunkt 46, 10, 4, 7
|
||
angpunkt 47, 10, 5, 7
|
||
angpunkt 48, 10, -1, 7
|
||
angpunkt 49, 10, 0, 6
|
||
|
||
|
||
|
||
nedad.x = 0
|
||
nedad.y = 0
|
||
nedad.z = -1
|
||
|
||
|
||
|
||
DO
|
||
|
||
SELECT CASE INKEY$
|
||
|
||
CASE "a"
|
||
roterhv 3.141593 / 90
|
||
|
||
CASE "d"
|
||
roterhv -3.141593 / 90
|
||
|
||
CASE "w"
|
||
roteron -3.141593 / 90
|
||
|
||
CASE "s"
|
||
roteron 3.141593 / 90
|
||
|
||
CASE "i"
|
||
perspunkt.x = perspunkt.x + retning.x
|
||
perspunkt.y = perspunkt.y + retning.y
|
||
perspunkt.z = perspunkt.z + retning.z
|
||
|
||
CASE "k"
|
||
perspunkt.x = perspunkt.x - retning.x
|
||
perspunkt.y = perspunkt.y - retning.y
|
||
perspunkt.z = perspunkt.z - retning.z
|
||
|
||
CASE "l"
|
||
r1 = retning.x: r2 = retning.y: r3 = retning.z
|
||
n1 = nedad.x: n2 = nedad.y: n3 = nedad.z
|
||
x1 = n2 * r3 - n3 * r2
|
||
x2 = n3 * r1 - n1 * r3
|
||
x3 = n1 * r2 - n2 * r1
|
||
l = SQR(x1 ^ 2 + x2 ^ 2 + x3 ^ 2)
|
||
x1 = x1 / l
|
||
x2 = x2 / l
|
||
x3 = x3 / l
|
||
perspunkt.x = perspunkt.x - x1
|
||
perspunkt.y = perspunkt.y - x2
|
||
perspunkt.z = perspunkt.z - x3
|
||
|
||
CASE "j"
|
||
r1 = retning.x: r2 = retning.y: r3 = retning.z
|
||
n1 = nedad.x: n2 = nedad.y: n3 = nedad.z
|
||
x1 = n2 * r3 - n3 * r2
|
||
x2 = n3 * r1 - n1 * r3
|
||
x3 = n1 * r2 - n2 * r1
|
||
l = SQR(x1 ^ 2 + x2 ^ 2 + x3 ^ 2)
|
||
x1 = x1 / l
|
||
x2 = x2 / l
|
||
x3 = x3 / l
|
||
perspunkt.x = perspunkt.x + x1
|
||
perspunkt.y = perspunkt.y + x2
|
||
perspunkt.z = perspunkt.z + x3
|
||
|
||
CASE "u"
|
||
perspunkt.x = perspunkt.x - nedad.x
|
||
perspunkt.y = perspunkt.y - nedad.y
|
||
perspunkt.z = perspunkt.z - nedad.z
|
||
|
||
CASE "o"
|
||
perspunkt.x = perspunkt.x + nedad.x
|
||
perspunkt.y = perspunkt.y + nedad.y
|
||
perspunkt.z = perspunkt.z + nedad.z
|
||
|
||
|
||
CASE "q"
|
||
GOTO endscreen
|
||
CASE ELSE
|
||
END SELECT
|
||
|
||
FOR i% = 1 TO pnkt% STEP 1
|
||
tegnpunkt (i%)
|
||
NEXT
|
||
PCOPY 1, 0
|
||
|
||
|
||
CLS
|
||
LOOP
|
||
|
||
endscreen:
|
||
CLS
|
||
SCREEN 9
|
||
PRINT "That was my latest program."
|
||
PRINT "Programmed 10-14-05 and 10-15-05"
|
||
PRINT "Please do not use any of the program code without giving me credit"
|
||
PRINT "That's a <20>Thanks to Firngrod for ...<2E> in your programs... :)"
|
||
PRINT "I hope you enjoyed it."
|
||
PRINT
|
||
PRINT "Kindly yours:"
|
||
PRINT "Firngrod"
|
||
PRINT "Firngrod@hotmail.com"
|
||
PRINT
|
||
PRINT
|
||
PRINT "Press any key to quit."
|
||
WHILE INKEY$ = "": WEND
|
||
|
||
SUB angpunkt (nr%, x%, y%, z%)
|
||
punkt(nr%).x = x%
|
||
punkt(nr%).y = y%
|
||
punkt(nr%).z = z%
|
||
|
||
END SUB
|
||
|
||
SUB roterhv (vinkel)
|
||
|
||
r1 = retning.x
|
||
r2 = retning.y
|
||
r3 = retning.z
|
||
|
||
n1 = nedad.x
|
||
n2 = nedad.y
|
||
n3 = nedad.z
|
||
|
||
x1 = n2 * r3 - n3 * r2
|
||
x2 = n3 * r1 - n1 * r3
|
||
x3 = n1 * r2 - n2 * r1
|
||
l = SQR(x1 ^ 2 + x2 ^ 2 + x3 ^ 2)
|
||
x1 = x1 / l
|
||
x2 = x2 / l
|
||
x3 = x3 / l
|
||
|
||
|
||
Rx1 = SIN(vinkel) * x1
|
||
Rx2 = SIN(vinkel) * x2
|
||
Rx3 = SIN(vinkel) * x3
|
||
|
||
Ry1 = COS(vinkel) * r1
|
||
Ry2 = COS(vinkel) * r2
|
||
Ry3 = COS(vinkel) * r3
|
||
|
||
r1 = Rx1 + Ry1
|
||
r2 = Rx2 + Ry2
|
||
r3 = Rx3 + Ry3
|
||
|
||
retning.x = r1
|
||
retning.y = r2
|
||
retning.z = r3
|
||
|
||
END SUB
|
||
|
||
SUB roteron (vinkel)
|
||
|
||
r1 = retning.x
|
||
r2 = retning.y
|
||
r3 = retning.z
|
||
|
||
n1 = nedad.x
|
||
n2 = nedad.y
|
||
n3 = nedad.z
|
||
|
||
re1 = COS(vinkel) * r1 + SIN(vinkel) * n1
|
||
re2 = COS(vinkel) * r2 + SIN(vinkel) * n2
|
||
re3 = COS(vinkel) * r3 + SIN(vinkel) * n3
|
||
|
||
ne1 = -SIN(vinkel) * r1 + COS(vinkel) * n1
|
||
ne2 = -SIN(vinkel) * r2 + COS(vinkel) * n2
|
||
ne3 = -SIN(vinkel) * r3 + COS(vinkel) * n3
|
||
|
||
retning.x = re1
|
||
retning.y = re2
|
||
retning.z = re3
|
||
|
||
nedad.x = ne1
|
||
nedad.y = ne2
|
||
nedad.z = ne3
|
||
|
||
END SUB
|
||
|
||
SUB tegnpunkt (nr%)
|
||
|
||
'' The assigning of values
|
||
|
||
p1 = punkt(nr%).x
|
||
p2 = punkt(nr%).y
|
||
p3 = punkt(nr%).z
|
||
|
||
m1 = perspunkt.x
|
||
m2 = perspunkt.y
|
||
m3 = perspunkt.z
|
||
|
||
r1 = retning.x
|
||
r2 = retning.y
|
||
r3 = retning.z
|
||
|
||
n1 = nedad.x
|
||
n2 = nedad.y
|
||
n3 = nedad.z
|
||
|
||
|
||
'' The calculation of values
|
||
|
||
' Vektor from point of view (POV) to point i question
|
||
v1 = p1 - m1
|
||
v2 = p2 - m2
|
||
v3 = p3 - m3
|
||
|
||
' Projection of this vektor on the vektor that represents the direction of view(the DOV)
|
||
k = (v1 * r1 + v2 * r2 + v3 * r3) / (r1 ^ 2 + r2 ^ 2 + r3 ^ 2)
|
||
IF k < 0 THEN GOTO nopoint
|
||
d1 = k * r1
|
||
d2 = k * r2
|
||
d3 = k * r3
|
||
' The length of this projection-vektor
|
||
z = SQR(d1 ^ 2 + d2 ^ 2 + d3 ^ 2)
|
||
|
||
' The projection of the point on the plane that goes through the POV and is ortogonal with DOV
|
||
t = (r1 * m1 + r2 * m2 + r3 * m3 - r1 * p1 - r2 * p2 - r3 * p3) / (r1 ^ 2 + r2 ^ 2 + r3 ^ 2)
|
||
s1 = p1 + t * r1
|
||
s2 = p2 + t * r2
|
||
s3 = p3 + t * r3
|
||
|
||
' The making of the vektor from POV to (s1,s2,s3)
|
||
w1 = s1 - m1
|
||
w2 = s2 - m2
|
||
w3 = s3 - m3
|
||
|
||
' The splitting of the W vektor into vektors that represent, in a way, the placing on the dot on the screen
|
||
coss = (n1 * w1 + n2 * w2 + n3 * w3) / (SQR((n1 ^ 2 + n2 ^ 2 + n3 ^ 2) * (w1 ^ 2 + w2 ^ 2 + w3 ^ 2)))
|
||
h1 = r2 * n3 - r3 * n2
|
||
h2 = r3 * n1 - r1 * n3
|
||
h3 = r1 * n2 - r2 * n1
|
||
sinn = (h1 * w1 + h2 * w2 + h3 * w3) / (SQR((h1 ^ 2 + h2 ^ 2 + h3 ^ 2) * (w1 ^ 2 + w2 ^ 2 + w3 ^ 2)))
|
||
|
||
x = sinn * SQR(w1 ^ 2 + w2 ^ 2 + w3 ^ 2)
|
||
y = coss * SQR(w1 ^ 2 + w2 ^ 2 + w3 ^ 2)
|
||
|
||
Forsfakt! = -LOG(z / 32000) / LOG(2)
|
||
|
||
x = x * 2 ^ Forsfakt! / 100
|
||
y = y * 2 ^ Forsfakt! / 100
|
||
|
||
x = x + 320 / 2
|
||
y = y + 200 / 2
|
||
|
||
PSET (x, y), 15
|
||
nopoint:
|
||
END SUB |