LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

Дурка, не знаю зачем, но я на это несколько часов убил. Помню когда-то мне @Bad_ptr помогал вхождение точки в отрезок вычислять. Это навреное совсем не то что тебе надо, но кажется выглядит так как ты хочешь :D Может пригодится, хз :D

apt install love
mkdir plot 
cd plot 
touch main.lua
копипаста кода
love .

local axis = {x = 10, y=10}
local model   = {};
local models  = 1;
model[models] = {};

function point_intersect_line(line_start,line_end,point,radius)

    local v1 = {x=0,y=0};
    local v2 = {x=0,y=0};
    local v3 = {x=0,y=0};
    local v4 = {x=0,y=0};
    local normalized = {x=0,y=0};

    v1.x = line_end.x - line_start.x;
    v1.y = line_end.y - line_start.y;

    v2.x = point.x - line_start.x;
    v2.y = point.y - line_start.y;

    local len = math.sqrt(v1.x * v1.x + v1.y * v1.y);
    normalized.x = v1.x / len;
    normalized.y = v1.y / len;

    len = math.sqrt(v2.x * v2.x + v2.y * v2.y);
    v3.x = normalized.x * len;
    v3.y = normalized.y * len;

    if (v3.x * v1.x) + (v3.y * v1.y) < 0 then
        return false;
    end

    if (v3.x * v3.x + v3.y * v3.y) > (v1.x * v1.x + v1.y * v1.y) then
        return false;
    end

    v4.x = v2.x - v3.x;
    v4.y = v2.y - v3.y;
    len = (v4.x * v4.x + v4.y * v4.y)
    if len < radius   then
        return true;
    end

    return false;

end

local is_collided = {};

function collide(lines,point)
    local wsize_y = love.graphics.getHeight()
    local radius = 1;
    for i=1,#lines,2 do
       if( not lines[i+2]) then
            return;
       end
       local s = { x=lines[i+0] or 0, y=lines[i+1] or 0};
       local e = { x=lines[i+2] or 0, y=lines[i+3] or 0};
       if point_intersect_line(s,e,point,radius) then

          if is_collided[tostring(s.x)] == 1 then
             break;
          else
            is_collided[tostring(s.x)] = 1
          end

          love.graphics.setColor(1,0,0,1)
          love.graphics.points(point.x,point.y);
          love.graphics.setColor(1,0,1,1)
          love.graphics.line(point.x,point.y,point.x,wsize_y-axis.y);
          love.graphics.setColor(1,1,1,1)
          love.graphics.print("x="..point.x .. "\ny="..wsize_y-point.y,point.x-50,point.y+10)
          love.graphics.setColor(s.x/500,s.y/500,0.5,1)
          love.graphics.setLineWidth(2)
          love.graphics.line(s.x,s.y,e.x,e.y);
          love.graphics.setLineWidth(1)
          love.graphics.setColor(1,1,0,1)
          love.graphics.rectangle('line', point.x-10, point.y-10, 20, 20)
       end
    end
end


