Processing 加工过程中的用户交互

Processing 加工过程中的用户交互,processing,user-interaction,Processing,User Interaction,我有一个一般性的问题(我知道我应该给出一个有问题的特定代码,但在我的例子中,问题的性质更一般) 在处理过程中,假设我制作了一个椭圆: ellipse(30, 30, 10, 10); 现在,有没有办法得到画布上椭圆所在的像素?原因可能是有一种方法可以创建用户与鼠标的交互(例如)。因此,当有人在椭圆上单击鼠标时,会发生一些事情 我曾想过将所有东西都转换为对象,并使用构造函数以某种方式存储形状的位置,但这说起来容易做起来难,特别是对于更复杂的形状。这就是我感兴趣的。计算椭圆的位置是一回事,但是更复

我有一个一般性的问题(我知道我应该给出一个有问题的特定代码,但在我的例子中,问题的性质更一般)

在处理过程中,假设我制作了一个椭圆:

ellipse(30, 30, 10, 10);
现在,有没有办法得到画布上椭圆所在的像素?原因可能是有一种方法可以创建用户与鼠标的交互(例如)。因此,当有人在椭圆上单击鼠标时,会发生一些事情


我曾想过将所有东西都转换为对象,并使用构造函数以某种方式存储形状的位置,但这说起来容易做起来难,特别是对于更复杂的形状。这就是我感兴趣的。计算椭圆的位置是一回事,但是更复杂的形状呢?有库吗?

使用数学公式比逐像素检查鼠标位置更好(速度更快,代码更少)

对于完美圆,可以使用毕达哥拉斯定理计算欧几里德距离。假设您的圆以位置(
circleX
circleY
)为中心,并且具有
circleR
半径(而非直径)。您可以检查鼠标是否位于圆上方,如下所示:

if(sq(mouseX-circleX)+sq(mouseY-circleY) <= sq(circleR)) {
    // mouse is over circle
} else {
    // mouse is not over circle
}

if(sq(mouseX-circleX)+sq(mouseY-circleY)使用数学公式比逐像素检查鼠标位置更好(速度更快,代码更少)

对于完美圆,您可以使用毕达哥拉斯定理计算欧几里德距离。假设您的圆以位置(
circleX
circleY
)为中心,并且具有半径(而非直径)为
circleR
。您可以像这样检查鼠标是否位于圆上方:

if(sq(mouseX-circleX)+sq(mouseY-circleY) <= sq(circleR)) {
    // mouse is over circle
} else {
    // mouse is not over circle
}
if(sq(mouseX-circleX)+sq(mouseY-circleY)查看库。它有一种方法可以检查鼠标是否在任何SVG形状中。我记不起来了,但它的工作原理类似于你制作形状:

myShape = RG.loadShape("shape.svg");
还有一点:

RPoint p = new RPoint(mouseX, mouseY);
布尔函数contains()将告诉您点是否在形状内:

myShape.contains(p);
查看库。它有一种方法可以检查鼠标是否在任何SVG形状内。我记不清了,但它的工作原理类似于你制作形状:

myShape = RG.loadShape("shape.svg");
还有一点:

RPoint p = new RPoint(mouseX, mouseY);
布尔函数contains()将告诉您点是否在形状内:

myShape.contains(p);

我也想到了一个与我原来的数学答案不同的方法。如果你能负担两次绘制所有UI元素的内存和处理能力,那么你可以通过使用辅助缓冲区获得好的结果

其原理包括使用屏幕外图形缓冲区(例如,使用PGraphics)。缓冲区的大小必须与主显示器的大小完全相同,并且禁用抗锯齿功能。绘制所有交互式UI元素(按钮等)但是,不要用普通的方式绘制它们,而是给每一个元素一种独特的颜色,用于填充和笔划(不要添加任何文本或图像…只添加纯色)。例如,一个按钮可能完全为红色,另一个按钮可能完全为绿色。任何其他RGB值都有效,只要每个项目具有唯一的颜色。请确保背景也具有唯一的颜色

用户永远看不到该缓冲区,因此不要将其绘制到屏幕上(除非您正在调试或做其他事情)。当您想检测鼠标在哪个项目上时,只需在该屏幕外缓冲区上查找鼠标位置。获取该位置的像素颜色,并将其与UI元素匹配

完成所有这些之后,继续并像往常一样将所有内容绘制到主显示屏上


值得注意的是,如果您的UI元素从未(或很少)使用此方法,则可以大大缩短处理时间移动。当某些东西出现/消失、设置动画或更改大小/位置时,您只需重新绘制辅助缓冲区。

我也想到了一个替代我原始数学答案的方法。如果您能够提供两次绘制所有UI元素的内存和处理能力,那么使用辅助缓冲区可以获得良好的效果。

其原理包括使用屏幕外图形缓冲区(例如,使用PGraphics)。缓冲区的大小必须与主显示器的大小完全相同,并且禁用抗锯齿功能。绘制所有交互式UI元素(按钮等)但是,不要用普通的方式绘制它们,而是给每一个元素一种独特的颜色,用于填充和笔划(不要添加任何文本或图像…只添加纯色)。例如,一个按钮可能完全为红色,另一个按钮可能完全为绿色。任何其他RGB值都有效,只要每个项目具有唯一的颜色。请确保背景也具有唯一的颜色

用户永远看不到该缓冲区,因此不要将其绘制到屏幕上(除非您正在调试或做其他事情)。当您想检测鼠标在哪个项目上时,只需在该屏幕外缓冲区上查找鼠标位置。获取该位置的像素颜色,并将其与UI元素匹配

完成所有这些之后,继续并像往常一样将所有内容绘制到主显示屏上


值得注意的是,如果您的UI元素从未(或很少)使用此方法,则可以大大缩短处理时间移动。当某些东西出现/消失、设置动画或更改大小/位置时,您只需重新绘制辅助缓冲区。

好的,这对于圆来说很好,但对于更复杂的形状呢?向量和曲线?我一直在寻找一个库,其中包含可以自动执行此操作的方法,但我还没有遇到任何方法。相同的原理可以应用于任何你喜欢的二维形状——你只需要找到一个数学表示法。复杂形状通常可以由几个简单形状组合而成,或者通过定义一个多边形来形成。有很多关于实时碰撞检测的好文章,都有相关的公式。好的,这很好,对于一个圆来说都是这样,但是更复杂的形状呢?向量和曲线?我有b