我正在try 使用p5.js,我试图在矩形形状内创建一些弧,而不是弧溢出矩形的边缘.我的目标是让所有的弧的中心点在正方形的左下角(x,y + squareHeight).因此,基本上结果应该是我所拥有的,但"隐藏"弧的溢出部分.说实话,我不确定这是否可以使用arc,这是我的工作草图:

function setup() {
  const canvasW = 680;
  const canvasH = 530;
  createCanvas(canvasW, canvasH);
  background(255)
  
  strokeWeight(1);
  noFill();

  const margin = 30;
  const numberOfSquaresX = 4;
  const numberOfSquaresY = 4;
  const squareWidth = (canvasW - margin) / numberOfSquaresX - margin;
  const squareHeight = (canvasH - margin) / numberOfSquaresY - margin;

  for (let i = 0; i < numberOfSquaresX; i++) {
    for (let j = 0; j < numberOfSquaresY; j++) {
      const x = margin + i * (squareWidth + margin);
      const y = margin + j * (squareHeight + margin);
       
      rect(x, y, squareWidth, squareHeight);
      
      let dimension = random(5, 20);
      while (dimension <= squareWidth * 2) {
        arc(x, y + squareHeight, dimension, dimension, PI*1.5, TWO_PI);
        dimension = random(dimension + 5, dimension + 20);
      }
    }
  }
  
  
}
html, body {
  margin: 0;
  padding: 0;
}
canvas {
  display: block;
  margin: 0 auto;
}
<script src="https://cdn.jsdelivr.net/npm/p5@1.9.0/lib/p5.js"></script>

我一直在try 许多不同的方法,但都不能奏效. 也许我应该用不同的形状?我试了curve次,但我也没能得到那个结果.

谢谢!

推荐答案

如果圆的半径大于矩形的高度,则必须将圆弧截断.在这种情况下,您必须使用acos(squareHeight / radius)计算圆弧的终点Angular :

if (squareHeight < dimension * 0.5) {
    endAngle = acos(squareHeight / (dimension * 0.5));
} else {
    endAngle = 0;
}
arc(x, y + squareHeight, dimension, dimension, PI * 1.5 + endAngle, TWO_PI);

function setup() {
  const canvasW = 680;
  const canvasH = 530;
  createCanvas(canvasW, canvasH);
  background(255)
  
  strokeWeight(1);
  noFill();

  const margin = 30;
  const numberOfSquaresX = 4;
  const numberOfSquaresY = 4;
  const squareWidth = (canvasW - margin) / numberOfSquaresX - margin;
  const squareHeight = (canvasH - margin) / numberOfSquaresY - margin;

  for (let i = 0; i < numberOfSquaresX; i++) {
    for (let j = 0; j < numberOfSquaresY; j++) {
      const x = margin + i * (squareWidth + margin);
      const y = margin + j * (squareHeight + margin);
       
      rect(x, y, squareWidth, squareHeight);
      
      let dimension = random(5, 20);
      while (dimension <= squareWidth * 2) {
        ratio = squareHeight / squareWidth; 
        if (squareHeight < dimension * 0.5) {
          endAngle = acos(squareHeight / (dimension * 0.5));
        } else {
          endAngle = 0;
        }
        arc(x, y + squareHeight, dimension, dimension, PI * 1.5 + endAngle, TWO_PI);
        dimension = random(dimension + 5, dimension + 20);
      }
    }
  }
  
  
}
html, body {
  margin: 0;
  padding: 0;
}
canvas {
  display: block;
  margin: 0 auto;
}
<script src="https://cdn.jsdelivr.net/npm/p5@1.9.0/lib/p5.js"></script>

Javascript相关问答推荐

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

如何使用侧边滚动按钮具体滚动每4个格?

我应该在redux reducer中调用其他reducer函数吗?

将状态向下传递给映射的子元素

如何使用JavaScript将文本插入空div

更改JSON中使用AJAX返回的图像的路径

将旋转的矩形zoom 到覆盖它所需的最小尺寸&S容器

加载背景图像时同步旋转不显示的问题

在open shadow—root中匹配时,使用jQuery删除一个封闭的div类

提交链接到AJAX数据结果的表单

使用getBorbingClientRect()更改绝对元素位置

在Reaction中的handleSubmit按钮内,useSelector值仍然为空

为什么客户端没有收到来自服务器的响应消息?

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';

将延迟加载的模块转换为Eager 加载的模块

Firebase函数中的FireStore WHERE子句无法执行

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题

在点击链接后重定向至url之前暂停

如何在preLoad()中自定义p5.js默认加载动画?

try 导入material 时出现错误NG0203