Jump to content

[Aporte]Graficos Lineales


Recommended Posts

Buenos días, ayer estaba aburrido por la noche así que decidí hacer un pequeño stream en mi canal creando un sistema bastante simple de gráficos en mta,

Voy a dejar el video y el codigo en si por si les es de utilidad en el vídeo pueden ver todos los errores que eh tenido y como he ido resolviéndolos supongo que para algunos puede ser util aprender como es el proceso de debugear scripts.

 

Video: 

 

Código:

local graphics = {}
 
local offset = 10
 
function getTheMaxValue(array)
    local cuarrentValue = 0
    for i = 1, #array do
        local data = array[i]
        if data > cuarrentValue then
            cuarrentValue = data
        end
    end
    return cuarrentValue
end
 
function calculateYByMaxValue(value, maxValue)
    if value and maxValue then
        local percentaje = value * 100 / maxValue
        return percentaje
    end
    return false
end
 
function renderGraphics()
    dxDrawText(inspect ( graphics ), 10, 200, 200, 700)
    for i = 1, #graphics do
        local data = graphics[i]
        dxDrawRectangle(data.x, data.y, data.w, data.h, tocolor(255, 255, 255))
        local x, y, w, h = data.x + 10, data.y + 10, data.w - 20, data.h - 20
        local distance = math.floor(w/#data.data)
        for i = 1, #data.data do
            local posY = calculateYByMaxValue(data.data[i], data.maxValue) / 100 * h - 10
            dxDrawRectangle(x + distance * i - 5, (y + h) - posY - offset, 5, 5, tocolor(150, 150, 150))
            local posY2 = calculateYByMaxValue(data.data[i - 1] or 2, data.maxValue) / 100 * h - 10
            dxDrawLine(x + distance * (i - 1) - 2, (y + h) - posY2 + 2 - offset, x + distance * i - 2, (y + h) - posY + 2 - offset, tocolor(150, 150, 150), 2 )
 
            dxDrawText(data.data[i], x + distance * i - 5 - 50, y + h - 8, 100 + (x + distance * i - 5 - 50), y + h + 8, tocolor(150, 150, 150), 1, "default-bold", "center", "center")
        end
    end
end
 
function createGraphic(x, y, w, h, values)
    if x and y and w and h then
        local array = {}
        table.sort(values, function(a,b) return a<b end)
        array.x = x
        array.y = y
        array.w = w
        array.h = h
        array.data = values
        array.maxValue = getTheMaxValue(values)
        table.insert(graphics, array)
        if #graphics == 1 then
            outputDebugString("[Graphics] Activando renderizado.")
            addEventHandler("onClientRender", root, renderGraphics)
        end
        outputDebugString("[Graphics] Nuevo grafico creando.")
    else
        outputDebugString("[Graphics] Faltan argumentos")
    end
end
 
createGraphic(500, 200, 500, 500, {100, 101, 200, 210, 500, 1000, 201, 250, 305, 350, 460})

 

Si tenéis alguna sugerencia en que podría hacer en mi siguiente stream si es que algún día lo hago :/ bueno, dejarlo en los comentarios del vídeo o aquí mismo.

Pueden hacer lo que quieran con el código.

Link to comment
  • Administrators

Buen aporte, solo que tenes un pequeño error en la linea 34. Se ve claramente en un ejemplo como el siguiente:

Spoiler

mta_screen_2017_02_06_00_48_24.png

Deberías cambiar la línea 34 por esto:

local posY2 = calculateYByMaxValue(data.data[i - 1] or 0, data.maxValue) / 100 * h - 10

 

Link to comment
4 hours ago, .:CiBeR:. said:

Buen aporte, solo que tenes un pequeño error en la linea 34. Se ve claramente en un ejemplo como el siguiente:

  Reveal hidden contents

mta_screen_2017_02_06_00_48_24.png

Deberías cambiar la línea 34 por esto:


local posY2 = calculateYByMaxValue(data.data[i - 1] or 0, data.maxValue) / 100 * h - 10

 

Principalmente te agradezco tu respuesta pero..realmente no hace falta ponerlo en 0 porque 2 es justo lo que se necesita en ese caso puedes probarlo.

Se hizo así principalmente para que la linea pase justo por el medio del rectangulo

Edited by Arsilex
Link to comment
  • Administrators

Viste el gráfico? Que parte de ese gráfico esta bien si el punto 0, o tambien llamado origen sale del punto 2? Sino estarías agregando un punto "2" a tu conjunto que en realidad va del 1 al 10. En todo caso debería partir del primer valor, el cual sería el menor valor.

Edited by .:CiBeR:.
Link to comment
8 hours ago, .:CiBeR:. said:

Viste el gráfico? Que parte de ese gráfico esta bien si el punto 0, o tambien llamado origen sale del punto 2? Sino estarías agregando un punto "2" a tu conjunto que en realidad va del 1 al 10. En todo caso debería partir del primer valor, el cual sería el menor valor.

Exactamente por eso que te dije anteriormente estoy partiendo del segundo pixel porque la linea tiene que pasar justo por el medio de del cuadrado si te fijas bien los cuadrados no tienen ese offset por asi decirlo de 2 pixeles lo cual les hace empezar en 0 + width/#array y para que la linea pase bien de un punto a otro punto sin que se vea mal empiezo cada punto 2 pixeles mas a la derecha asi haciendo el offset entre el start del cuadrado y la posición donde se encuentra. Así haciendo que la linea empiece justo en la mitad.

Link to comment
  • 1 month later...
  • 2 weeks later...

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...