Here we go, I want to rotate a squared matrix by 90 degrees right or left selected first by the user within a bigger matrix.
How can I achieve this in QBasic? I'm asking this because I have this small program I made to edit images and I have a fonction included in this program that allow to do such rotations. However, it doesn't work very well. Here is the part of the code that does the "capture" of the selection in order to flip it or rotate it:
x% / 3 and y% / 3 are the upper left corner of the selection
mx% / 3 and my% / 3 are the bottom right of the selection
xmax% / 3 and ymax% / 3 are the bottom right of the image it self
The variables are divided by 3 because of the image is seen through a big grid where each pixel is 200% bigger than normal.
Code: Select all
flip.rotate:
IF x% = xmax% - 3 OR y% = ymax% - 3 THEN GOTO 11
COLOR 10
LOCATE 23, 1
SELECT CASE A$
CASE "H": PRINT "Define area for horizontal flip..."
CASE "V": PRINT "Define area for vertical flip..."
CASE "R": PRINT "Define area for rotation..."
END SELECT
COLOR 15
B$ = "": mx% = x%: my% = y%: x% = x% + 6: y% = y% + 6
DO
LOCATE 23, 36: PRINT " ": LOCATE 23, 36
IF A$ = "H" OR A$ = "V" THEN
PRINT LTRIM$(STR$((x% - mx%) / 3)) + "x" + LTRIM$(STR$((y% - my%) / 3))
ELSE
PRINT LTRIM$(STR$((x% - mx%) / 3)) + CHR$(253)
END IF
GET (mx% + (x% - mx%) / 2 - 2, my% + (y% - my%) / 2 - 2)-(mx% + (x% - mx%) / 2 + 2, my% + (y% - my%) / 2 + 2), buffer
DO WHILE B$ = ""
FOR i% = 0 TO 1
LINE (mx%, my%)-(x%, y%), 15 * i%, B
LINE (mx% + (x% - mx%) / 2, my% + (y% - my%) / 2 - 2)-(mx% + (x% - mx%) / 2, my% + (y% - my%) / 2 + 2), 15 * i%, B
LINE (mx% + (x% - mx%) / 2 - 2, my% + (y% - my%) / 2)-(mx% + (x% - mx%) / 2 + 2, my% + (y% - my%) / 2), 15 * i%, B
FOR j% = 1 TO 300
B$ = INKEY$
IF B$ <> "" THEN EXIT FOR
NEXT j%
IF B$ <> "" THEN EXIT FOR
NEXT i%
LOOP
LINE (mx%, my%)-(x%, y%), 19, B
PUT (mx% + (x% - mx%) / 2 - 2, my% + (y% - my%) / 2 - 2), buffer, PSET
B$ = UCASE$(B$)
SELECT CASE B$
CASE CHR$(0) + CHR$(72): GOSUB check.up: IF A$ = "R" THEN GOSUB check.left
CASE CHR$(0) + CHR$(80):
GOSUB check.down
IF A$ = "R" THEN
GOSUB check.right
IF mx% - my% <> x% - y% THEN x% = mx% + 6: y% = my% + 6
END IF
CASE CHR$(0) + CHR$(77):
GOSUB check.right
IF A$ = "R" THEN
GOSUB check.down
IF mx% - my% <> x% - y% THEN x% = mx% + 6: y% = my% + 6
END IF
CASE CHR$(0) + CHR$(75): GOSUB check.left: IF A$ = "R" THEN GOSUB check.up
CASE CHR$(13): EXIT DO
CASE CHR$(27): x% = mx%: y% = my%: GOTO 10
END SELECT
B$ = ""
LOOP
LINE (mx%, my%)-(x%, y%), 15, B
IF A$ = "H" OR A$ = "V" THEN
COLOR 10
LOCATE 23, 1
PRINT "Mirror effect (Y/N)? "
B$ = ""
DO WHILE B$ = ""
B$ = UCASE$(INKEY$)
IF B$ <> "" THEN IF B$ <> "Y" AND B$ <> "N" THEN B$ = ""
LOOP
LOCATE 23, 22: PRINT B$
mirror% = ASC(B$) \ 89
END IF
IF A$ = "R" THEN
COLOR 10
LOCATE 23, 1
PRINT "Rotate which way: (R)ight or (L)eft? "
B$ = ""
DO WHILE B$ = ""
B$ = UCASE$(INKEY$)
IF B$ <> "" THEN IF B$ <> "R" AND B$ <> "L" THEN B$ = ""
LOOP
LOCATE 23, 38: PRINT B$
END IF
COLOR 15
LINE (mx% + (x% - mx%) / 2, my% + (y% - my%) / 2 - 2)-(mx% + (x% - mx%) / 2, my% + (y% - my%) / 2 + 2), 19, B
LINE (mx% + (x% - mx%) / 2 - 2, my% + (y% - my%) / 2)-(mx% + (x% - mx%) / 2 + 2, my% + (y% - my%) / 2), 19, B
LINE (mx%, my%)-(x%, y%), 19, B
FOR j% = mx% / 3 TO x% / 3 - 1
FOR i% = my% / 3 TO y% / 3 - 1
buffer(j%, i%) = POINT(171 + j%, 1 + i%)
NEXT i%
NEXT j%
FOR j% = mx% / 3 TO x% / 3 - 1
FOR i% = my% / 3 TO y% / 3 - 1
SELECT CASE A$
CASE "H":
IF i% < (my% / 3 + y% / 3) / (mirror% + 1) THEN
LINE (1 + j% * 3, 1 + ((my% / 3 + y% / 3) - i% - 1) * 3)-(2 + j% * 3, 2 + ((my% / 3 + y% / 3) - i% - 1) * 3), buffer(j%, i%), BF
PSET (171 + j%, 1 + (my% / 3 + y% / 3) - i% - 1), buffer(j%, i%)
END IF
CASE "V":
IF j% < (mx% / 3 + x% / 3) / (mirror% + 1) THEN
LINE (1 + ((mx% / 3 + x% / 3) - j% - 1) * 3, 1 + i% * 3)-(2 + ((mx% / 3 + x% / 3) - j% - 1) * 3, 2 + i% * 3), buffer(j%, i%), BF
PSET (171 + (mx% / 3 + x% / 3 - j% - 1), 1 + i%), buffer(j%, i%)
END IF
CASE "R":
IF B$ = "R" THEN
LINE (1 + (i% * 3), 1 + (j% * 3))-(2 + (i% * 3), 2 + (j% * 3)), buffer(j%, y% / 3 - i% - 1), BF
PSET (171 + i%, 1 + j%), buffer(j%, y% / 3 - i% - 1)
ELSE
LINE (1 + (i% * 3), 1 + (j% * 3))-(2 + (i% * 3), 2 + (j% * 3)), buffer(x% / 3 - j% - 1, i%), BF
PSET (171 + i%, 1 + j%), buffer(x% / 3 - j% - 1, i%)
END IF
END SELECT
NEXT i%
NEXT j%
x% = mx%: y% = my%
GOTO 10
Edit 2: I've decided to post my old version of the code, the one that actually works better than the new one.