QB64.org Forum

Active Forums => QB64 Discussion => Topic started by: Cobalt on August 21, 2021, 03:07:51 pm

Title: Why am I getting this result? [question about wrong calculations]
Post by: Cobalt on August 21, 2021, 03:07:51 pm
For some strange reason, that I can not see, I am getting a result that shouldn't be possible.
my little terrain generator should start the left side at 225 +\- 25. And there fore should not start higher than 200, but if you look at the screen cap below that left side is a heck of a lot higher than 200px. 
Can anyone see what I am missing as to why it would do this? there is not a lot of code, probably more comment than actual code.

Code: QB64: [Select]
  1. CONST TRUE = -1, FALSE = NOT TRUE
  2.  
  3.  CLS
  4.  DrawTerrain 225
  5.  _DELAY .7
  6.  
  7. SUB DrawTerrain (BaseHeight%)
  8.  StartY% = BaseHeight% + INT(RND * 50) - 25
  9.  CurrentHeight% = StartY% 'keep track of the current Y of the land
  10.  PSET (0, StartY%), 2
  11.  DO
  12.   RunLength% = INT(RND * 50) + 25 'how far does this lay run?
  13.   HeightChange% = INT(RND * 100) - 50 'where the elevation go?
  14.   CurrentHeight% = CurrentHeight% + HeightChange% 'monitor the change in the land's Y
  15.   'if the land goes to low then reverse the height change+25
  16.   IF CurrentHeight% > 320 THEN CurrentHeight% = CurrentHeight% - (HeightChange% * 2) - 25: HeightChange% = -(HeightChange% + 25)
  17.   'now check that the land does not go to high
  18.   IF CurrentHeight% < 50 THEN CurrentHeight% = CurrentHeight% + ABS(HeightChange% * 2) + 25: HeightChange% = ABS(HeightChange% + 25)
  19.  
  20.   LINE -STEP(RunLength% - 1, HeightChange%), 2 'run this section
  21.   totalrun% = totalrun% + RunLength% 'track how far along it is
  22.   IF totalrun% > 645 THEN ScreenEnd%% = TRUE 'terrain is now done.
  23.  LOOP UNTIL ScreenEnd%%
  24.  PAINT (320, 340), 2, 2 'ahh lovely green grass land!
  25.  IF POINT(1, 1) = 2 THEN CLS: DrawTerrain (basehieght%) 'whole screen is green so try again(why though?)
  26.  
Title: Re: Why am I getting this result?
Post by: bplus on August 21, 2021, 03:55:59 pm
Typo on line 28

What is leaking that causes the flood of green is the real question.
Title: Re: Why am I getting this result?
Post by: Cobalt on August 21, 2021, 04:13:59 pm
Typo on line 28

What is leaking that causes the flood of green is the real question.

Ahh! another case of staring at the code for too long. Thanks for the second set of eyes.

But yeah, not sure on the flood either, the IF\THEN that makes sure the ground doesn't go too low should prevent the PAINT from happening on the wrong side of the line. and it starts at 0 and goes to atleast 645, which should be off screen. so how the paint floods the screen is mystifying!
Title: Re: Why am I getting this result?
Post by: bplus on August 21, 2021, 04:24:51 pm
Here's one that wont flood:
Code: [Select]
Const TRUE = -1, FALSE = Not TRUE
Screen _NewImage(640, 350, 9): Cls: Randomize Timer

Do
    Cls
    DrawTerrain 225, 10
    Sleep 5
Loop Until InKey$ = Chr$(27)


Sub DrawTerrain (h, modN) ' modN for ruggedness the higher the less smooth
    For x = 0 To _Width
        If x Mod modN = 0 Then ' adjust mod number for ruggedness the higher the number the more jagged
            If h < 350 - modN And h > 50 + modN Then
                dy = Rnd * 20 - 10
            ElseIf h >= 350 - modN Then
                dy = Rnd * -10
            ElseIf h <= 50 + modN Then
                dy = Rnd * 10
            End If
        End If
        h = h + .1 * dy
        Line (x, _Height)-(x, h), 2
    Next
End Sub

Title: Re: Why am I getting this result?
Post by: bplus on August 21, 2021, 04:32:52 pm
Code: QB64: [Select]
  1. Screen _NewImage(640, 350, 32)
  2. Color , _RGB32(200, 200, 250)
  3.     Cls
  4.     DrawTerrain 100, 50, &HFF336688
  5.     DrawTerrain 150, 25, &HFF448888
  6.     DrawTerrain 200, 12, &HFF55AA88
  7.     DrawTerrain 250, 6, &HFF66CC88
  8.     DrawTerrain 300, 3, &HFF77EE88
  9.     Sleep 5
  10.  
  11. Sub DrawTerrain (h, modN, c As _Unsigned Long) ' modN for ruggedness the higher the less smooth
  12.     For x = 0 To _Width
  13.         If x Mod modN = 0 Then ' adjust mod number for ruggedness the higher the number the more jagged
  14.             If h < 350 - modN And h > 50 + modN Then
  15.                 dy = Rnd * 20 - 10
  16.             ElseIf h >= 350 - modN Then
  17.                 dy = Rnd * -10
  18.             ElseIf h <= 50 + modN Then
  19.                 dy = Rnd * 10
  20.             End If
  21.         End If
  22.         h = h + .1 * dy
  23.         Line (x, _Height)-(x, h), c
  24.     Next
  25.  
  26.  
  27.  
  28.  
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: FellippeHeitor on August 21, 2021, 06:30:51 pm
Option _Explicit. Time saver.
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: SpriggsySpriggs on August 21, 2021, 07:17:14 pm
Option _Explicit is your friend
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: bplus on August 21, 2021, 08:29:18 pm
Back to why the paint was flooding, it was because the line wasn't always getting drawn all the way to the edge of the screen:

You can see it here
Code: QB64: [Select]
  1. Const TRUE = -1, FALSE = Not TRUE
  2. 'check something
  3. 'Print _Width, _Height
  4. 'End
  5.  
  6.     Cls
  7.     DrawTerrain 225
  8.     Sleep 5
  9.  
  10. Sub DrawTerrain (BaseHeight%)
  11.     StartY% = BaseHeight% + Int(Rnd * 50) - 25
  12.     CurrentHeight% = StartY% 'keep track of the current Y of the land
  13.     PSet (0, StartY%), 2
  14.     Do
  15.         RunLength% = Int(Rnd * 50) + 25 'how far does this lay run?
  16.         HeightChange% = Int(Rnd * 100) - 50 'where the elevation go?
  17.         CurrentHeight% = CurrentHeight% + HeightChange% 'monitor the change in the land's Y
  18.         'if the land goes to low then reverse the height change+25
  19.         If CurrentHeight% > 320 Then CurrentHeight% = CurrentHeight% - (HeightChange% * 2) - 25: HeightChange% = -(HeightChange% + 25)
  20.         'now check that the land does not go to high
  21.         If CurrentHeight% < 50 Then CurrentHeight% = CurrentHeight% + Abs(HeightChange% * 2) + 25: HeightChange% = Abs(HeightChange% + 25)
  22.  
  23.         Line -Step(RunLength% - 1, HeightChange%), 2 'run this section
  24.         totalrun% = totalrun% + RunLength% 'track how far along it is
  25.         If totalrun% > 645 Then ScreenEnd%% = TRUE 'terrain is now done.
  26.     Loop Until ScreenEnd%%
  27.  
  28.     'box in the paint area, nope that wasn't it
  29.     Line (0, StartY%)-(0, _Height), 2
  30.     Line (0, _Height)-(_Width, _Height), 2
  31.     Line (_Width, 0)-(_Width, _Height), 2
  32.  
  33.  
  34.     Sleep 5 'but look before you paint
  35.  
  36.     Paint (320, 340), 2, 2 'ahh lovely green grass land!
  37.     'screw this
  38.     '''''''''If Point(1, 1) = 2 Then Cls: DrawTerrain (basehieght%) 'whole screen is green so try again(why though?)
  39.  
  40.  
  41.  
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: bplus on August 21, 2021, 08:42:38 pm
It was coming up short because of line:

Code: QB64: [Select]
  1.         LINE -STEP(RunLength% - 1, HeightChange%), 2 'run this section

the -1 was making it too short.

Code: QB64: [Select]
  1. Const TRUE = -1, FALSE = Not TRUE
  2. 'check something
  3. 'Print _Width, _Height
  4. 'End
  5.  
  6.     Cls
  7.     DrawTerrain 225
  8.     _Limit 2
  9.  
  10. Sub DrawTerrain (BaseHeight%)
  11.     StartY% = BaseHeight% + Int(Rnd * 50) - 25
  12.     CurrentHeight% = StartY% 'keep track of the current Y of the land
  13.     PSet (0, StartY%), 2
  14.     Do
  15.         RunLength% = Int(Rnd * 50) + 25 'how far does this lay run?
  16.         HeightChange% = Int(Rnd * 100) - 50 'where the elevation go?
  17.         CurrentHeight% = CurrentHeight% + HeightChange% 'monitor the change in the land's Y
  18.         'if the land goes to low then reverse the height change+25
  19.         If CurrentHeight% > 320 Then CurrentHeight% = CurrentHeight% - (HeightChange% * 2) - 25: HeightChange% = -(HeightChange% + 25)
  20.         'now check that the land does not go to high
  21.         If CurrentHeight% < 50 Then CurrentHeight% = CurrentHeight% + Abs(HeightChange% * 2) + 25: HeightChange% = Abs(HeightChange% + 25)
  22.  
  23.         Line -Step(RunLength%, HeightChange%), 2 '>>>>>>>>>>>>>>>>>>>>>> this line fixed!!!!!!!!111
  24.         totalrun% = totalrun% + RunLength% 'track how far along it is
  25.         If totalrun% > 645 Then ScreenEnd%% = TRUE 'terrain is now done.
  26.     Loop Until ScreenEnd%%
  27.  
  28.     'box in the paint area
  29.     'Line (0, StartY%)-(0, _Height), 2
  30.     'Line (0, _Height)-(_Width, _Height), 2
  31.     'Line (_Width, 0)-(_Width, _Height), 2
  32.     'Sleep 5
  33.     Paint (320, 340), 2, 2 'ahh lovely green grass land!
  34.     'screw this
  35.     '''''''''If Point(1, 1) = 2 Then Cls: DrawTerrain (basehieght%) 'whole screen is green so try again(why though?)
  36.  
  37.  
  38.  
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: TempodiBasic on August 21, 2021, 09:52:07 pm
Option explicit and Option explictiArray are 2 dear friends that help to avoid to crash own head on some kind of troubles...
So if you don't use an external IDE (Notepad++ with RhoSigma package, Dav Ide)
spent that few seconds to type Option explicitArray (if you use array) and Option Explicit as the first 2 lines of code.


