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值没有帮助。太棒了!!我总是喜欢纯数学解决方案。感谢分享。