Attribute VB_Name = "Module1" DefDbl A-H, O-Z DefInt I-N '******************************************************************** '* Graph2d.Bas VB 4.0 Release 1.1, 11/19/2005 * '* From release TPW 2.5 for Windows 3.1. By J-P Moreau * '* (www.jpmoreau.fr) * '* ---------------------------------------------------------------- * '* Collection of subroutines to draw in Graphic mode a 2D-curve * '* within a window defined by subroutine Fenetre and to automati- * '* cally ajust the scales (linear or log.). * '* * '* Main variables: * '* xmin,xmax,ymin,ymax : limits in physical coordinates of the * '* window initialized by Initfenetre in * '* auto mode. * '* xgclot,xdclot,ybcot,yhclot : limits in pixels of the window * '* defined by Fenetre. * '* MaxX, MaxY : screen resolution in Ox and Oy to be defined * '* by calling program - Ex.: MaxX=639 MaxY=479 * '* Log_X,Log_Y: logarithmic scales, if TRUE * '* Ech_auto : automatic scales, if TRUE * '* ---------------------------------------------------------------- * '* Release 1.1: Corrected bug in subroutine DrawAxes(), restore * '* Printer.DrawWidth. * '******************************************************************** Public Const XrIBM = 400, YrIBM = 400, XrNEC = 338, YrNEC = 338 Public Const XrEPS = 228, YrEPS = 270, XrHP = 570, YrHP = 570 Public Const Bord = 5 Public xmin, xmax, ymin, ymax, Cxmx, Cymx, Xratio, Yratio Public dx, dy, ech, echx, echy, x0, y0, Xc, Yc, wl, xcm, ycm Public Ixmn, Ixmx, Iymn, Iymx Public xmin1 As Integer, xmax1 As Integer, ymin1 As Integer, ymax1 As Integer Public fen As Integer, fen4 As Integer, fen10 As Integer, fen11 As Integer Public EchAuto As Integer, LogX As Integer, LogY As Integer Public MaxX As Integer, MaxY As Integer Public xp as Integer, yp as Integer Public xmini as Integer, xmaxi as Integer Public ymini as Integer, ymaxi as Integer, axex As Integer Public V() As Double, vmini As Double, vmaxi As Double 'atomatically draw a 2D-curve defined by n ordinates in vector V 'from x=t1 to x=t2 (constant x increment) in one of predefined 'windows of #nfen Sub CurveXY(nfen%, n%, ByVal t1#, ByVal t2#, flgprn%, flglec%) Dim i, tps, dtps Minmax n% dtps = (t2# - t1#) / (n% - 1) If flglec% <> 0 Then InitWindow flgprn%, nfen%, t1#, t2#, vmini, vmaxi End If tps = t1# MoveXY tps, V(0) For i = 1 To n% - 1 tps = tps + dtps LineXY flgprn%, tps, V(i) Next End Sub 'move cursor to physical point (X,Y) 'return current pixel position in (xp,yp) Sub MoveXY(ByVal X As Double, ByVal y As Double) Dim m As Double, macheps As Double macheps = 0.000000000001 m = 0.43429448 If LogX = 0 Then xcm = x0 + (X - xmin) / echx ElseIf Abs(X) > macheps Then xcm = x0 + (m * Log(Abs(X)) - xmin) / echx End If If LogY = 0 Then ycm = y0 + (y - ymin) / echy ElseIf Abs(y) > macheps Then ycm = y0 + (m * Log(Abs(y)) - ymin) / echy End If xp = Ixmn + Int(Xratio * xcm) yp = Iymx - Int(Yratio * ycm) End Sub 'print string s at location X, Y Sub Display(fp As Integer, X As Integer, y As Integer, s As String) If Not fp Then Form1.CurrentX = X Form1.CurrentY = y Form1.Print s Else Printer.CurrentX = X Printer.CurrentY = y Printer.Print s End If End Sub Sub Echelle() ' Select a scale factor among [10,5,2.5,2,1.25,1] ' or [10,5,2.5,1] Const nval = 6, nval1 = 4 Dim wval(nval + 1), wval1(nval1 + 1), i, ixpo Dim wlp, wlm, logech As Double, m As Double wval(1) = 10#: wval(2) = 5#: wval(3) = 2.5: wval(4) = 2# wval(5) = 1.25: wval(6) = 1# wval1(1) = 10#: wval1(2) = 5#: wval1(3) = 2#: wval1(4) = 1# m = 0.43429448 'for a 10 based log. wlp = wval(1) logech = m * Log(ech) If logech > 0 Then ixpo = Int(logech) Else ixpo = Int(logech + 1) End If If logech < 0 Then ixpo = ixpo - 1 wl = ech / (10 ^ ixpo) If (LogX = 0) And (LogY = 0) Then For i = 1 To nval - 1 wlm = wlp wlp = wval(i + 1) If (wl - wlm) * (wl - wlp) <= 0 Then GoTo 50 Next Else For i = 1 To nval1 - 1 wlm = wlp wlp = wval1(i + 1) If (wl - wlm) * (wl - wlp) <= 0 Then GoTo 50 Next End If wlm = 1 50: wl = wlm ech = wl * (10 ^ ixpo) End Sub 'seek auto scale in axis Ox Sub EchelleX() dx = xmax - xmin If dx <= 0 Then GoTo 10 Else ech = dx / Cxmx Echelle End If echx = ech 10: End Sub 'seek auto scale in axis Oy Sub EchelleY() dy = ymax - ymin If dy <= 0 Then GoTo 20 Else ech = dy / Cymx Echelle End If echy = ech 20: End Sub 'define 11 preselected windows in pixels 'called by subroutine InitWindow Sub Fenetre(fp As Integer, num As Integer) Dim MargeX, MargeY ' setup of margins and pixels/cm ratios If fp Then 'case HP laser printer MargeX = 1000: MargeY = 500 MaxX = 15000: MaxY = 10000 Xratio = XrHP: Yratio = YrHP Else ' cas écran MargeX = 500: MargeY = 300 Xratio = XrIBM: Yratio = YrIBM End If ' define 11 preselected windows Select Case num Case 1 ' upper left quarter Ixmn = MargeX Ixmx = MargeX + Int(0.46 * MaxX) Iymn = MargeY Iymx = MargeY + Int(0.47 * MaxY) Case 2 ' upper right quarter Ixmn = MargeX + Int(0.54 * MaxX) Ixmx = MargeX + MaxX Iymn = MargeY Iymx = MargeY + Int(0.47 * MaxY) Case 3 ' lower half Ixmn = MargeX Ixmx = MargeX + MaxX Iymn = MargeY + Int(0.53 * MaxY) Iymx = MargeY + MaxY Case 4 ' all the client zone Ixmn = 40 Ixmx = MargeX + MaxX Iymn = 40 Iymx = MargeY + MaxY + 300 Case 5 ' upper half Ixmn = MargeX Ixmx = MargeX + MaxX Iymn = MargeY Iymx = MargeY + Int(0.47 * MaxY) Case 6 ' lower left quarter Ixmn = MargeX Ixmx = MargeX + Int(0.46 * MaxX) Iymn = MargeY + Int(0.53 * MaxY) Iymx = MargeY + MaxY Case 7 ' lower right quarter Ixmn = MargeX + Int(0.54 * MaxX) Ixmx = MargeX + MaxX Iymn = MargeY + Int(0.53 * MaxY) Iymx = MargeY + MaxY Case 8 ' left half Ixmn = MargeX + 50 Ixmx = MargeX + Int(0.46 * MaxX) Iymn = MargeY + 5 Iymx = MargeY + MaxY Case 9 ' right half Ixmn = MargeX + Int(0.54 * MaxX) Ixmx = MargeX + MaxX Iymn = MargeY + 5 Iymx = MargeY + MaxY Case 10 ' all the client zone with external graduations ' and upwards caption. Ixmn = MargeX + 100 Ixmx = Ixmn + MaxX - 100 Iymn = MargeY + 50 Iymx = Iymn + MaxY Case 11 ' same as 10 for printer Ixmn = 1500 Ixmx = 15500 Iymn = 1000 Iymx = 10500 End Select 'draw a frame around drawing zone If Not fp Then Form1.Line (Ixmn, Iymn)-(Ixmx, Iymx), , B Else Printer.Line (Ixmn, Iymn)-(Ixmx, Iymx), , B End If If num < 10 Then fen = 1 Else fen = 0 If num <> 10 Then fen10 = 0 Else fen10 = 1 If num <> 11 Then fen11 = 0 Else fen11 = 1 If num = 4 Then fen4 = 1 Else fen4 = 0 End Sub 'Graduate axes Sub GraduateAxes(flp As Integer) ' flp=0: screen - flp<>0: printer Const gradx = 40, grady = 40 Dim nx, comptx As Integer, ny, compty As Integer Dim i, imin, imax, j, raccord As Integer, ixxg, ixxgmx Dim iyyg, iyygmx, iy, ligne, trait As Integer Dim xxcm, yycm, xg, yg, test, xlim, ylim Dim dxpgrad, dypgrad Dim flag As Integer, sousgrad As Integer, mot1 As String, mot2 As String ' xlim, ylim : physical coordinates of lower left corner dxpgrad = 4 * echx dypgrad = 2 * echy axex = 1 xlim = xmin - x0 * echx If LogX = 0 Then ' linear graduations in Ox nx = Int(xlim / echx) - 1 comptx = nx Mod 4 If comptx < 0 Then comptx = comptx + 4 Do comptx = comptx + 1 If comptx = 4 Then comptx = 0 nx = nx + 1 xg = nx * echx xxcm = x0 + (xg - xmin) / echx ixxg = Ixmn + Int(Xratio * xxcm) trait = gradx If comptx = 0 Then trait = 2 * gradx If ixxg > Ixmn - 1 Then raccord = 1 If Not flp Then Form1.Line (ixxg, Iymx + raccord)-(ixxg, Iymx + raccord - trait) Else Printer.Line (ixxg, Iymx + raccord)-(ixxg, Iymx + raccord - trait) End If If comptx = 0 Then mot$ = Str$(xg) If (fen4 = 1) Then Display flp, ixxg - 100, Iymx - 250, mot$ Else Display flp, ixxg - 200, Iymx + 100, mot$ End If End If If Not flp Then Form1.Line (ixxg, Iymn)-(ixxg, Iymn + trait) Else Printer.Line (ixxg, Iymn)-(ixxg, Iymn + trait) End If 'draw vertical grid If Not flp Then Form1.ForeColor = RGB(255, 0, 0) Form1.DrawStyle = 2 Form1.Line (ixxg, Iymn)-(ixxg, Iymx) Form1.ForeColor = RGB(0, 0, 255) Form1.DrawStyle = 0 Else Printer.DrawStyle = 2 Printer.Line (ixxg, Iymn)-(ixxg, Iymx) Printer.DrawStyle = 0 End If End If Loop Until xxcm > Cxmx - 1 Else ' log. graduations in Ox nx = Int(xlim / echx) - 1 comptx = nx Mod 4 If comptx < 0 Then comptx = comptx + 4 flag = 1: mot2 = " 3" Do comptx = comptx + 1 sousgrad = sousgrad + 1 If comptx = 4 Then comptx = 0: sousgrad = 0: mot1 = "": flag = 0 End If nx = nx + 1 xg = nx * echx xxcm = x0 + (xg - xmin) / echx ixxg = Ixmn + Int(Xratio * xxcm) If comptx = 0 Then ixxg0 = ixxg If sousgrad = 1 Then ixxg = ixxg0 + Int((ixxg - ixxg0) * 1.204) ' log 2 / 0.25 mot1 = " 2" ixxg1 = ixxg0 + Int((ixxg - ixxg0) * 1.585) ' log 3 / log 2 End If If sousgrad = 2 Then ixxg = ixxg0 + Int((ixxg - ixxg0) * 1.397) ' log 5 / 0.50 mot1 = " 5": End If If sousgrad = 3 Then ixxg = ixxg0 + Int((ixxg - ixxg0) * 1.127) ' log 7 / 0.75 mot1 = " 7": End If trait = gradx If comptx = 0 Then trait = 2 * gradx If (flag <> 1) And (ixxg > Ixmn - 1) And (ixxg < Ixmx - 30) Then raccord = 1 If Not flp Then Form1.Line (ixxg, Iymx + raccord)-(ixxg, Iymx + raccord - trait) Else Printer.Line (ixxg, Iymx + raccord)-(ixxg, Iymx + raccord - trait) End If Display flp, ixxg - 100, Iymx - 250, mot1 If sousgrad = 1 Then If Not flp Then Form1.Line (ixxg1, Iymx + raccord)-(ixxg1, Iymx + raccord - trait) Else Printer.Line (ixxg1, Iymx + raccord)-(ixxg1, Iymx + raccord - trait) End If If ixxg1 < Ixmx - 50 Then Display flp, ixxg1 - 100, Iymx - 250, mot2 End If End If If comptx = 0 Then xg = 10 ^ xg mot$ = Str$(xg) If (fen4 = 1) Then Display flp, ixxg - 100, Iymx - 350, mot$ Else Display flp, ixxg - 200, Iymx + 100, mot$ End If End If If Not flp Then Form1.Line (ixxg, Iymn)-(ixxg, Iymn + trait) Else Printer.Line (ixxg, Iymn)-(ixxg, Iymn + trait) End If 'draw vertical grid If Not flp Then Form1.ForeColor = RGB(255, 0, 0) Form1.DrawStyle = 2 Form1.Line (ixxg, Iymn)-(ixxg, Iymx) Form1.ForeColor = RGB(0, 0, 255) Form1.DrawStyle = 0 Else Printer.DrawStyle = 2 Printer.Line (ixxg, Iymn)-(ixxg, Iymx) Printer.DrawStyle = 0 End If If sousgrad = 1 Then 'supplementary graduation "3" If Not flp Then Form1.Line (ixxg1, Iymn)-(ixxg1, Iymn + trait) Else Printer.Line (ixxg1, Iymn)-(ixxg1, Iymn + trait) End If 'draw supplementary vertical grid If Not flp Then Form1.ForeColor = RGB(255, 0, 0) Form1.DrawStyle = 2 Form1.Line (ixxg1, Iymn)-(ixxg1, Iymx) Form1.ForeColor = RGB(0, 0, 255) Form1.DrawStyle = 0 Else Printer.DrawStyle = 2 Printer.Line (ixxg1, Iymn)-(ixxg1, Iymx) Printer.DrawStyle = 0 End If End If End If Loop Until xxcm > Cxmx - 1 End If axex = 0 ylim = ymin - y0 * echy If LogY = 0 Then ' linear graduations in Oy ny = Int(ylim / echy) - 1 compty = ny Mod 2 If compty < 0 Then compty = compty + 2 Do compty = compty + 1 If compty = 2 Then compty = 0 ny = ny + 1 yg = ny * echy yycm = y0 + (yg - ymin) / echy iyyg = Iymx - Int(Yratio * yycm) trait = grady If compty = 0 Then trait = 2 * grady If iyyg < Iymx Then raccord = 1 If Not flp Then Form1.Line (Ixmn + raccord, iyyg)-(Ixmn + raccord + trait, iyyg) Else Printer.Line (Ixmn + raccord, iyyg)-(Ixmn + raccord + trait, iyyg) End If If Not flp Then r% = 500 Else r% = 1000 If compty = 0 Then mot$ = Str$(yg) If fen4 = 1 Then Display flp, Ixmn + 50, iyyg - 100, mot$ Else Display flp, Ixmn - r%, iyyg - 100, mot$ End If End If If Not flp Then Form1.Line (Ixmx, iyyg)-(Ixmx - trait, iyyg) Else Printer.Line (Ixmx, iyyg)-(Ixmx - trait, iyyg) End If 'draw horizontal grid If Not flp Then Form1.ForeColor = RGB(255, 0, 0) Form1.DrawStyle = 2 Form1.Line (Ixmn, iyyg)-(Ixmx, iyyg) Form1.ForeColor = RGB(0, 0, 255) Form1.DrawStyle = 0 Else Printer.DrawStyle = 2 Printer.Line (Ixmn, iyyg)-(Ixmx, iyyg) Printer.DrawStyle = 0 End If End If Loop Until yycm > Cymx - 1# Else ' log. graduations in Oy ny = Int(ylim / echy) - 1 compty = ny Mod 4 If compty < 0 Then compty = compty + 4 flag = 1: mot2 = " 3" Do compty = compty + 1 sousgrad = sousgrad + 1 If compty = 4 Then compty = 0: sousgrad = 0: mot1 = "": flag = 0 End If ny = ny + 1 yg = ny * echy yycm = y0 + (yg - ymin) / echy iyyg = Iymx - Int(Yratio * yycm) If compty = 0 Then iyyg0 = iyyg If sousgrad = 1 Then iyyg = iyyg0 + Int((iyyg - iyyg0) * 1.204) ' log 2 / 0.25 mot1 = " 2" iyyg1 = iyyg0 + Int((iyyg - iyyg0) * 1.585) ' log 3 / log 2 End If If sousgrad = 2 Then iyyg = iyyg0 + Int((iyyg - iyyg0) * 1.397) ' log 5 / 0.50 mot1 = " 5": End If If sousgrad = 3 Then iyyg = iyyg0 + Int((iyyg - iyyg0) * 1.127) ' log 7 / 0.75 mot1 = " 7": End If trait = grady If compty = 0 Then trait = 2 * grady If (flag <> 1) And (iyyg > Iymn) Then raccord = 1 If Not flp Then Form1.Line (Ixmn + raccord, iyyg)-(Ixmn + raccord + trait, iyyg) Else Printer.Line (Ixmn + raccord, iyyg)-(Ixmn + raccord + trait, iyyg) End If Display flp, Ixmn + 50, iyyg - 10, mot1 If (sousgrad = 1) And (yycm < Cymx - 1.6) Then If Not flp Then Form1.Line (Ixmn + raccord, iyyg1)-(Ixmn + raccord + trait, iyyg1) Else Printer.Line (Ixmn + raccord, iyyg1)-(Ixmn + raccord + trait, iyyg1) End If Display flp, Ixmn + 50, iyyg1 - 10, mot2 End If If Not flp Then r% = 500 Else r% = 1000 If compty = 0 Then yg = 10 ^ yg mot$ = Str$(yg) If iyyg > 10 Then If fen4 = 1 Then Display flp, Ixmn + 50, iyyg - 100, mot$ Else Display flp, Ixmn - r%, iyyg - 100, mot$ End If End If End If If Not flp Then Form1.Line (Ixmx, iyyg)-(Ixmx - trait, iyyg) Else Printer.Line (Ixmx, iyyg)-(Ixmx - trait, iyyg) End If 'draw horizontal grid If Not flp Then Form1.ForeColor = RGB(255, 0, 0) Form1.DrawStyle = 2 Form1.Line (Ixmn, iyyg)-(Ixmx, iyyg) Form1.ForeColor = RGB(0, 0, 255) Form1.DrawStyle = 0 Else Printer.DrawStyle = 2 Printer.Line (Ixmn, iyyg)-(Ixmx, iyyg) Printer.DrawStyle = 0 End If If (sousgrad = 1) And (yycm < Cymx - 1.6) Then 'extra graduation "3" If Not flp Then Form1.Line (Ixmx, iyyg1)-(Ixmx - trait, iyyg1) Else Printer.Line (Ixmx, iyyg1)-(Ixmx - trait, iyyg1) End If 'draw extra horizontal grid If Not flp Then Form1.ForeColor = RGB(255, 0, 0) Form1.DrawStyle = 2 Form1.Line (Ixmn, iyyg1)-(Ixmx, iyyg1) Form1.ForeColor = RGB(0, 0, 255) Form1.DrawStyle = 0 Else Printer.DrawStyle = 2 Printer.Line (Ixmn, iyyg1)-(Ixmx, iyyg1) Printer.DrawStyle = 0 End If End If End If Loop Until yycm > Cymx - 1.5 End If End Sub Sub InitWindow(fprn%, numfen%, ByVal x1 As Double, ByVal x2 As Double, ByVal y1 As Double, ByVal y2 As Double) '**************************************************************** '* Initialize a drawing window in physical coordinates xmin, * '* xmax, ymin, ymax to a predefined screen position by a call * '* to Fenetre according to the given value to fntr (1 to 11): * '* ----------------------------------------------------------- * '* fntr = 1 : upper left quarter * '* 2 : upper right quarter * '* 3 : lower half * '* 4 : all the client zone (internal graduations for * '* screen, but external for printer). * '* 5 : upper half * '* 6 : lower left quarter * '* 7 : lower right quarter * '* 8 : left half * '* 9 : right half * '* 10 : all the client zone, but with external gradua-* '* tions and upwards caption. * '* 11 : same as 10, but for printer. * '**************************************************************** Dim m As Double, temp Fenetre fprn%, numfen% ' call one of the 11 predefined windows 'maximum drawing range (screen cm) Cxmx = (Ixmx - Ixmn) / Xratio Cymx = (Iymx - Iymn) / Yratio If EchAuto = 1 Then xmin = x1: xmax = x2: ymin = y1: ymax = y2 Else ' manual scales xmin = xmini: xmax = xmaxi: ymin = ymini: ymax = ymaxi End If 'TBD by calling program! m = 0.43429448 If LogX = 1 Then ' logarithmic Ox scale temp = m * Log(xmax) If temp < 0 Then xmax = Int(temp + 1) Else xmax = Int(temp + 0.5) If (Ixmx - Ixmn) > MaxX / 2 Then xmin = xmax - 4 Else xmin = xmax - 2 End If End If If LogY = 1 Then ' logarithmic Oy scale temp = m * Log(ymax) If temp < 0 Then ymax = Int(temp + 1) Else ymax = Int(temp + 0.5) If (Iymx - Iymn) > MaxY / 2 Then ymin = ymax - 3 Else ymin = ymax - 1 End If End If EchelleX If LogX <> 0 Then echx = 0.25 EchelleY If LogY <> 0 Then echy = 0.25 x0 = 0.5 * (Cxmx - dx / echx) If xmin = 0 Then Xc = xmin - x0 * echx If Xc < 0 Then x0 = xmin / echx End If y0 = 0.5 * (Cymx - dy / echy) If ymin = 0 Then Yc = ymin - y0 * echy If Yc < 0 Then y0 = ymin / echy End If GraduateAxes fprn% DrawAxes fprn% End Sub 'Print caption of curve and of axes taking into account 'the preselected window #nfen (from 1 to 11). Sub Legends(fp As Integer, nfen%, titre$, axex$, axey$) Dim nx, ny, tx As Integer, ty As Integer, largeur If Not fp Then nx = Ixmx - 650: ny = Iymx - 250 tx = Ixmn + 1000: ty = Iymn + 75 largeur = Form1.TextWidth(titre$) Else nx = Ixmx - 1300: ny = Iymx - 500 tx = Ixmn + 1500: ty = Iymn + 150 largeur = Printer.TextWidth(titre$) End If n% = (MaxX - largeur) / 2 Select Case nfen% Case 1 Display fp, tx, ty, titre$ Display fp, nx, ny, axex$ Display fp, Ixmn + 25, Iymn + 25, axey$ Case 2 Display fp, tx, ty, titre$ Display fp, nx, ny, axex$ Display fp, Ixmn + 25, Iymn + 25, axey$ Case 3 Display fp, n%, ty, titre$ Display fp, nx, ny, axex$ Display fp, Ixmn + 25, Iymn + 25, axey$ Case 4 Display fp, n%, Iymn + 100, titre$ Display fp, Ixmx - 700, Iymx - 300, axex$ Display fp, Ixmn + 40, Iymn + 40, axey$ Case 5 Display fp, n%, ty, titre$ Display fp, nx, ny, axex$ Display fp, Ixmn + 25, Iymn + 25, axey$ Case 6 Display fp, tx, ty, titre$ Display fp, nx, ny, axex$ Display fp, Ixmn + 25, Iymn + 25, axey$ Case 7 Display fp, tx, ty, titre$ Display fp, nx, ny, axex$ Display fp, Ixmn + 25, Iymn + 25, axey$ Case 8 Display fp, tx, ty, titre$ Display fp, nx, ny, axex$ Display fp, Ixmn + 25, Iymn + 25, axey$ Case 9 Display fp, tx, ty, titre$ Display fp, nx, ny, axex$ Display fp, Ixmn + 25, Iymn + 25, axey$ Case 10 Form1.Font.Name = "Arial" Form1.Font.Size = 12 Form1.Font.Bold = True Display fp, n%, 30, titre$ Form1.Font.Size = 9 Display fp, Ixmx - 800, Iymx - 500, axex$ Display fp, Ixmn + 100, Iymn + 100, axey$ Form1.Font.Size = 10 Form1.Font.Bold = False Case 11 'printer Printer.Font.Name = "Helvetica" Printer.Font.Size = 13 Printer.Font.Bold = True Display fp, n%, 200, titre$ Printer.Font.Size = 10 Display fp, Ixmx - 1200, Iymx - 750, axex$ Display fp, Ixmn + 200, Iymn + 200, axey$ Printer.Font.Size = 10 Printer.Font.Bold = False End Select If fp = True Then Printer.Font.Bold = False Printer.Font.Size = 10 End If End Sub 'return minimum and maximum values of vector V, 'respectively in vmini and vmaxi. 'n is the size of V. Sub Minmax(n%) vmini = V(0): vmaxi = vmini For i% = 1 To n - 1 If V(i%) < vmini Then vmini = V(i%) If V(i%) > vmaxi Then vmaxi = V(i%) Next End Sub Sub Pause() Dim X Display False, 400, MaxY + 800, "Pause..." For i% = 1 To 1000 X = 1 For j% = 1 To 2000 X = 2 + X Next j% Next i% End Sub 'Select all client zone Sub FullScreen() Ixmn = 0 Ixmx = MaxX Iymn = 0 Iymx = MaxY fen = 0 fen10 = 0 fen11 = 0 End Sub 'draw Ox, Oy axes, if visible Sub DrawAxes(fp As Integer) Dim ix1, iy1 xcm = x0 - xmin / echx ix1 = Ixmn + Int(Xratio * xcm) ycm = y0 - ymin / echy iy1 = Iymx - Int(Yratio * ycm) 'thicker line for printer If fp <> 0 Then Printer.DrawWidth = 2 If (ix1 >= Ixmn) And (ix1 <= Ixmx) Then If Not fp Then Form1.Line (ix1, Iymn)-(ix1, Iymx) Else Printer.Line (ix1, Iymn)-(ix1, Iymx) End If End If If (iy1 >= Iymn) And (iy1 <= Iymx) Then If Not fp Then Form1.Line (Ixmn, iy1)-(Ixmx, iy1) Else Printer.Line (Ixmn, iy1)-(Ixmx, iy1) End If End If 'restore normal line for printer If fp <> 0 Then Printer.DrawWidth = 1 End Sub 'draw a line from current cursor position to 'physical point (X,Y). Sub LineXY(fp As Integer, ByVal X As Double, ByVal y As Double) Dim xi As Integer, yi As Integer Dim m As Double, macheps As Double macheps = 0.000000000001 m = 0.43429448 If EchAuto = 0 Then If X > xmaxi Then X = xmaxi End If If LogX = 0 Then xcm = x0 + (X - xmin) / echx ElseIf Abs(X) > macheps Then xcm = x0 + (m * Log(Abs(X)) - xmin) / echx End If If LogY = 0 Then ycm = y0 + (y - ymin) / echy ElseIf Abs(y) > macheps Then ycm = y0 + (m * Log(Abs(y)) - ymin) / echy End If xi = Ixmn + Int(Xratio * xcm) yi = Iymx - Int(Yratio * ycm) 'eliminate non-visible points If (xp >= Ixmn) And (xp <= Ixmx) And (xi >= Ixmn) And (xi <= Ixmx) Then If (yp >= Iymn) And (yp <= Iymx) And (yi >= Iymn) And (yi <= Iymx) Then If Not fp Then Form1.Line (xp, yp)-(xi, yi) Else Printer.Line (xp, yp)-(xi, yi) End If End If End If xp = xi: yp = yi End Sub