【问题标题】:Draw opposite of shape in PApplet在 PApplet 中绘制与形状相反的形状
【发布时间】:2014-02-12 09:29:04
【问题描述】:

有没有办法让整个画布掉下来,除了一个形状。比如this thread,但是在Java的Processing PApplet中。

谢谢你。

【问题讨论】:

标签: java drawing processing


【解决方案1】:

根据HTML 5 链接中的答案,我认为您需要这样的东西:

PGraphics mask, filler;
int x;

void setup(){
  size(400,400);

  // initial bg color, the white circle...
  background(255);

  //init both PGraphics
  mask = createGraphics(width, height);
  filler = createGraphics(width, height);

  // draw a circle as a mask
  mask.beginDraw();
  mask.background(255);
  mask.noStroke();
  mask.fill(0);
  mask.ellipse(width/2, height/2, 200, 200);
  mask.endDraw();
}

void draw(){

  // a changing bg 
  x = (x+1)%255;
  background(x);

  //dinamiaclly draw random rects
  filler.beginDraw();
  filler.noStroke();
  filler.fill(random(255), random(255), random(255));
  filler.rect(random(width), random(height), random(5,40), random(5,40));
  filler.endDraw();

  // get an imge out ofthis...
  PImage temp = filler.get();

  //mask image
  temp.mask(mask);

  //dispay it
  image(temp, 0, 0);
}

void mousePressed(){

  mask.beginDraw();
  mask.background(0);
  mask.noStroke();
  mask.fill(255);
  mask.ellipse(width/2, height/2, 200, 200);
  mask.endDraw();
}

void mouseReleased(){

  mask.beginDraw();
  mask.background(255);
  mask.noStroke();
  mask.fill(0);
  mask.ellipse(width/2, height/2, 200, 200);
  mask.endDraw();
}

第二个例子

PGraphics mask, front, back;
int x;

void setup(){
  size(400,400);

  background(0);

  //init both PGraphics
  mask = createGraphics(width, height);
  front = createGraphics(width, height);
  back = createGraphics(width, height);
}

void draw(){

  float x = random(width);
  float y = random(height);
  float sx = random(5, 40);

  // draw a circle as a mask      
  mask.beginDraw();
  mask.background(255);
  mask.noStroke();
  mask.fill(100);
  mask.ellipse(mouseX, mouseY, 200, 200);
  mask.endDraw();

  //dinamiaclly draw random colored rects to PG
  front.beginDraw();
  front.noStroke();
  front.fill(random(255), random(255), random(255));
  front.rect(x, y, sx, sx);
  front.endDraw();


 //dinamiaclly  draw random gray rects to display
  back.beginDraw();
  back.stroke(200);
  back.fill(0, 100);
  back.rect(x, y, sx, sx);
  back.endDraw();

  // get an imge out ofthis...
  PImage temp = front.get();

  //mask image
  temp.mask(mask);

  //dispay it
  image(back,0,0);
  image(temp, 0, 0);

}

使用展开地图的示例

import de.fhpotsdam.unfolding.*;
import de.fhpotsdam.unfolding.geo.*;
import de.fhpotsdam.unfolding.utils.*;
PGraphics mask, red;
color transparent = color(0);
color opaque = color(255);

UnfoldingMap map;

void setup() {
  size(800, 600, P2D);
  mask = createGraphics(width, height);
  red = createGraphics(width, height);

  map = new UnfoldingMap(this);
  map.zoomAndPanTo(new Location(52.5f, 13.4f), 10);
  MapUtils.createDefaultEventDispatcher(this, map);
}

void draw() {
  map.draw();
  PImage temp = get();

  //red
  red.beginDraw();
  red.tint(200,20,20);
  red.image(temp, 0, 0);
  red.endDraw();

  //mask

  mask.beginDraw();
  mask.noStroke();
  mask.background(opaque);
  mask.fill(transparent);
  mask.ellipseMode(CENTER);
  mask.ellipse(mouseX, mouseY, 200,200);
  mask.endDraw();

  // without this i'm not getting to call mask in red...
  // don't really know why, this is a workaround
  PImage redCasted = red.get();
  redCasted.mask(mask);

  image(redCasted, 0, 0);


}

【讨论】:

  • 太棒了!谢谢你。除了简单地使用蒙版绘制图像之外,我还可以与蒙版后面的面板进行交互吗?例如,我正在使用展开地图在 PApplet 上显示地图,并且我想在地图上放置一个叠加层(叠加层具有非 100% 的 alpha 值),地图上绘制的形状除外。例如,用户在地图上绘制了一个形状,而其他所有内容(但包含在绘制的图形中的内容)都被覆盖在了覆盖中。
  • 在上面的示例中,内部和外部掩码都在更新。 bg 改变灰色和正方形。这表明您可以独立处理所有这些问题。玩它,你会得到它:)
  • 我添加了第二个示例,它可能看起来更像您需要的。
  • 谢谢,v.k.我会继续玩它。感谢您的帮助。
  • 我一直在玩它,但我仍然有点卡住覆盖部分。我正在寻找这样的事情:![例如tinypic.com/r/2ywh3dy/8](click这里)。我已经把遮罩的想法记下来了,但不知道如何保持地图(正在绘制的 PApplet),而是遮罩覆盖。
【解决方案2】:

您的问题没有说明您是否想要比该链接显示的更多内容,所以也许这个答案不是您想要的(但它是您所要求的)。首先,用你想要的任何颜色填充整个屏幕,然后在上面绘制你的形状。示例:

background(0);
fill(255);
ellipse(50,50,50,50);

【讨论】:

  • 我很欣赏您的评论,但我想做的远不止这些。我不是简单地将形状绘制到另一个形状上,而是希望创建一个类似于视口的用例,其中除了形状之外的所有内容都被非 100% 的 alpha 值覆盖覆盖。不过,我再次感谢您的回答。
猜你喜欢
  • 2012-07-09
  • 1970-01-01
  • 2018-09-24
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多