FreeBasic
Главная
Вход
Регистрация
Четверг, 28.03.2024, 23:52Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Исходники » Графики (рисование графиков)
Графики
haavДата: Среда, 10.10.2012, 06:44 | Сообщение # 1
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Я уже все почти успел позабыть из школьной программы, но вот как-то парабола запомнилась biggrin .

Парабола

Code
Screen 1
Window ( -11, -10 ) - ( 3, 10)    
For x As double=-7 To -1 Step 0.001
   Var y=2*(x^2)+(16*x)+23
   PSet(x,y),2
Next
'Или проще
Window ( -10, 0 ) - ( 10, 10)    
For x As double=-3 To 3 Step 0.001
   Var y=x^2
   PSet(x,y),2
Next
Sleep




Кривая:

Code
Screen 1
Window ( -10, -10 ) - ( 10, 10)    
For x As double=0 To 3 Step 0.001
   Var y=x^2
   PSet(x,y),2
   PSet(-x,-y),2
Next
Sleep


Прикрепления: 2639850.png (15.1 Kb) · 2789130.png (13.6 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Понедельник, 15.10.2012, 07:29 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Синусоида




Автор: dodicat

Code
Dim As Integer xres,yres
screeninfo xres,yres
screenres xres,yres,32
dim as double PLOT_GRADE=4000000
#macro sketch(_function,minx,maxx,miny,maxy)
For x As Double=minx To maxx Step (maxx-minx)/PLOT_GRADE
      dim as double x1=Cdbl(xres)*(x-minx)/(maxx-minx)
      dim as double y1=Cdbl(yres)*(_function-maxy)/(miny-maxy)
      Pset(x1,y1)
Next x
#endmacro
'SAME MACRO WITH EXTERNAL DIMS
dim as double x0,x1,x2,y2
#macro sketch2(_function,minx,maxx,miny,maxy)
For x0 =minx To maxx Step (maxx-minx)/PLOT_GRADE
       x2=Cdbl(xres)*(x0-minx)/(maxx-minx)
      y2=Cdbl(yres)*(_function-maxy)/(miny-maxy)
      Pset(x2,y2)
Next x0
#endmacro

dim as double t1,t2,t3,t4
print "PRESS A KEY TO START"
sleep
t1=timer
sketch(sin(x)/x,-20,40,-1,2)
t2=timer
print "press a key"
sleep
cls
t3=timer
sketch2(sin(x0)/x0,-20,40,-1,2)
t4=timer
print "Time for internal dim ";t2-t1
print "Time for external dim ";t4-t3
Sleep
Прикрепления: 1364531.png (14.7 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Вторник, 18.12.2012, 08:25 | Сообщение # 3
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline


Автор: dodicat

Code
'============== PLOTTING MACROS  =======================
Dim  As Double fn_minx,fn_maxx,fn_miny,fn_maxy,PLOTGRADE=500
Dim  As Double vu_minx,vu_maxx,vu_miny,vu_maxy
Dim  As Double pi=4*Atn(1) 'unused here

#define map(a,b,x,c,d)  ((d)-(c))*((x)-(a))/((b)-(a))+(c)

#macro Set_Function_Limits(minimum_x,maximum_x,minimum_y,maximum_y)
fn_minx=(minimum_x)
fn_maxx=(maximum_x)
fn_miny=(minimum_y)
fn_maxy=(maximum_y)
#endmacro

#macro Set_ViewPort(LowerX,LowerY,UpperX,UpperY)
vu_minx=(LowerX)
vu_maxx=(UpperX)
vu_miny=(LowerY)
vu_maxy=(UpperY)
#endmacro

#macro plot(A_FUNCTION,colour)
Scope
      Var switch=0
      For x As Double =fn_minx To fn_maxx Step(fn_maxx-fn_minx)/PLOTGRADE
          Var xp=map(fn_minx,fn_maxx,x,Vu_minx,Vu_maxx)
          Var yp=map(fn_maxy,fn_miny,(A_Function),Vu_miny,Vu_maxy)
          If yp>Vu_minY And yp<Vu_maxy Then   
              If switch=0 Then
                  Pset (xp,yp),(colour)
                  switch=1
              Else
                  Line -(xp,yp),(colour)     
              End If
          End If
      Next x
End Scope
#endmacro

#macro Draw_Axis(colour)
If Sgn(fn_miny)<>Sgn(fn_maxy) Then
      Var xp=map(fn_minx,fn_maxx,fn_minx,Vu_minx,Vu_maxx)
      Var yp=map(fn_maxy,fn_miny,0,Vu_miny,Vu_maxy)
      Pset(xp,yp),(colour)
      xp=map(fn_minx,fn_maxx,fn_maxx,Vu_minx,Vu_maxx)
      yp=map(fn_maxy,fn_miny,0,Vu_miny,Vu_maxy)
      Line -(xp,yp),(colour)
End If
If Sgn(fn_minx)<>Sgn(fn_maxx) Then
      Var xp=map(fn_maxx,fn_minx,(fn_minx+fn_maxx),Vu_minx,Vu_maxx)
      Var yp=map(fn_maxy,fn_miny,fn_miny,Vu_miny,Vu_maxy)
      Pset(xp,yp),(colour)
      xp=map(fn_maxx,fn_minx,(fn_minx+fn_maxx),Vu_minx,Vu_maxx)
      yp=map(fn_maxy,fn_miny,fn_maxy,Vu_miny,Vu_maxy)
      Line -(xp,yp),(colour)
End If
#endmacro
#macro Add_Info(a_function,colour)
Draw String(vu_minx+2,vu_miny+20),#a_function,(colour)
Draw String(vu_minx,(vu_miny+vu_maxy+2)/2),Str(fn_minx),(colour)
Draw String(vu_maxx-8-8*(Len(Str(fn_maxx))),(vu_miny+vu_maxy)/2),Str(fn_maxx),(colour)
Draw String((vu_minx+vu_maxx)/2-4*Len(Str(fn_maxy)),vu_miny),Str(fn_maxy),(colour)
Draw String((vu_minx+vu_maxx)/2-4*Len(Str(fn_miny)),vu_maxy-14),Str(fn_miny),(colour)
#endmacro

#macro Draw_Viewport(BorderColour,PortColour)
Line(Vu_minx,Vu_miny)-(Vu_maxx,Vu_maxy),(PortColour),bf
Line(Vu_minx,Vu_miny)-(Vu_maxx,Vu_maxy),(BorderColour),b
#endmacro

#macro Get_Y_Limits(a_function,a_range,miny,maxy)
Scope
      Dim As Double min=1e9,max=-1e9
      For x As Double=a_range Step 1/plotgrade
          Var f=(a_function)
          If min>f Then min=f
          If max<f Then max=f
      Next x
      maxy=max:miny=min
End Scope
#endmacro

'not used here
#macro Get_Roots(a_function,range)
print "Roots"
scope
       dim as double lead,lag,flag
      for x as double=range  step 1/PLOTGRADE
          lead=(a_function)
          if sgn(lead)<>sgn(lag) or lead=0 then
          Var xp=map(fn_minx,fn_maxx,x,Vu_minx,Vu_maxx)
          Var yp=map(fn_maxy,fn_miny,(A_Function),Vu_miny,Vu_maxy)
          if flag then
              print x
              circle(xp,yp),5
              end if
              end if
          lag=lead
          flag=1
      next x
      end scope
      #endmacro
' ==============================================================

function squarewave(x as double)as double   
      dim f as double
      for n as double=1 to 40 step 2
          f=f+sin(n*x)/n
      next n
      f=.5-(2/3.142)*f
      return f
end function
                          'YOUR FUNCTION
#define MYFUNCTION squarewave(x)   

Screen 20,32

Dim As Double minx,maxx
Dim As Double miny,maxy
'Set the x range limits
minx=-15
maxx=15

'miny=-1 'set y values  here if you don't want to use Get_Y_Limits()
'maxy=2
PLOTGRADE=500 'doesn't pset each point, but joins points by lines
                 'SO, ~500 little lines draw the curve
'Using all the macro's
Set_Viewport(200,100,900,700)

Draw_Viewport(Rgb(0,200,0),Rgb(50,50,50))

Get_Y_Limits(MYFUNCTION,minx To maxx,miny,maxy)'Automate the y range limits into miny and maxy

Set_Function_limits(minx,maxx,miny,maxy)   

Draw_Axis(Rgb(200,0,0))

Add_Info(MYFUNCTION,Rgb(200,200,200)) 'puts some numbers in the viewport

plot(MYFUNCTION,Rgb(255,255,255))

Sleep
Прикрепления: 9477244.png (23.5 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Вторник, 18.12.2012, 08:27 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline


Автор: dodicat

Code
'============== PLOTTING MACROS  =======================
Dim  As Double fn_minx,fn_maxx,fn_miny,fn_maxy,PLOTGRADE=500
Dim  As Double vu_minx,vu_maxx,vu_miny,vu_maxy
Dim  As Double pi=4*Atn(1) 'unused here

#define map(a,b,x,c,d)  ((d)-(c))*((x)-(a))/((b)-(a))+(c)

#macro Set_Function_Limits(minimum_x,maximum_x,minimum_y,maximum_y)
fn_minx=(minimum_x)
fn_maxx=(maximum_x)
fn_miny=(minimum_y)
fn_maxy=(maximum_y)
#endmacro

#macro Set_ViewPort(LowerX,LowerY,UpperX,UpperY)
vu_minx=(LowerX)
vu_maxx=(UpperX)
vu_miny=(LowerY)
vu_maxy=(UpperY)
#endmacro

#macro plot(A_FUNCTION,colour)
'draws plot by lines instead of psetting each point
Scope
     Var switch=0
     For x As Double =fn_minx To fn_maxx Step(fn_maxx-fn_minx)/PLOTGRADE
         Var xp=map(fn_minx,fn_maxx,x,Vu_minx,Vu_maxx)
         Var yp=map(fn_maxy,fn_miny,(A_Function),Vu_miny,Vu_maxy)
         If yp>Vu_minY And yp<Vu_maxy Then  
             If switch=0 Then
                 Pset (xp,yp),(colour)
                 switch=1
             Else
                 Line -(xp,yp),(colour)    
             End If
         End If
     Next x
End Scope
#endmacro

#macro Draw_Axis(colour)
If Sgn(fn_miny)<>Sgn(fn_maxy) Then
     Var xp=map(fn_minx,fn_maxx,fn_minx,Vu_minx,Vu_maxx)
     Var yp=map(fn_maxy,fn_miny,0,Vu_miny,Vu_maxy)
     Pset(xp,yp),(colour)
     xp=map(fn_minx,fn_maxx,fn_maxx,Vu_minx,Vu_maxx)
     yp=map(fn_maxy,fn_miny,0,Vu_miny,Vu_maxy)
     Line -(xp,yp),(colour)
End If
If Sgn(fn_minx)<>Sgn(fn_maxx) Then
     Var xp=map(fn_maxx,fn_minx,(fn_minx+fn_maxx),Vu_minx,Vu_maxx)
     Var yp=map(fn_maxy,fn_miny,fn_miny,Vu_miny,Vu_maxy)
     Pset(xp,yp),(colour)
     xp=map(fn_maxx,fn_minx,(fn_minx+fn_maxx),Vu_minx,Vu_maxx)
     yp=map(fn_maxy,fn_miny,fn_maxy,Vu_miny,Vu_maxy)
     Line -(xp,yp),(colour)
End If
#endmacro
#macro Add_Info(a_function,colour)
Draw String(vu_minx+2,vu_miny+20),#a_function,(colour)
Draw String(vu_minx,(vu_miny+vu_maxy+2)/2),Str(fn_minx),(colour)
Draw String(vu_maxx-8-8*(Len(Str(fn_maxx))),(vu_miny+vu_maxy)/2),Str(fn_maxx),(colour)
Draw String((vu_minx+vu_maxx)/2-4*Len(Str(fn_maxy)),vu_miny),Str(fn_maxy),(colour)
Draw String((vu_minx+vu_maxx)/2-4*Len(Str(fn_miny)),vu_maxy-14),Str(fn_miny),(colour)
#endmacro

#macro Draw_Viewport(BorderColour,PortColour)
Line(Vu_minx,Vu_miny)-(Vu_maxx,Vu_maxy),(PortColour),bf
Line(Vu_minx,Vu_miny)-(Vu_maxx,Vu_maxy),(BorderColour),b
#endmacro

#macro Get_Y_Limits(a_function,a_range,miny,maxy)
Scope
     Dim As Double min=1e9,max=-1e9
     For x As Double=a_range Step 1/plotgrade
         Var f=(a_function)
         If min>f Then min=f
         If max<f Then max=f
     Next x
     maxy=max:miny=min
End Scope
#endmacro

#macro Get_Roots(a_function,range)
print "Roots"
scope
      dim as double lead,lag,flag
     for x as double=range  step 1/PLOTGRADE
         lead=(a_function)
         if sgn(lead)<>sgn(lag) or lead=0 then
         Var xp=map(fn_minx,fn_maxx,x,Vu_minx,Vu_maxx)
         Var yp=map(fn_maxy,fn_miny,(A_Function),Vu_miny,Vu_maxy)
         if flag then
             print x
             circle(xp,yp),5
             end if
             end if
         lag=lead
         flag=1
     next x
     end scope
     #endmacro
' ==============================================================

                         'YOUR FUNCTION
#define MYFUNCTION sin(2*x)*(x^4-10*x^3+2*x^2-7*x)-200   

Screen 20,32

Dim As Double minx,maxx
Dim As Double miny,maxy
'Set the x range limits
minx=-5
maxx=10
'if you set the y range limits here then no need to Get_Y_Limits
miny=0
maxy=0
PLOTGRADE=500 'doesn't pset each point, but joins points by lines
                'SO, ~500 little lines draw the curve
'Using all the macro's
Set_Viewport(200,100,900,700)

Draw_Viewport(Rgb(0,200,0),Rgb(50,50,50))

Get_Y_Limits(MYFUNCTION,minx To maxx,miny,maxy)'Automate the y range limits into miny and maxy

Set_Function_limits(minx,maxx,miny,maxy)       'set the function limits  

Draw_Axis(Rgb(200,0,0))

Add_Info(MYFUNCTION,Rgb(200,200,200)) 'puts some numbers in the viewport

plot(MYFUNCTION,Rgb(255,255,255))

PLOTGRADE=2000 'increase the grade to fine tune for roots
Get_Roots(MYFUNCTION,minx to maxx)

Sleep
Прикрепления: 6245532.png (21.6 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Вторник, 18.12.2012, 08:31 | Сообщение # 5
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline


Autor: Richard

Code
Dim As Double Pi = 4 * Atn(1)

Screenres 800, 600, 4           ' set window size and depth
Window (-Pi, -1.5)-(Pi, +1.5)   ' set scale for graphics window

Line (0, -1.5)-(0, 1.5), 7
Line (-Pi, 0)-(Pi, 0), 7
Line (-Pi, -1)-(Pi, -1), 2
Line (-Pi, 1)-(Pi, 1), 2
Draw String (0, 0), "Origin", 7
Draw String (0, 1), "+1", 7
Draw String (0,-1), "-1", 7
Draw String (-Pi, 0), "-Pi", 7

Dim As Double theta
For theta = -Pi To Pi Step .001
     Pset(theta, Cos(theta) ), 14
     Pset(theta, Sin(theta) ), 13
Next theta

Sleep
Прикрепления: 7435477.png (20.7 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Вторник, 18.12.2012, 08:32 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline


Autor: BasicCoder2

Code
screenres 640,480,32
const KK = .0174533   'convert degrees to radians for sin and cos
dim as double multX
multX = 640/360       'max width = 640  and maximum value = 360
line (0,240)-(639,240),rgb(127,127,127)
for i as double = 0 to 360
     pset (i*multX,cos(i*KK)*50+240),rgb(255,0,0)  ' red plot    (240 is half of height)
     pset (i*multX,sin(i*KK)*50+240),rgb(0,255,0)  ' green plot
next i
Sleep
Прикрепления: 8771903.png (9.1 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Вторник, 18.12.2012, 08:34 | Сообщение # 7
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline


Автор: dodicat

Code
'============== PLOTTING MACROS  =======================
dim shared as double fn_minx,fn_maxx,fn_miny,fn_maxy,PLOTGRADE=2000
dim shared as double vu_minx,vu_maxx,vu_miny,vu_maxy
dim shared as double pi=4*atn(1)
#define map(a,b,x,c,d)  ((d)-(c))*((x)-(a))/((b)-(a))+(c)

#macro function_limits(minimum_x,maximum_x,minimum_y,maximum_y)
fn_minx=(minimum_x)
fn_maxx=(maximum_x)
fn_miny=(minimum_y)
fn_maxy=(maximum_y)
#endmacro

#macro Set_ViewPort(LowerX,LowerY,UpperX,UpperY)
vu_minx=(LowerX)
vu_maxx=(UpperX)
vu_miny=(LowerY)
vu_maxy=(UpperY)
'vu_minx=(LowerX)
#endmacro
#macro plot(A_FUNCTION,colour)
print #A_Function
'line(Vu_minx,Vu_miny)-(Vu_maxx,Vu_maxy),(colour),b 'optional viewport border
for x as double=fn_minx to fn_maxx step(fn_maxx-fn_minx)/PLOTGRADE
     var xp=map(fn_minx,fn_maxx,x,Vu_minx,Vu_maxx)
     var yp=map(fn_maxy,fn_miny,(A_Function),Vu_miny,Vu_maxy)
     if yp>Vu_minY and yp<Vu_maxy then pset (xp,yp),(colour)
next x
#endmacro

#macro Draw_Viewport(BorderColour,PortColour)
line(Vu_minx,Vu_miny)-(Vu_maxx,Vu_maxy),(PortColour),bf
line(Vu_minx,Vu_miny)-(Vu_maxx,Vu_maxy),(BorderColour),b
#endmacro

#macro getlimits(a_function,a_range,miny,maxy)
scope
     dim as double min=1000000,max=-1000000
     for x as double=a_range step 1/plotgrade
         var f=(a_function)
         if min>f then min=f
         if max<f then max=f
         next x
maxy=max:miny=min
end scope
#endmacro
' ==============================================================

                    'YOUR FUNCTION
#define MYFUNCTION 4*sin(x)+cos(4*x)+x +7   

screen 20,32

dim as double minx=-3,maxx=3
dim as double miny,maxy

Set_Viewport(200,200,800,600)
Draw_Viewport(rgb(0,200,0),rgb(50,50,50))

getlimits(MYFUNCTION,minx to maxx,miny,maxy)'get the yrange limits into miny and maxy

function_limits(minx,maxx,miny,maxy)       'set the function limits  

plot(MYFUNCTION,rgb(255,255,255))
locate 4,30
print "MINIMUM Y  " &miny & "    MAXIMUM Y    " &maxy
sleep
   
Прикрепления: 5050879.png (18.3 Kb)


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
Форум » Freebasic » Исходники » Графики (рисование графиков)
  • Страница 1 из 1
  • 1
Поиск: