p5.js 如何让一条线在两个方向上无限延伸
p5.js How do I let a Line go endless in both directions
我想让 P5.js 中的一条线在两个方向上无限延伸/ 100/200 像素并让它切割两个点
我知道 line() 但它只从一个点到另一个点然后停在那里
你必须找到 canvas 之外的点(在对边)和由 2 个点定义的线上。这些点不必正好位于 canvas 的边界,它们必须刚好在 canvas.
之外
canvas 上可能的最大距离是 canvas 对角线的长度。因此,如果你从 canvas 上的任何一点开始,在任何方向上,长度大于对角线的长度,那么你就离开了 canvas。
找到直线的方向,从一个点开始,沿着这个方向,canvas 对角线的长度。这是无尽线的第一个点终点。向相反方向走可以找到第二个点。
要进行必要的计算,我建议使用 p5.Vector
。
计算对角线的长度,这是向量(windowWidth
, windowHeight
)的大小(mag()):
let dia_len = new p5.Vector(windowWidth, windowHeight).mag();
找到直线的方向。方向向量可以通过py减去(sub()
) the 2 points of the line. Set the length of the vector to the length of the canvas diagonal (setMag()
):
得到
let p1 = new p5.Vector(x1, y1);
let p2 = new p5.Vector(x2, y2);
let dir_v = p5.Vector.sub(p2, p1).setMag(dia_len);
通过添加 (add()
) and subtracting (sub()
) 来自其中一个点的方向向量来计算无限直线上的点:
let lp1 = p5.Vector.add(p1, dir_v);
let lp2 = p5.Vector.sub(p2, dir_v);
最后画线:
line(lp1.x, lp1.y, lp2.x, lp2.y);
画无限线的函数:
function endlessLine(x1, y1, x2, y2) {
p1 = new p5.Vector(x1, y1);
p2 = new p5.Vector(x2, y2);
let dia_len = new p5.Vector(windowWidth, windowHeight).mag();
let dir_v = p5.Vector.sub(p2, p1).setMag(dia_len);
let lp1 = p5.Vector.add(p1, dir_v);
let lp2 = p5.Vector.sub(p1, dir_v);
line(lp1.x, lp1.y, lp2.x, lp2.y);
}
看例子:
var sketch = function( p ) {
p.setup = function() {
let sketchCanvas = p.createCanvas(p.windowWidth, p.windowHeight);
sketchCanvas.parent('p5js_canvas')
}
let points = [];
let move = []
p.endlessLine = function(x1, y1, x2, y2) {
p1 = new p5.Vector(x1, y1);
p2 = new p5.Vector(x2, y2);
let dia_len = new p5.Vector(p.windowWidth, p.windowHeight).mag();
let dir_v = p5.Vector.sub(p2, p1).setMag(dia_len);
let lp1 = p5.Vector.add(p1, dir_v);
let lp2 = p5.Vector.sub(p1, dir_v);
p.line(lp1.x, lp1.y, lp2.x, lp2.y);
}
p.draw = function() {
if (points.length == 0) {
points = [];
move = [];
for (let i=0; i < 2; ++i ) {
points.push( new p5.Vector(p.random(p.windowWidth-20)+10, p.random(p.windowHeight-20)+10));
move.push( new p5.Vector(p.random(2)-1, p.random(2)-1) );
}
}
else
{
for (let i=0; i < 2; ++i ) {
points[i] = points[i].add(move[i]);
if (points[i].x < 10 || points[i].x > p.windowWidth-10)
move[i].x *= -1;
if (points[i].y < 10 || points[i].y > p.windowHeight-10)
move[i].y *= -1;
move[i].x = Math.max(-1, Math.min(1, move[i].x+p.random(0.2)-0.1))
move[i].y = Math.max(-1, Math.min(1, move[i].y+p.random(0.2)-0.1))
}
}
// draw the scene
p.background(192);
p.stroke(0, 0, 255);
p.fill(128, 128, 255);
for (let i=0; i < points.length; ++i ) {
p.ellipse(points[i].x, points[i].y, 10, 10);
}
p.stroke(0, 255, 0);
p.fill(128, 255, 128, 128);
p.endlessLine(points[0].x, points[0].y, points[1].x, points[1].y)
}
p.windowResized = function() {
p.resizeCanvas(p.windowWidth, p.windowHeight);
points = [];
}
p.mouseClicked = function() {
points = [];
}
p.keyPressed = function() {
points = []
}
};
var endless_line = new p5(sketch);
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>
<div id="p5js_canvas"></div>
我想让 P5.js 中的一条线在两个方向上无限延伸/ 100/200 像素并让它切割两个点
我知道 line() 但它只从一个点到另一个点然后停在那里
你必须找到 canvas 之外的点(在对边)和由 2 个点定义的线上。这些点不必正好位于 canvas 的边界,它们必须刚好在 canvas.
之外
canvas 上可能的最大距离是 canvas 对角线的长度。因此,如果你从 canvas 上的任何一点开始,在任何方向上,长度大于对角线的长度,那么你就离开了 canvas。
找到直线的方向,从一个点开始,沿着这个方向,canvas 对角线的长度。这是无尽线的第一个点终点。向相反方向走可以找到第二个点。
要进行必要的计算,我建议使用 p5.Vector
。
计算对角线的长度,这是向量(windowWidth
, windowHeight
)的大小(mag()):
let dia_len = new p5.Vector(windowWidth, windowHeight).mag();
找到直线的方向。方向向量可以通过py减去(sub()
) the 2 points of the line. Set the length of the vector to the length of the canvas diagonal (setMag()
):
let p1 = new p5.Vector(x1, y1);
let p2 = new p5.Vector(x2, y2);
let dir_v = p5.Vector.sub(p2, p1).setMag(dia_len);
通过添加 (add()
) and subtracting (sub()
) 来自其中一个点的方向向量来计算无限直线上的点:
let lp1 = p5.Vector.add(p1, dir_v);
let lp2 = p5.Vector.sub(p2, dir_v);
最后画线:
line(lp1.x, lp1.y, lp2.x, lp2.y);
画无限线的函数:
function endlessLine(x1, y1, x2, y2) {
p1 = new p5.Vector(x1, y1);
p2 = new p5.Vector(x2, y2);
let dia_len = new p5.Vector(windowWidth, windowHeight).mag();
let dir_v = p5.Vector.sub(p2, p1).setMag(dia_len);
let lp1 = p5.Vector.add(p1, dir_v);
let lp2 = p5.Vector.sub(p1, dir_v);
line(lp1.x, lp1.y, lp2.x, lp2.y);
}
看例子:
var sketch = function( p ) {
p.setup = function() {
let sketchCanvas = p.createCanvas(p.windowWidth, p.windowHeight);
sketchCanvas.parent('p5js_canvas')
}
let points = [];
let move = []
p.endlessLine = function(x1, y1, x2, y2) {
p1 = new p5.Vector(x1, y1);
p2 = new p5.Vector(x2, y2);
let dia_len = new p5.Vector(p.windowWidth, p.windowHeight).mag();
let dir_v = p5.Vector.sub(p2, p1).setMag(dia_len);
let lp1 = p5.Vector.add(p1, dir_v);
let lp2 = p5.Vector.sub(p1, dir_v);
p.line(lp1.x, lp1.y, lp2.x, lp2.y);
}
p.draw = function() {
if (points.length == 0) {
points = [];
move = [];
for (let i=0; i < 2; ++i ) {
points.push( new p5.Vector(p.random(p.windowWidth-20)+10, p.random(p.windowHeight-20)+10));
move.push( new p5.Vector(p.random(2)-1, p.random(2)-1) );
}
}
else
{
for (let i=0; i < 2; ++i ) {
points[i] = points[i].add(move[i]);
if (points[i].x < 10 || points[i].x > p.windowWidth-10)
move[i].x *= -1;
if (points[i].y < 10 || points[i].y > p.windowHeight-10)
move[i].y *= -1;
move[i].x = Math.max(-1, Math.min(1, move[i].x+p.random(0.2)-0.1))
move[i].y = Math.max(-1, Math.min(1, move[i].y+p.random(0.2)-0.1))
}
}
// draw the scene
p.background(192);
p.stroke(0, 0, 255);
p.fill(128, 128, 255);
for (let i=0; i < points.length; ++i ) {
p.ellipse(points[i].x, points[i].y, 10, 10);
}
p.stroke(0, 255, 0);
p.fill(128, 255, 128, 128);
p.endlessLine(points[0].x, points[0].y, points[1].x, points[1].y)
}
p.windowResized = function() {
p.resizeCanvas(p.windowWidth, p.windowHeight);
points = [];
}
p.mouseClicked = function() {
points = [];
}
p.keyPressed = function() {
points = []
}
};
var endless_line = new p5(sketch);
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>
<div id="p5js_canvas"></div>