Oxygen Basic
Programming => Problems & Solutions => Topic started by: Aurel on December 25, 2013, 01:07:01 PM
-
Hi to all...
I don't get it why i get integers and not decimal numbers ???
What i do wrong with function Rand(min,max)..
Function Randomize()
sys_Seed = GetTickcount
End Function
Function Rand(byval z1 as long, byval z2 as long) as long
Long rnd
mov eax,z2
sub eax,z1
Inc eax
imul edx,sys_Seed,0x8088405
Inc edx
mov sys_Seed,edx
mul edx
add edx,z1
mov rnd,edx
Function = rnd
End Function
'gui-skeleton app
$ Filename "fern3.exe"
Include "RTL32.inc"
Include "awinh.inc"
#lookahead
INT win,win2
INT x,y,w,h,x2,y2,w2,h2
x=0:y=0:w=400:h=700
x2=410:y2=10:w2=400:h2=300
INT winstyle,wstyle2
winstyle = WS_MINMAXSIZE or WS_CLIPCHILDREN
wstyle2 = WS_MINMAXSIZE or WS_CLIPCHILDREN
INT b0ID = 100
'##### GLOBALS ###############################################
INT hdc, hdcMem, hbmMem, oldBmp, oldBrush, oldPen, oldFont, fColor
INT textX,textY,hBrush
String tBuffer
'##############################################################
'create window **************************************************
win = SetWindow("Fern3",x,y,w,h,0,winstyle)
'print "WIN:" +str(win)
'Randomize()
InitDrawing()
Int n
float r,x,y,x1,y1
for n = 1 to 5000
'Randomize()
r = rand(0,0.8)
if r < 0.01
x = 0.3
y = 0.16 * y
goto toend
end if
if r < 0.08
x = 0.22 * x - 0.26 * y
y = 0.23 * x + 0.22 * y + 1.6
goto toend
end if
if r < 0.15
x = -0.15 * x + 0.28 * y
y = 0.26 * x + 0.24 * y + 0.44
goto toend
end if
x = 0.85 * x + 0.04 * y
y = -0.04 * x + 0.85 * y + 1.6
toend:
x1 = (x + 3) * 70
y1 = 600 - y * 70
pset win, x1,y1
Next n
'/////////
Wait()
'\\\\\\\\\
Function WndProc (sys hwnd,wmsg,wparam,lparam) as sys callback
SELECT hwnd
'----------------------------------------
CASE win
'----------------------------------------
Select wmsg
CASE WM_CLOSE
DestroyWindow win
'Clean DC objects
CleanUp()
PostQuitMessage 0
CASE WM_SIZE
'get current size of window
GetSize(win,0,0,w,h)
',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
CASE WM_PAINT
' //only blit under WM_PAINT - can be created under messge loop to //
' blit the now completed screen view back to the window...
BitBlt(hDC, 0, 0, w, h, hdcMem, 0, 0, SRCCOPY)
',,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
CASE WM_COMMAND
controlID = LoWord(wParam) 'get control ID
notifyCode = HiWord(wParam) 'get notification message
Select controlID
CASE b0ID
If notifycode=0
MsgBox "Close New Window!","To Win2"
'CloseWindow(win2)
End If
End Select
End select
END SELECT
RETURN Default
END FUNCTION
'----------------------------------------------------
'##########################################################
SUB TextColor (wID as INT,byval frontColor as sys,byval backColor as sys )
hdc = GetDC(wID)
fColor=frontColor
SetTextColor( hDC, frontColor)
SetBkColor( hDC, backColor)
BitBlt(hDCmem, 0, 0, w, h, hdc, 0, 0, SRCCOPY)
ReleaseDC( wID, hdc)
END SUB
'########################################################
SUB TextOn(wID as INT,tx as INT,ty as INT,byval txt as string)
hdc = GetDC(wID)
'draw text to screen DC
TextOut hdc,tx,ty,txt,Len(txt)
'blit screen DC to memDC
BitBlt(hDCmem, 0, 0, w, h, hdc, 0, 0, SRCCOPY)
ReleaseDC( wID, hdc)
END SUB
'-------------------------------------------------
SUB Pset (wID as int , px as int ,py as int)
hdc = GetDC(wID)
SetPixel ( hdc, px, py, fColor)
BitBlt(hDCmem, 0, 0, w, h, hdc, 0, 0, SRCCOPY)
ReleaseDC( wID, hdc)
END SUB
'----------------------------------------------------------------
SUB LineXY (wID as INT,Lx as INT,Ly as INT,Lx1 as INT,Ly1 as INT)
hdc = GetDC(wID)
SelectObject(hdc, CreatePen(PS_SOLID,1,fColor))
MoveToEx (hdc,Lx,Ly,ByVal 0)
LineTo (hdc,Lx1,Ly1)
BitBlt(hDCmem, 0, 0, w, h, hdc, 0, 0, SRCCOPY)
ReleaseDC( wID, hdc)
END SUB
'------------------------------------------------------
SUB InitDrawing
''get current size of window
GetSize(win,0,0,w,h)
'get window DC
hdc=GetDC(win)
hdcMem = CreateCompatibleDC(0)
hbmMem = CreateCompatibleBitmap(hdc, w, h)
oldBmp = SelectObject( hdcMem, hbmMem )
oldBrush = SelectObject(hdcMem, CreateSolidBrush( RGB(231,223,231)) )
oldPen = SelectObject(hdcMem, CreatePen(PS_SOLID,1,RGB(231,223,231)))
'fill rectangle memDC with brush color
FillRect ( hdcMem,rc, oldBrush)
SetTextColor( hDC,RGB(0,0,0))
SetBkColor( hDC, RGB(231,223,231))
'blit to memDC
BitBlt(hDCmem, 0, 0, w, h, hdc, 0, 0, SRCCOPY)
ReleaseDC( win, hdc)
End SUB
'##########################################################
SUB CleanUp
DeleteDC(hdcMem)
DeleteObject(SelectObject(hdcMem, oldBrush))
DeleteObject(SelectObject(hdcMem, oldPen))
DeleteObject(SelectObject(hdcMem, oldBmp))
END SUB
-
Hi Aurel,
What are doing here ?
'Randomize()
r = rand(0,0.8)
Rand works only with int/long/sys. I see a float value here.
To get float values with the Rand Function, you can something do like: Rand(1,8)/10 Result 0.1 - 0.8
-
Hi Peter
yes Rand return only integers so you suggest me to
devide with /10 or /100 if i need decimal values...right?
so if i want create Rnd function from 0 to 1
with what i must devide ???
i mean which resolution is the best ?
Peter
Look what i get if i devide with Rand(0,10)/10 ::)
.
-
Hi Aurel,
A little bit meditation wouldn't be bad.
You get 0 - 0.9 !
You have to take a variable type of single, not int.
You got it now ?
-
ok
so i need single no float
and as you see i use float
-
single and float are the same here!
Do not use single or float variables for Rand !
Do this here: single r = Rand(0,10) /1000
0 and 10 are sys/int/long types.
-
Peter
yes i use like this but i still get just one side of fern tree
i still dont get it why ???
float r,x,y,x1,y1
for n = 1 to 5000
r = Rand(0,9)/10
if r < 0.01
x = 0.0
y = 0.16 * y
goto toend
end if
if r < 0.08
x = 0.22 * x - 0.26 * y
y = 0.23 * x + 0.22 * y + 1.6
goto toend
end if
if r < 0.15
x = -0.15 * x + 0.28 * y
y = 0.26 * x + 0.24 * y + 0.44
goto toend
end if
x = 0.85 * x + 0.04 * y
y = -0.04 * x + 0.85 * y + 1.6
toend:
x1 = (x + 3) * 70
y1 = 700 - y * 70
pset win, x1,y1
Next n
-
Hi Aurel,
You are doing this here:
r = Rand(0,9)/10
if r < 0.01
This is wrong!
You must divide by 100! not by 10!
-
Float Random Test
include "sw.inc"
Window 320,240,1
For i=0 to 19
Single a = Rnd(0,9)/100
iF a=0
Text 10,i*12, "0.00" + " Float Random",0
Else
Text 10,i*12,str(a,4) + " Float Random",0
End iF
Next
WaitKey
CloseWindow
-
Here is a float rnd()
sys seed=0x12345678 'a non zero number
function rnd() as single
static single d=1/0x7fffffff
seed=(seed<<<7)*13
return d*seed '-1.0 to 1.0
'return abs(d*seed) ' 0.0 to 1.0
end function
-
Thanks Charles !
This function work excellent :)
function rnd(float d) as float
d=1/0x7fffffff
seed=(seed<<<7)*13
'return d*seed '-1.0 to 1.0
return abs(d*seed) ' 0.0 to 1.0
end function
-
SimpleWindow has also a RndF Function 0.0 to 1.0
-
Aurel Fern with the last new oxygen Dll.
include "sw.inc"
Window 450,700,1
single x, y, r, n, x1, y1
Cls sw_brown
For n=1 to 250000
r = RndF
iF r < 0.01
x = 0
y = 0.16 * y
goto away
End iF
iF r < 0.08
x = 0.2 * x - 0.26 * y
y = 0.23 * x + 0.22 * y + 1.6
goto away
End iF
iF r < 0.15
x = -0.15 * x + 0.28 * y
y = 0.26 * x + 0.24 * y + 0.44
goto away
End iF
x = 0.85 * x + 0.04 * y
y = -0.04 * x + 0.85 * y + 1.6
.away
x1 = (x + 3) * 70
y1 = 700 - y * 70
DrawPoint x1, y1, 1,1, RGB 0,255,5
Next
WaitKey
CloseWindow
.
-
A better program flow.
include "sw.inc"
Window 450,700,1
single x, y, r, n, x1, y1
Cls 0
For n=1 to 250000
r = RndF
iF r < 0.01
x = 0
y = 0.16 * y
Else iF r < 0.08
x = 0.2 * x - 0.26 * y
y = 0.23 * x + 0.22 * y + 1.6
Else iF r < 0.15
x = -0.15 * x + 0.28 * y
y = 0.26 * x + 0.24 * y + 0.44
Else
x = 0.85 * x + 0.04 * y
y = -0.04 * x + 0.85 * y + 1.6
End iF
x1 = (x + 3) * 70
y1 = 700 - y * 70
DrawPoint x1, y1, 1,1, RGB 0,255,5
Next
WaitKey
CloseWindow