1
1
Fork 0
mirror of https://github.com/QB64-Phoenix-Edition/QB64pe.git synced 2024-07-03 13:31:23 +00:00
QB64-PE/programs/samples/pete/vektor.bas

365 lines
7.4 KiB
QBasic
Raw Blame History

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