Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Drawing Lines on a GUI?

Asked by
GShocked 150
8 years ago

Ok, so I've got my script. Currently, it correctly plots points, but now I want to connect those points to make a line graph. I've tried a lot of different things, but I've not gotten it right. I think the only problem is that the lines have wrong slopes, but I'm not sure if that's the only problem.

PS: If you know of a script that does exactly what I am describing (plotting points and/or drawing lines), then let me know!

Btw, this script uses the data from this table: {18.351, 18.615, 18.516, 18.921, 19.012, 19.051}

local x2 = 0
local y2 = 0
local x1 = 0
local y1 = 0
local dist = 0
local slope = 0
local line = 0

function graph(x, y, i)
    local p = Instance.new("Frame", script.Parent.Pixels)
    p.Size = UDim2.new(0, 5, 0, 5)
    p.Position = UDim2.new(x, 0, y, 0)
    p.BorderSizePixel = 0
    p.BackgroundColor3 = Color3.new(200, 20, 20)
    p.Name = p.Name .. i
    p.ZIndex = 3
    if p.Position.Y.Scale > High then
        High = p.Position.Y.Scale
    end
    if p.Position.Y.Scale < Low then
        Low = p.Position.Y.Scale
    end
    local SpanY = High - Low
    local PixelY = p.Position.Y.Scale
    local FactorY = High - PixelY
    local FractionY = FactorY / SpanY

    local PixelX = p.Position.X.Scale
    local FactorX = (#bux - 1) - PixelX
    local FractionX = FactorX / (#bux - 1)

    local XO = p.Position.X.Offset
    local YO = p.Position.Y.Offset
    p.Position = UDim2.new(FractionX, XO, FractionY, YO)

    --ALL THE CODE ABOVE IS JUST TO PLOT THE POINTS
    --All THE CODE BELOW IS TO MAKE THE LINES

    --So the idea here is to make a new frame, make its height 10 pixels (how thick the line is)
    --and make adjust its length using distance formula, then adjust its rotation using slope form
    --and convert that to degrees. Then make its position the same position as point 1 (which is the top left of the new line, because it is going to the right). Also, X?, Y?, X?, Y? are found by storing each ? and ? into a variable based on if the loop iteration is even or odd. 

    if i%2 == 0 then --So it does "every other" to connect both points when it can only look at one at a time
        y2 = p.Position.Y.Scale * script.Parent.AbsoluteSize.Y
        x2 = p.Position.X.Scale * script.Parent.AbsoluteSize.X
    elseif i%2 == 1 then
        y1 = p.Position.Y.Scale * script.Parent.AbsoluteSize.Y
        x1 = p.Position.X.Scale * script.Parent.AbsoluteSize.X
        slope = math.atan2((y2 - y1),(x2 - x1))
        dist = math.sqrt(math.pow((x2 - x1), 2) + math.pow((y2 - y1), 2))
        line = Instance.new('Frame', script.Parent.Lines)
        line.BorderSizePixel = 0
        line.Size = UDim2.new(0, dist, 0, 10)
        print(slope, slope * 360)
        line.Rotation = slope * 360
        line.Position = UDim2.new(0, x2, 0, y2)
        line.Name = i
    end
end

bux = {18.351, 18.615, 18.516, 18.921, 19.012, 19.051} --Not my actual bux/tix data, but random example

for i = #bux-1, 1, -1 do
    x = i
    y = bux[i]
    graph(x, y, i)
end
0
The problem with Rotation scripting is that ROBLOX anchors rotation to the center of the GUI element, but positioning to the top left, unrotated, making it much harder than it has to be to get the math right. adark 5487 — 8y

Answer this question