Java 相交圆重叠
我试图做一个理论上简单的效果。例如,我有两个白色的圆圈在窗户周围反弹。当它们相交时,我希望圆的相交部分为黑色,而其余部分保持白色,如下所示:Java 相交圆重叠,java,processing,Java,Processing,我试图做一个理论上简单的效果。例如,我有两个白色的圆圈在窗户周围反弹。当它们相交时,我希望圆的相交部分为黑色,而其余部分保持白色,如下所示: blendMode(SUBTRACT); fill(0); ball1.display(); fill(255); ball2.display(); 有办法做到这一点吗 到目前为止,我有: for(int i = 0; i < balls.length; i++) { balls[i].move(); for(
blendMode(SUBTRACT);
fill(0);
ball1.display();
fill(255);
ball2.display();
有办法做到这一点吗
到目前为止,我有:
for(int i = 0; i < balls.length; i++)
{
balls[i].move();
for(int j = 0; j < balls.length; j++)
{
if(i != j && balls[i].intersect(balls[j]) && !changed[i] && !changed[j])
{
balls[j].swapColor();
changed[j] = true;
}
else
changed[j] = false;
}
balls[i].display();
}
给我这个:
如果中心之间的距离小于半径之和,则它们相交不幸的是,我现在无法提供可运行的示例,但为了获得视觉效果,您可以使用该功能(可能在
差分
模式下)
您可以使用btw将一个椭圆绘制成一个图形。在这里尝试一下。这是一种混合方法,使用两个PGraphics,而不是PImages。一个简单的例子编辑:当它们重叠时,在基础椭圆的上角有一个奇怪的伪影,现在不知道为什么。。。我在找,如果我找到了,我会把它贴在这里。 EDIT2:这似乎与反别名有关,如果你跳过smooth(),工件就消失了
PGraphics c;
PGraphics d;
void setup() {
size(300, 300);
background(255);
c = createGraphics(width, height, JAVA2D);
d = createGraphics(width, height, JAVA2D);
c.beginDraw();
c.smooth();
c.endDraw();
d.beginDraw();
d.smooth();
d.endDraw();
}
void draw() {
background(255);
c.beginDraw();
c.background(0, 0);
c.fill(255);
c.stroke(0);
c.ellipse(mouseX, mouseY, 30, 30);
c.endDraw();
d.beginDraw();
d.background(0, 0);
d.fill(255);
d.stroke(0);
d.ellipse(width/2, height/2, 30, 30);
d.endDraw();
d.blend(c, 0, 0, width, height, 0, 0, width, height, DIFFERENCE);
image(d, 0, 0);
}
我想到了一个有趣的方法。使用以下代码创建一个新草图,并在画布中移动鼠标
void setup() {
size(600,600);
}
void draw() {
background(0);
int c1x = width/2;
int c1y = height/2;
int c2x = mouseX;
int c2y = mouseY;
int d = 100;
boolean intersect = false;
if(dist(c1x, c1y, c2x, c2y) < d) intersect = true;
fill(255);
stroke(0);
ellipse(c1x, c1y, d, d);
ellipse(c2x, c2y, d, d);
noFill();
ellipse(c1x, c1y, d, d);
stroke(0, 0, 255);
line(c1x, c1y, c2x, c2y);
stroke(255, 0, 0);
if(intersect) stroke(0, 255, 0);
rectMode(CORNERS);
int mx = (c1x+c2x)/2;
int my = (c1y+c2y)/2;
int r = d/2;
rect(mx-r, my-r, mx+r, my+r);
if(intersect) {
for(int j = my-r; j <= my+r; j++) {
for(int i = mx-r; i <= mx+r; i++) {
if(dist(i, j, c1x, c1y) <= r && dist(i, j, c2x, c2y) <= r) {
stroke(0);
point(i, j);
}
}
}
}
}
void setup(){
尺寸(600600);
}
作废提款(){
背景(0);
int c1x=宽度/2;
int c1y=高度/2;
int c2x=鼠标;
int c2y=鼠标;
int d=100;
布尔相交=假;
如果(距离(c1x,c1y,c2x,c2y) 对于(int j=my-r;j而言,这将是一个带有白色交叉点和背景的黑色椭圆,速度快且脏,但效果不错
白色背景:
background(255);
请这样称呼:
blendMode(SUBTRACT);
fill(0);
ball1.display();
fill(255);
ball2.display();
如果你想了解一下它背后的数学原理,请查看。我想你也可以使用toxiclibs.geom这样的库来实现这一点。基于Java的处理Java和JavaScript是完全不同的语言。我想你说的是JavaScript,而不是Java。你确定你是指Java吗?你能展示一下你的尝试吗?这个探索ion是非常不完整的。+1来对抗那些似乎懒得找出什么是什么的人的反对票…我的另一个+1:)对于那些不熟悉处理的人,检查or简言之:一个最小的IDE+“语言”它最初是一个Java库,封装了许多方便的媒体相关功能。还有一个名为Processing.js的JavaScript端口。通过最新的处理IDE,您可以交换“模式”,这意味着您可以发布:对于台式机:(Java应用程序或小程序),对于浏览器(JavaScript),对于Android(更多Java:))是的,我已经计算出了相交逻辑。我可以检测到圆是否相互碰撞,但我无法确定如何更改重叠区域的填充。好的,你在使用什么,你现在如何绘制这些圆?你能提供一些代码示例或至少告诉我们你在使用什么框架吗ng可能已经在那里了,我正在使用它,这是一个经过提炼的Java变体,用于用代码绘图。用一个片段编辑OP。我将试一试。谢谢!对我不起作用。我将用我测试的代码编辑OP…制作两个200x200 PNG文件,一个洋红色圆圈和一个红色圆圈。使用差异过滤器,一个新圆圈e被实例化,过滤器工作正常,但我不确定如何利用它们各自的位置——它默认在0,0处覆盖它们。更改blend()参数中的sx/sy/dx/dy值没有帮助。太棒了!!我总是喜欢纯数学解决方案。感谢分享。