function love.mousepressed(x,y)
    local mx = model[models];
    mx[#mx+1]=x;
    mx[#mx+1]=y;
end

function love.keypressed(key)
    if key == 'space' then
       models=models+1;
       model[models]={};
    end

    if key == 'r' then
       models=1;
       model={};
       model[models] = {};
    end
end

function love.load()
    love.graphics.setBackgroundColor( 0x2d/255,0x38/255,0x53/255,1)
    love.window.setMode(1280,720);
end

function love.draw()

    love.graphics.print("[Create point for curve - Mouse click]\n [Create new curve - SPACE]\n [Delete all curves - R]",1000,20);

    local wsize_y = love.graphics.getHeight()
    local step_y  = wsize_y / 100;

    local wsize_x = love.graphics.getWidth()
    local step_x  = wsize_x / 200;

    local count   = 0;
    local points = {};

    love.graphics.setPointSize(2)
    love.graphics.setColor(0x83/255,0xc0/255,0xf0/255 ,1)

    for i=wsize_y-axis.y,axis.y,-step_y do
        love.graphics.points(axis.x,i);
    end

    for i=wsize_x-axis.x,axis.x,-step_x do
        love.graphics.points(i,wsize_y-axis.y);
    end

    local x,y = love.mouse.getPosition();

    love.graphics.setColor(0,1,0,1)
    love.graphics.setPointSize(4)

    love.graphics.line(axis.x,y,x,y)

    love.graphics.points(x,y);
    love.graphics.points(axis.x,y);

    love.graphics.print("x="..x.."\ny="..wsize_y-y,axis.x+5,y-15);


    for k,v in ipairs(model) do
        if #v >= 4 then
            love.graphics.setColor(0.5,0.5,0.5,1)
            love.graphics.line(v);
            love.graphics.setColor(0,1,0,1)
            love.graphics.points(v);
        elseif #v ~= nil then
            love.graphics.points(v);
        end
    end

    for k,v in ipairs(model) do
        if #v >=4 then
            for i=1,x,1 do
               collide(v,{x=i,y=y});
            end
        end
    is_collided = {nil};
    end
end

Дурка два, я даже видео снял

Исходная версия LINUX-ORG-RU, :

Дурка, не знаю зачем, но я на это несколько часов убил. Помню когда-то мне @Bad_ptr помогал вхождение точки в отрезок вычислять. Это навреное совсем не то что тебе надо, но кажется выглядит так как ты хочешь :D Может пригодится, хз :D

apt install love
mkdir plot 
cd plot 
touch main.lua
копипаста кода
love .

local axis = {x = 10, y=10}
local model   = {};
local models  = 1;
model[models] = {};

function point_intersect_line(line_start,line_end,point,radius)

    local v1 = {x=0,y=0};
    local v2 = {x=0,y=0};
    local v3 = {x=0,y=0};
    local v4 = {x=0,y=0};
    local normalized = {x=0,y=0};

    v1.x = line_end.x - line_start.x;
    v1.y = line_end.y - line_start.y;

    v2.x = point.x - line_start.x;
    v2.y = point.y - line_start.y;

    local len = math.sqrt(v1.x * v1.x + v1.y * v1.y);
    normalized.x = v1.x / len;
    normalized.y = v1.y / len;

    len = math.sqrt(v2.x * v2.x + v2.y * v2.y);
    v3.x = normalized.x * len;
    v3.y = normalized.y * len;

    if (v3.x * v1.x) + (v3.y * v1.y) < 0 then
        return false;
    end

    if (v3.x * v3.x + v3.y * v3.y) > (v1.x * v1.x + v1.y * v1.y) then
        return false;
    end

    v4.x = v2.x - v3.x;
    v4.y = v2.y - v3.y;
    len = (v4.x * v4.x + v4.y * v4.y)
    if len < radius   then
        return true;
    end

    return false;

end

local is_collided = {};

function collide(lines,point)
    local wsize_y = love.graphics.getHeight()
    local radius = 1;
    for i=1,#lines,2 do
       if( not lines[i+2]) then
            return;
       end
       local s = { x=lines[i+0] or 0, y=lines[i+1] or 0};
       local e = { x=lines[i+2] or 0, y=lines[i+3] or 0};
       if point_intersect_line(s,e,point,radius) then

          if is_collided[tostring(s.x)] == 1 then
             break;
          else
            is_collided[tostring(s.x)] = 1
          end

          love.graphics.setColor(1,0,0,1)
          love.graphics.points(point.x,point.y);
          love.graphics.setColor(1,0,1,1)
          love.graphics.line(point.x,point.y,point.x,wsize_y-axis.y);
          love.graphics.setColor(1,1,1,1)
          love.graphics.print("x="..point.x .. "\ny="..wsize_y-point.y,point.x-50,point.y+10)
          love.graphics.setColor(s.x/500,s.y/500,0.5,1)
          love.graphics.setLineWidth(2)
          love.graphics.line(s.x,s.y,e.x,e.y);
          love.graphics.setLineWidth(1)
          love.graphics.setColor(1,1,0,1)
          love.graphics.rectangle('line', point.x-10, point.y-10, 20, 20)
       end
    end
end


function love.mousepressed(x,y)
    local mx = model[models];
    mx[#mx+1]=x;
    mx[#mx+1]=y;
end

function love.keypressed(key)
    if key == 'space' then
       models=models+1;
       model[models]={};
    end

    if key == 'r' then
       models=1;
       model={};
       model[models] = {};
    end
end

function love.load()
    love.graphics.setBackgroundColor( 0x2d/255,0x38/255,0x53/255,1)
    love.window.setMode(1280,720);
end

function love.draw()

    love.graphics.print("[Create point for curve - Mouse click]\n [Create new curve - SPACE]\n [Delete all curves - R]",1000,20);

    local wsize_y = love.graphics.getHeight()
    local step_y  = wsize_y / 100;

    local wsize_x = love.graphics.getWidth()
    local step_x  = wsize_x / 200;

    local count   = 0;
    local points = {};

    love.graphics.setPointSize(2)
    love.graphics.setColor(0x83/255,0xc0/255,0xf0/255 ,1)

    for i=wsize_y-axis.y,axis.y,-step_y do
        love.graphics.points(axis.x,i);
    end

    for i=wsize_x-axis.x,axis.x,-step_x do
        love.graphics.points(i,wsize_y-axis.y);
    end

    local x,y = love.mouse.getPosition();

    love.graphics.setColor(0,1,0,1)
    love.graphics.setPointSize(4)

    love.graphics.line(axis.x,y,x,y)

    love.graphics.points(x,y);
    love.graphics.points(axis.x,y);

    love.graphics.print("x="..x.."\ny="..wsize_y-y,axis.x+5,y-15);


    for k,v in ipairs(model) do
        if #v >= 4 then
            love.graphics.setColor(0.5,0.5,0.5,1)
            love.graphics.line(v);
            love.graphics.setColor(0,1,0,1)
            love.graphics.points(v);
        elseif #v ~= nil then
            love.graphics.points(v);
        end
    end

    for k,v in ipairs(model) do
        if #v >=4 then
            for i=1,x,1 do
               collide(v,{x=i,y=y});
            end
        end
    is_collided = {nil};
    end
end

Дурка два, я даже видео снял