Yes I can agree that you can have the sensation to code in Pascal but don't mind, you'll gain in amount of time dedicated to the family or whateveryouwant.

PS Bplus has nailed the origin of the problem a Typo error.
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: bplus on August 22, 2021, 10:26:53 am
@TempodiBasic

You might have missed the point. The typo on the line added was to try and fix the flooding problem caused by PAINT. That line would not have been needed if the PAINT floodings were fixed.

So why was the PAINT flooding? because Cobalt was subtracting 1 in his line commands meanwhile his accumulator for total distance across was getting 1 ahead each time he drew a line, so when he used more than 6 lines to go from one end to the other the PAINT leaked through right side because of gap at the edge.
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: TempodiBasic on August 22, 2021, 05:23:20 pm
@bplus
Yeah, I have verified to understand.
So the
Code: QB64: [Select]
  1.  Line -Step(RunLength%-1, HeightChange%), 2
was the origin of the error
and its solution is
Code: QB64: [Select]
  1.  Line -Step(RunLength%, HeightChange%), 2

while di typo error was in the fixing code Basehiegth% in the place of BaseHeight%.
Thanks to point this.
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: Cobalt on August 22, 2021, 06:30:33 pm
It was coming up short because of line:

Code: QB64: [Select]
  1.         LINE -STEP(RunLength% - 1, HeightChange%), 2 'run this section

the -1 was making it too short.

Wonder why it didn't fail every time?
Not that I remember why it was -1..... doesn't need to be... hmmmmm? Left overs perhaps?



Option _Explicit is your friend
Option _Explicit. Time saver.

I'll Flirt with Disaster...
I'll Court the Maidens of Doom...
But I will never sleep with the Devil. XD



"All my kingdom for some smilies!"
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: bplus on August 22, 2021, 07:13:37 pm
Quote
Wonder why it didn't fail every time?

Hi Colbalt,

Remember you added 5 to width so if the number of lines drawn was 6 or less you were covered (645-6 = 639)  but if number of lines exceeded 6 then you'd end up short of the edge.
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: bplus on August 22, 2021, 07:24:43 pm
BTW I picked up on the typo because BaseHeight% was not capitalized here:
Code: QB64: [Select]
  1. If Point(1, 1) = 2 Then Cls: DrawTerrain (basehieght%)
  2.  

It sure wasn't from spell checking :)
Title: Re: Why am I getting this result? [question about wrong calculations]
Post by: Cobalt on August 25, 2021, 11:38:41 am
BTW I picked up on the typo because BaseHeight% was not capitalized here:
Code: QB64: [Select]
  1. If Point(1, 1) = 2 Then Cls: DrawTerrain (basehieght%)
  2.  
It sure wasn't from spell checking :)

Tha'ts why I case my variables the way I do. Course after looking at code for a while everything looks the same, capitalized or not.

Still can't remember why I added that '-1'. I must have been tweaking or playing with an idea and scrapped it forgetting to take that off.(or forgetting I even added it in the first place!)

Anyway, Thanks again for the second set of eyes and catching that.