История изменений
Исправление 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
Дурка два, я даже видео снял
- Видива в девствии https://www.youtube.com/watch?v=7x6y51yq4ng
- Фота https://i.ibb.co/mG7SJbG/2023-08-11-08-18-12.png
Исходная версия 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
Дурка два, я даже видео снял
- Видива в девствии https://www.youtube.com/watch?v=7x6y51yq4ng