You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

p5.js中beginShape()的顶点无法连接成连续路径的问题

搞定你的连续路径问题!

嘿,我一眼就看出问题的根源了——你踩了p5.js向量方法的一个常见坑!

你想用vector.add()来累积计算路径点,但p5.js里的add()方法是会直接修改原向量的,不是返回一个全新的向量。这就导致你的genes数组里所有元素其实都指向同一个向量引用,每一次previous.add(...)都会把之前存的所有点都改成新位置,最后画出来的自然不是连续路径,甚至可能所有点都叠在一起。

另外你用beginShape(LINES)也不对,LINES模式是每两个顶点画一条独立的线段,要画连续的折线,得用LINE_STRIP或者直接用默认的beginShape()(默认就是连续折线模式)。

修正后的完整代码

sketch.js

let lifespan = 200;
let genes = [];

function setup(){
 createCanvas(window.innerWidth, window.innerHeight);
 background(255);
 // 初始化第一个路径点
 genes[0] = createVector(50,50);
 stroke(0);
 strokeWeight(1);
 // 用默认模式(或LINE_STRIP)画连续折线
 beginShape();
 vertex(genes[0].x, genes[0].y);
 for (let i = 1; i < lifespan; i++) {
  // 先复制前一个向量,再添加随机偏移——关键在这里!
  genes[i] = genes[i-1].copy().add(createVector(random(-10,10),random(-10,10)));
  vertex(genes[i].x, genes[i].y);
 }
 endShape();
}

function draw(){
 // 这里不需要内容,因为我们在setup里已经画完了
}

HTML部分(保持原样即可,我帮你加了个标题)

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title>连续随机路径Demo</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id='sketch'></div>
<script language="javascript" type="text/javascript" src="https://cdn.jsdelivr.net/npm/p5@1.4.0/lib/p5.min.js"></script>
<script src="sketch.js"></script>
</body>
</html>

核心修改说明

  • 用copy()方法创建独立向量:genes[i-1].copy()会生成一个和原向量值完全相同但独立的新向量,再对这个新向量调用add(),就不会污染之前存入数组的点了,这样每个genes[i]都是路径上的独立节点。
  • 更换beginShape的模式:把LINES换成默认模式(或LINE_STRIP),这样程序会按顺序把所有顶点连成一条连续的折线,而不是两两分段。
  • 删掉了没用的previous和prevpos变量,直接用genes[i-1]访问前一个点,代码更清爽。

这样改完之后,你就能得到一条从(50,50)出发的连续随机路径啦!

内容的提问来源于stack exchange,提问作者Bigboss01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:22:50