简体   繁体   English

如何在 p5.js 中的点数组之间绘制正方形?

[英]How to draw squares between an array of points in p5.js?

I have an array containing 6 sets of random x, y coordinates.我有一个包含 6 组随机 x、y 坐标的数组。 I'm able to draw lines connecting the points, like this:我可以绘制连接点的线,如下所示:

6个点由线连接

But, I'm having trouble figuring out how to draw repeating squares (to achieve a dotted line effect) where the lines are.但是,我无法弄清楚如何在线条所在的位置绘制重复的正方形(以实现虚线效果)。 Right now, I'm able to get this, but I want to only draw squares along the line only:现在,我能够得到这个,但我只想沿着这条线画正方形:

在此处输入图像描述

I understand what I'm doing wrong theoretically, but really struggling with the math here.我理解我在理论上做错了什么,但在这里的数学真的很挣扎。 How do I go about only including the squares that appear along the lines?我如何 go 只包括沿线出现的方块? TIA. TIA。

This is my code right now:这是我现在的代码:

let w = 500;
let h = 500;
let riverArr = [];
let distanceArr = [];

function setup() {
    createCanvas(w, h);
}

function draw() {
    background(240);
    generatePoints();

    for (i = 1; i < riverArr.length; i++) {
        let x1 = parseInt(riverArr[i][0]);
        let y1 = parseInt(riverArr[i][1]);

        let x2 = parseInt(riverArr[i - 1][0]);
        let y2 = parseInt(riverArr[i - 1][1]);

        line(x1, y1, x2, y2);

        let d = int(dist(x1, y1, x2, y2));

        ellipse(x1, y1, 5);

        for (j = 0; j <= x1; j++) {
            for (k = 0; k <= y1; k++){
                rect(j, k, 1);
            }
        }
        distanceArr.push(d);
    }
    noLoop();
}

function generatePoints() {
    let finished;
    riverArr.push([0, random(h)]);
    for (i = 0; i < 4; i++) {
        finished == false;
        riverArr.push([random(w), random(h)]);
        if (i > 0 && riverArr[i][0] <= riverArr[i - 1][0]) {
            console.log(riverArr[i][0], riverArr[i - 1][0]);
            console.log('Bad path');
        }
        finished == true;
    }
    riverArr.push([w, random(h)]);
}

Something like this?像这样的东西?

 let points = []; const rectSize = 10; function setup() { createCanvas(400, 400); // add random points to a list for (let i = 0; i < 4; i++) points.push(createVector(random(0, width), random(0, height))); rectMode(CENTER); fill(0); noStroke(); } function draw() { background(255); // from the first point to the one before last for (let i = 0; i < points.length - 1; i++) { // get a reference to the current and next point const current = points[i], next = points[i + 1]; // calculate how many rectangles to draw in between two points // 1. calculate the distance between the current and next point // 2. divide the distance by twice the rectangle size (to achieve an equal gap between drawn and not drawn rectangles // 3. round down (floor) the divided distance const count = floor(dist(current.x, current.y, next.x, next.y) / (rectSize * 2)); // compute direction of movement vector from one point to the next // 1. subtract current vector from next vector (eg each componeny (x,y)) // 2. divide direction vector by how many rectangles // 3. store result in a p5.js Vector object (eg if count = 5, adding dir 5 times to current point gets us to the next point const dir = createVector((next.x - current.x) / count, (next.y - current.y) / count); // for each inbetween rectangles for (let j = 0; j < count; j++) // draw it by adding to the current position the direction towards the next position multiplied for each rectangle rect(current.x + dir.x * j, current.y + dir.y * j, rectSize, rectSize); } }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.0.0/p5.min.js"></script>

It's not using your logic, but I don't think adjusting that will be too hard.它没有使用您的逻辑,但我认为调整它不会太难。

Also I just noticed that in your generatePoints() method, you're saying finished == true/false .另外我刚刚注意到,在您的generatePoints()方法中,您说的是finished == true/false I don't know what purpose finished serves, but you should probably change that == to a = for assignement, not comparing.我不知道finished的目的是什么,但是您可能应该将==更改为 a =以进行分配,而不是进行比较。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM