dijous, 19 d’agost del 2010

Com dibuixar una escala semi-logarítmica amb OpenOffice.org Draw?

En aquest exercici dibuixo una escala semi-logarítmica. Aquesta mena de gràfiques es fan servir en tecnologia, per exemple a l'electrònica es fa servir per representar la resposta en freqüència dels circuits (els diagrames de Bode).

Aquest exercici ens servirà per aprendre com  dibuixar línies amb macros de OOoBasic.

Primer de tot, creo un nou document de Draw. I amb l'organitzador de macros creo un mòdul al document.

Faig servir aquest codi


Sub DibuixaLinia
    const cMarge = 1000
  
    Dim oPagina as Object
    Dim oLinea as Object
    Dim oPosition as Object
    Dim oSize as Object
    Dim iPagWidth as Integer
    Dim iPagHeight as Integer  
    Dim iWidth as Integer
    Dim iHeight as Integer  
    Dim v as Double
    Dim w as Double
    Dim x as Double
    Dim xx as Integer
    Dim y as Double
    Dim yy as Integer
    Dim iNumDecades as Integer
    Dim iNumVerticals as Integer

    iNumDecades = 7
    iNumVerticals = 10

    ' obté la pàgina de dibuix actual
    oPagina = ThisComponent.getDrawPages().getByName("page1")

    ' dimensions de la pàgina
    iPagWidth = oPagina.Width
    iPagHeight = oPagina.Height

    ' dimensions de l'àrea de dibuix, amb un marge de 1000px
    iWidth = oPagina.Width - (2 * cMarge)
    iHeight = oPagina.Height - (2 * cMarge)
  
    ' pinta escala logarítmica
    for w = 0 to (iNumDecades - 1)
        for v = 1 to 10
    x = log(v * (10 ^ w)) / log(10)
    xx = ((iWidth / iNumDecades) * x) + cMarge
     
    oLinea = ThisComponent.createInstance("com.sun.star.drawing.LineShape")
    oLinea.LineColor = RGB(0, 0, 255)
    oLinea.LineWidth = 2      
     
    oPosition = oLinea.Position
    oPosition.X = xx
    oPosition.Y = cMarge
    oLinea.Position = oPosition

    oSize = oLinea.Size
    oSize.Width = 0
    oSize.Height = iHeight
    oLinea.Size = oSize


    oPagina.add(oLinea)
 next
next

' dibuixa les divisions verticals
for w=0 to iNumVerticals
 oLinea = ThisComponent.createInstance("com.sun.star.drawing.LineShape")
oLinea.LineColor = RGB(0, 0, 255)
oLinea.LineWidth = 2

yy = ((iHeight / iNumVerticals) * w) + cMarge


oPosition = oLinea.Position
oPosition.X = cMarge
oPosition.Y = yy
oLinea.Position = oPosition

oSize = oLinea.Size
oSize.Width = iWidth
oSize.Height = 0
oLinea.Size = oSize

oPagina.add(oLinea)  
next
End Sub

Si executem aquesta macro, obtindrem el paper semi-logarítmic.

Una millora evident és factoritzar la funció que dibuixa la línia:

function Linea(int x, int y, int llarg, int ample, int vermell, int verd,  int blau, int gruix)
 dim oLinea as Object
 dim oPosition as Object
 dim oSize as Object

 oLinea = ThisComponent.createInstance("com.sun.star.drawing.LineShape")


oLinea.LineColor = RGB(vermell, verd, blau)
oLinea.LineWidth = gruix 

oPosition = oLinea.Position
oPosition.X = x
oPosition.Y = y
oLinea.Position = oPosition
oSize = oLinea.Size
oSize.Width = llarg
oSize.Height = ample
oLinea.Size = oSize

 Linea = oLinea


end sub

El resultat del programa anterior és:




Cap comentari:

Publica un comentari a l'entrada