椭圆边界随机点计算异常:线段超出椭圆范围问题求助
问题原因分析
嘿,我一眼就揪出问题所在啦!
核心矛盾是p5.js的ellipse函数参数逻辑和你用的椭圆参数方程不匹配:在p5.js里,ellipse(x, y, width, height)的后两个参数是椭圆的直径(整个椭圆的水平/垂直总长度),但你的ellipseGetRandomPoint函数里用的是半径来计算点的位置。
你现在调用ellipseGetRandomPoint(250,250,200,300)时,把小椭圆的直径值当成了半径传入——小椭圆的宽度是200,对应半径应该是100;高度300对应半径150。而你用200、300来计算,得到的点偏移量自然会超过大椭圆的边界(大椭圆宽度300,对应半径才150),线段也就跟着超出了。
修正方案
只需要把传入ellipseGetRandomPoint的参数改成对应椭圆的半径值就行:
- 要是想让点落在大椭圆(
ellipse(250,250,300,400))上,就传150(300/2)和200(400/2) - 要是想让点落在小椭圆(
ellipse(250,250,200,300))上,就传100(200/2)和150(300/2)
下面是修正后的完整代码(以点落在小椭圆为例):
var o; function setup() { createCanvas(500, 500); // 把直径值改为对应的半径值 o = ellipseGetRandomPoint(250,250,100,150); } function draw() { background(220); stroke("black"); fill("#333333"); ellipse(250,250,300,400); stroke("red") line(250,250,o.pointX, o.pointY); console.log(o); fill("#999999"); stroke(0); ellipse(250,250,200,300); } function ellipseGetRandomPoint(centerX, centerY, radiusX, radiusY) { let o = {}; r = Math.floor(Math.random()*360); pointX = centerX + radiusX * Math.cos(r*Math.PI / 180); pointY = centerY + radiusY * Math.sin(r*Math.PI / 180); o.pointX = Math.floor(pointX); o.pointY = Math.floor(pointY); o.r = r; return o; }
额外补充
你说相似代码在其他JS项目里正常运行,大概率是因为那些项目用的是原生Canvas的ellipse方法——原生方法的参数就是直接传半径的,而p5.js做了封装调整成了直径,这才造成了参数逻辑的混淆~
内容的提问来源于stack exchange,提问作者Norhther
相关产品推荐
相关产品推荐

