Добрый вечер.
Совсем нигде нет информации про построение графиков в PB...
Помогите или ссылочками, или может кто-нибудь покажет на примере как строить самый элементарный график....
Зараннее спасибо.
помогите построить график
Страница: 1
Сообщений 1 страница 7 из 7
Поделиться121.01.2013 21:09:51
Поделиться321.01.2013 21:38:11
Как-то делал нечто подобное:
http://ompldr.org/vaDV6cw/pb_stats.rar
Запустите скрипт и в директории должен будет появиться простенький график.
Поделиться421.01.2013 21:41:30
График любой функции
Код:
FontID1 = LoadFont(0, "Verdana", 10) FontID2 = LoadFont(1, "Verdana", 7) CreateImage(0,640,480) Structure sp_ x.l y.l EndStructure Global cb.l=RGB(0,0,0) Global ca.l=RGB(0,192,192) Global cg.l=RGB(0,0,192) Global cl.l=RGB(255,255,63) Global wi=640, he=480 pp.s=Chr(10)+Chr(13) SetThreadPriority_(GetCurrentThread_(),255) Global x1.d, x2.d, y1.d, y2.d, x3.d, y3.d ;#E=2.71828182846 Enumeration ; window 1 #Text_0 #Input_1 #Frame3D_0 #Text_1 #Input_2 #Text_3 #Input_4 #Text_9 #Input_10 #Text_5 #Input_6 #Text_6 #Input_7 #Text_11 #Input_12 #Frame3D_1 #Button_0 #Button_1 #Button_2 #Button_3 #Button_4 #Button_5 #Button_6 #img #check1 #check2 EndEnumeration Procedure.d integer(x.d) If x>=0: ProcedureReturn Int(x) : Else: ProcedureReturn Int(x)-1: EndIf EndProcedure Procedure.d flo(x.d) ProcedureReturn x-integer(x) EndProcedure Procedure.d Compute(line.s) Protected w.b=0, u.s=" ", q.l Restore again For q=1 To 7 Read.s u.s If u="-" Or u="+" If FindString(line, u, 2)>0 If Mid(line,FindString(line, u, 2)-1,1)<>"e" w=1 EndIf EndIf Else If FindString(line, u, 1)>0: w=1: EndIf EndIf Next If w=0 ; it's just a number ProcedureReturn ValD(line) Else ; we'll compute it w=0 ; now it will be number of brackets For q=Len(line) To 1 Step -1 ; FROM RIGHT TO LEFT! For correct recursive calculation. u=Mid(line,q,1) ; it is a current symbol If u=")": w+1: EndIf If u="(": w-1: EndIf If w=0 ; if we are between two blocks If u="+" And Mid(line,q-1,1)<>"e" ProcedureReturn Compute(Left(line,q-1))+compute(Right(line,Len(line)-q)) EndIf If u="-" And Mid(line,q-1,1)<>"e" ProcedureReturn Compute(Left(line,q-1))-compute(Right(line,Len(line)-q)) EndIf EndIf Next For q=Len(line) To 1 Step -1 u=Mid(line,q,1) ; it is a current symbol If u=")": w+1: EndIf If u="(": w-1: EndIf If w=0 ; if we are between two blocks If u="*" ProcedureReturn Compute(Left(line,q-1))*compute(Right(line,Len(line)-q)) EndIf If u="/" ProcedureReturn Compute(Left(line,q-1))/compute(Right(line,Len(line)-q)) EndIf EndIf Next For q=1 To Len(line) u=Mid(line,q,1) ; it is a current symbol If u="(": w+1: EndIf If u=")": w-1: EndIf If w=0 ; if we are between two blocks If u="^" ProcedureReturn Pow(Compute(Left(line,q-1)),compute(Right(line,Len(line)-q))) EndIf EndIf Next ; nothing found If Left(line,1)="(" And Right(line,1)=")": ProcedureReturn compute(Mid(line,2,Len(line)-2)): EndIf If Left(line,2)="-(" And Right(line,1)=")": ProcedureReturn compute(Mid(line,3,Len(line)-3)): EndIf If Left(line,4)="sin(" And Right(line,1)=")": ProcedureReturn Sin(compute(Mid(line,5,Len(line)-5))): EndIf If Left(line,4)="cos(" And Right(line,1)=")": ProcedureReturn Cos(compute(Mid(line,5,Len(line)-5))): EndIf If Left(line,3)="tg(" And Right(line,1)=")": ProcedureReturn Tan(compute(Mid(line,4,Len(line)-4))): EndIf If Left(line,4)="ctg(" And Right(line,1)=")": ProcedureReturn 1/Tan(compute(Mid(line,5,Len(line)-5))): EndIf If Left(line,7)="arcsin(" And Right(line,1)=")": ProcedureReturn ASin(compute(Mid(line,8,Len(line)-8))): EndIf If Left(line,7)="arccos(" And Right(line,1)=")": ProcedureReturn ACos(compute(Mid(line,8,Len(line)-8))): EndIf If Left(line,6)="arctg(" And Right(line,1)=")": ProcedureReturn ATan(compute(Mid(line,7,Len(line)-7))): EndIf If Left(line,7)="arcctg(" And Right(line,1)=")": ProcedureReturn #PI/2-ATan(compute(Mid(line,8,Len(line)-8))): EndIf If Left(line,4)="sqr(" And Right(line,1)=")": ProcedureReturn Sqr(compute(Mid(line,5,Len(line)-5))): EndIf If Left(line,4)="abs(" And Right(line,1)=")": ProcedureReturn Abs(compute(Mid(line,5,Len(line)-5))): EndIf If Left(line,3)="ln(" And Right(line,1)=")": ProcedureReturn Log(compute(Mid(line,4,Len(line)-4))): EndIf If Left(line,3)="lg(" And Right(line,1)=")": ProcedureReturn Log10(compute(Mid(line,4,Len(line)-4))): EndIf If Left(line,4)="int(" And Right(line,1)=")": ProcedureReturn integer(compute(Mid(line,5,Len(line)-5))): EndIf If Left(line,6)="float(" And Right(line,1)=")": ProcedureReturn flo(compute(Mid(line,7,Len(line)-7))): EndIf ;MessageRequester("Ошибка!","Проверьте корректность выражения:"+Chr(10)+Chr(13)+line,#MB_ICONEXCLAMATION) EndIf EndProcedure DataSection ; symbols again: Data.s "+", "-", "*", "/", "(", ")", "^" EndDataSection Procedure paintwin() SetGadgetColor(#button_0,#PB_Gadget_BackColor,cb) SetGadgetColor(#button_1,#PB_Gadget_BackColor,ca) SetGadgetColor(#button_2,#PB_Gadget_BackColor,cg) SetGadgetColor(#button_3,#PB_Gadget_BackColor,cl) EndProcedure Procedure.d scrx(x.d) ProcedureReturn (x-x1)*(wi-20)/(x2-x1)+10 EndProcedure Procedure.d scry(y.d) ProcedureReturn (y-y2)*(he-20)/(y1-y2)+10 EndProcedure Procedure.s tostr(s.d) Protected l.s l=StrD(s) While Right(l,1)="0" l=Left(l,Len(l)-1) Wend If l="":l="0":EndIf If Right(l,1)=".": l=Left(l,Len(l)-1): EndIf ;Debug l ProcedureReturn l EndProcedure Procedure trace() Protected q.d, f.s, x.d, y.d, p1.sp_, p2.sp_, w.b x1=ValD(ReplaceString(GetGadgetText(#input_2),",",".")) x2=ValD(ReplaceString(GetGadgetText(#input_4),",",".")) y1=ValD(ReplaceString(GetGadgetText(#input_6),",",".")) y2=ValD(ReplaceString(GetGadgetText(#input_7),",",".")) x3=ValD(ReplaceString(GetGadgetText(#input_10),",",".")) y3=ValD(ReplaceString(GetGadgetText(#input_12),",",".")) f=GetGadgetText(#input_1) f=ReplaceString(f,"eu","2.71828182846") f=ReplaceString(f,"pi","3.141592653589793") If GetGadgetState(#check2)=0: w=1: Else: w=3: EndIf StartDrawing(ImageOutput(0)) If GetGadgetState(#check1)=0 Box(0,0,wi,he,cb) FrontColor(cg) If x3>0 q=0 Repeat q+x3 Line(scrx(q),0,0,he) Until q>x2 q=0 Repeat q-x3 Line(scrx(q),0,0,he) Until q<x1 EndIf If y3>0 q=0 Repeat q+y3 Line(0,scry(q),wi,0) Until q>y2 q=0 Repeat q-y3 Line(0,scry(q),wi,0) Until q<y1 EndIf FrontColor(ca) Line(scrx(0),0,0,he) Line(0,scry(0),wi,0) DrawingMode(#PB_2DDrawing_Transparent) If x3>0 q=0 Repeat DrawText(scrx(q)+1,scry(0),tostr(q)) q+x3 Until q>x2 q=0 Repeat q-x3 DrawText(scrx(q)+1,scry(0),tostr(q)) Until q<x1 EndIf If y3>0 q=0 Repeat DrawText(scrx(0)+1,scry(q),tostr(q)) q+y3 Until q>y2 q=0 Repeat q-y3 DrawText(scrx(0)+1,scry(q),tostr(q)) Until q<y1 EndIf EndIf FrontColor(cl) q=x1 While q<=x2 And f<>"" p2\x=scrx(q) p2\y=scry(compute(ReplaceString(f,"x","("+StrD(q)+")"))) If (p1\x>0 And p1\x<wi And p1\y>0 And p1\y<he) Or (p2\x>0 And p2\x<wi And p2\y>0 And p2\y<he) Select w Case 1 If q=x1: Plot(p2\x,p2\y): Else: LineXY(p1\x,p1\y,p2\x,p2\y): EndIf Case 3 If q=x1: Plot(p2\x,p2\y): Else: LineXY(p1\x,p1\y,p2\x,p2\y): EndIf If q=x1: Plot(p2\x+1,p2\y): Else: LineXY(p1\x+1,p1\y,p2\x+1,p2\y): EndIf If q=x1: Plot(p2\x=1,p2\y): Else: LineXY(p1\x=1,p1\y,p2\x=1,p2\y): EndIf If q=x1: Plot(p2\x,p2\y+1): Else: LineXY(p1\x,p1\y+1,p2\x,p2\y+1): EndIf If q=x1: Plot(p2\x,p2\y-1): Else: LineXY(p1\x,p1\y-1,p2\x,p2\y-1): EndIf EndSelect EndIf p1\x=p2\x p1\y=p2\y q+1/wi*(x2-x1) Wend ;Debug 3/we*(x2-x1) StopDrawing() SetGadgetState(#img,ImageID(0)) EndProcedure OpenWindow(0,100,100,wi,he,"График",#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget) CreateGadgetList(WindowID(0)) ImageGadget(#img,0,0,wi,he,ImageID(0)) OpenWindow(1,354,359,635,241,"Построение графиков",#PB_Window_MinimizeGadget) ;{ ; its gadgets CreateGadgetList(WindowID(1)) TextGadget(#Text_0, 10, 10, 130, 20, "&Выражение: f(x) =") SetGadgetFont(#Text_0, FontID1) StringGadget(#Input_1, 150, 7, 365, 24, "") SetGadgetFont(#Input_1, FontID1) Frame3DGadget(#Frame3D_0, 10, 40, 505, 100, "Область графика") SetGadgetFont(#Frame3D_0, FontID1) TextGadget(#Text_1, 25, 68, 40, 20, "X: &от") SetGadgetFont(#Text_1, FontID1) StringGadget(#Input_2, 70, 65, 110, 24, "-12") SetGadgetFont(#Input_2, FontID1) TextGadget(#Text_3, 188, 68, 20, 20, "&до") SetGadgetFont(#Text_3, FontID1) StringGadget(#Input_4, 212, 65, 110, 24, "12") SetGadgetFont(#Input_4, FontID1) TextGadget(#Text_9, 330, 68, 75, 20, "&шаг сетки") SetGadgetFont(#Text_9, FontID1) StringGadget(#Input_10, 407, 65, 95, 24, "1") SetGadgetFont(#Input_10, FontID1) TextGadget(#Text_5, 25, 103, 40, 20, "Y: &от") SetGadgetFont(#Text_5, FontID1) StringGadget(#Input_6, 70, 100, 110, 24, "-9") SetGadgetFont(#Input_6, FontID1) TextGadget(#Text_6, 188, 103, 20, 20, "&до") SetGadgetFont(#Text_6, FontID1) StringGadget(#Input_7, 212, 100, 110, 24, "9") SetGadgetFont(#Input_7, FontID1) TextGadget(#Text_11, 330, 103, 70, 20, "&шаг сетки") SetGadgetFont(#Text_11, FontID1) StringGadget(#Input_12, 407, 100, 95, 24, "1") SetGadgetFont(#Input_12, FontID1) Frame3DGadget(#Frame3D_1, 10, 150, 505, 75, "Вид") SetGadgetFont(#Frame3D_1, FontID1) ButtonGadget(#Button_0, 30, 175, 95, 30, "Цвет &фона") SetGadgetFont(#Button_0, FontID1) ButtonGadget(#Button_1, 145, 175, 95, 30, "Цвет о&сей") SetGadgetFont(#Button_1, FontID1) ButtonGadget(#Button_2, 260, 175, 100, 30, "Цвет се&тки") SetGadgetFont(#Button_2, FontID1) ButtonGadget(#Button_3, 380, 175, 115, 25, "Цвет &графика") SetGadgetFont(#Button_3, FontID1) CheckBoxGadget(#check2,390,200,100,20,"Толстая &линия") SetGadgetFont(#check2, FontID2) ButtonGadget(#Button_4, 530, 155, 95, 30, "Спр&авка") SetGadgetFont(#Button_4, FontID1) ButtonGadget(#Button_5, 530, 15, 95, 30, "&Построить") SetGadgetFont(#Button_5, FontID1) CheckBoxGadget(#check1,527,45,100,30,"Пов&ерх старого") SetGadgetFont(#check1, FontID2) ButtonGadget(#Button_6, 530, 77, 95, 30, "Вы&ход") SetGadgetFont(#Button_6, FontID1) ;} paintwin() ;StickyWindow(1,1) ;ShowWindow_(WindowID(1), #SW_HIDE) ;SetWindowLong_(WindowID(1), #GWL_EXSTYLE, #WS_EX_TOOLWINDOW) ;ShowWindow_(WindowID(1), #SW_SHOW) Repeat e=WindowEvent() If e=#PB_Event_SizeWindow SetGadgetState(#check1,0) wi=WindowWidth(0) he=WindowHeight(0) If he<10: he=25: ResizeWindow(0,#PB_Ignore,#PB_Ignore,#PB_Ignore,he): EndIf If WindowHeight(0)>24 CreateImage(0,wi,he) trace() EndIf ElseIf e=#PB_Event_Gadget ew=EventWindow() eg=EventGadget() et=EventType() If et=#PB_EventType_LeftClick If eg=#button_6: End: EndIf If eg=#button_0 c=ColorRequester(cb) If c>=0: cb=c: EndIf paintwin() EndIf If eg=#button_1 c=ColorRequester(ca) If c>=0: ca=c: EndIf paintwin() EndIf If eg=#button_2 c=ColorRequester(cg) If c>=0: cg=c: EndIf paintwin() EndIf If eg=#button_3 c=ColorRequester(cl) If c>=0: cl=c: EndIf paintwin() EndIf If eg=#button_4 MessageRequester("Синтаксис","Поддерживаются алгебраические выражения практически любой сложности."+pp+"Дробные числа можно писать через точку или запятую."+pp+"Ввод порядка через латинскую «e»: 6.02e23; 7,412e-64"+pp+"Отрицательные числа желательно писать в скобках."+pp+pp+"Арифметические действия:"+pp+"+ — сложение"+pp+Chr(150)+" — вычитание"+pp+"* — умножение"+pp+"/ — деление"+pp+"^ — возведение в степень"+pp+pp+"Математические функции:"+pp+"(аргумент обязательно в скобках)"+pp+"sin(x)"+pp+"cos(x)"+pp+"tg(x)"+pp+"ctg(x)"+pp+"arcsin(x)"+pp+"arccos(x)"+pp+"arctg(x)"+pp+"arcctg(x)"+pp+"sqr(x) — квадратный корень"+pp+"abs(x) — модуль"+pp+"ln(x)"+pp+"lg(x)"+pp+"int(x) — целая часть"+pp+"float(x) — дробная часть"+pp+pp+"Можно использовать число «пи» (pi) и число «e» (eu)") EndIf If eg=#button_5 trace() EndIf EndIf EndIf ;If GetActiveWindow_()=WindowID(0) Or GetActiveWindow_()=WindowID(1): act.b=1: Else: act=0: EndIf ;If act=0 ; ShowWindow_(WindowID(1), #SW_HIDE) ;Else ; ShowWindow_(WindowID(1), #SW_SHOW) ;EndIf If GetWindowState(0)=#PB_Window_Minimize ;HideWindow(1,1) SetWindowState(1,#PB_Window_Minimize) Else ;If GetWindowState(1)<>#PB_Window_Minimize ; HideWindow(1,0) ;EndIf EndIf Until e=#PB_Event_CloseWindow
Поделиться521.01.2013 21:49:02
спасибо
Поделиться621.01.2013 21:52:54
но это все сложно для 2 курса
Поделиться723.01.2013 04:04:26
Мой пример. Создает png-файл для показа на веб-странице.
Имеем
Structure SpeedPoint
nTime.l ;1-1440 номер минуты в сутках
nSpeed.l ; скорость м/сек*10
EndStructure
...
NewList SpeedPoints.SpeedPoint()
....
Код:
;создать график Ymax=1460 Xmax=350 hImage1 = CreateImage(#PB_Any , Xmax, Ymax) X0=50 Y0=20 If StartDrawing(ImageOutput(hImage1)) BackColor(RGB(255, 255, 255)) FillArea(10, 10, -1 , RGB(255, 255, 255)) DrawText(0, 0, "м/сек>>" , RGB(0,0,255) ) ;горизонтальные линии часов LineXY(0, Y0, Xmax-1, Y0, RGB(0, 0,255)) For i=1 To 24 n=i*60-1 LineXY(0, Y0+n, Xmax-1, Y0+n, RGB(0, 0, 255)) DrawText(0, Y0+n-16, Str(i)+":00" , RGB(0,0,255) ) Next ;вертикальные линии скорости LineXY(X0+0, 0, X0+0, Ymax-1 , RGB(0, 0, 255)) DrawText(X0+1, 0, "0" , RGB(0,0,255) ) LineXY(X0+50, 0, X0+50, Ymax-1 , RGB(125, 125, 0)) DrawText(X0+51, 0, "5" , RGB(0,0,255) ) LineXY(X0+100, 0, X0+100, Ymax-1 , RGB(125, 125, 0)) DrawText(X0+101, 0, "10" , RGB(0,0,255) ) LineXY(X0+150, 0, X0+150, Ymax-1 , RGB(255, 0, 0)) DrawText(X0+151, 0, "15" , RGB(0,0,255) ) LineXY(X0+200, 0, X0+200, Ymax-1 , RGB(125, 125, 0)) DrawText(X0+201, 0, "20" , RGB(0,0,255) ) LineXY(X0+250, 0, X0+250, Ymax-1 , RGB(125, 125, 0)) DrawText(X0+251, 0, "25" , RGB(0,0,255) ) LineXY(X0+300, 0, X0+300, Ymax-1 , RGB(125, 125, 0)) DrawText(X0+301, 0, "30" , RGB(0,0,255) ) ; WindSpeed=0 WindTime=0 ResetList(SpeedPoints()) While NextElement(SpeedPoints()) LineXY(X0+WindSpeed, Y0+WindTime, X0+SpeedPoints()\nSpeed, Y0+SpeedPoints()\nTime, RGB(0, 125, 0)) WindSpeed=SpeedPoints()\nSpeed WindTime=SpeedPoints()\nTime Wend StopDrawing() SaveImage(hImage1, GraphFile$ , #PB_ImagePlugin_PNG ) FreeImage(hImage1) EndIf
Страница: 1