mirror of
https://github.com/QB64Official/qb64.git
synced 2024-09-04 11:10:15 +00:00
6e01fc8dce
Added new _STRCMP and _STRICMP commands for quick string comparisons. Cleaned up QB64 to finish removing the QUI (quick user insert) code and folders. Altered UCASE and LCASE routines to be faster in some situations for us.
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 |