注意:,我在这里处理论坛上也问了这个问题。
我有一个示例代码:
PGraphics pg;
void setup() {
size(400, 500);
pg = createGraphics(width, height);
pg.noSmooth();
pg.beginDraw();
pg.background(0, 0, 255);
pg.endDraw();
}
void draw() {
if (mousePressed) {
pg.beginDraw();
pg.stroke(255, 254);
pg.point(mouseX, mouseY);
pg.endDraw();
}
image(pg, 0, 0, width, height);
}我希望这段代码在用户按鼠标的地方显示一个点。相反,我只能在几个矩形区域看到点:

如果我删除对pg.noSmooth()的调用,或者删除pg.stroke()调用中的alpha值,那么它工作得很好:

如果我将pg.point()调用替换为pg.ellipse()或pg.rect(),那么它也可以正常工作。
使用PGraphics、noSmooth()函数、point()函数和alpha值的组合似乎会导致这种错误行为。我尝试过处理3.3和3.5.2,在这两个过程中我都看到了相同的行为。
我漏掉了什么明显的东西吗?
发布于 2019-01-29 11:36:06
经过一小段时间的挖掘,JAVA2D呈现器绘制了一个点为对角线(line(x, y, x + EPSILON, y + EPSILON);),它具有非常的very 小间距 (static final float EPSILON = 0.0001f;)。我猜想这种特殊的配置,缺乏混叠可能意味着这条对角线的两个点在同一像素上,最终不会呈现在右上角区域。为什么这个区域,为什么这么小的距离,我不知道,但这听起来有点像头痛的雅库布·瓦尔塔和安德烈斯库布里不得不处理。
FWIW这里有一个麻烦的解决方法:使用更大的距离,使用透明和不混叠的方式呈现:
PGraphics pg;
void setup() {
size(400, 500);
noSmooth();
pg = createGraphics(width/20, height/20);
pg.beginDraw();
// just for debug purposes: rectangle with edge
pg.fill(0, 0, 255);
pg.rect(0,0,pg.width-1,pg.height-1);
pg.stroke(255,255,255, 128);
pg.endDraw();
}
void pointNoSmooth(PGraphics pg, float x,float y){
pg.beginShape();
pg.vertex(x,y);
pg.vertex(x + 0.75,y);//any less than 0.75 distance between vertices and there's nothing to render with aliasing
pg.endShape();
}
void draw() {
background(255);
if (mousePressed) {
pg.beginDraw();
pointNoSmooth(pg,mouseX,mouseY);
pg.endDraw();
}
// render upscaled
image(pg, 0, 0, width, height);
// render small preview in TL corner
image(pg,0,0);
}请注意,我已将PGraphics分辨率设置为小20倍,然后将其向上绘制,以便更容易地查看像素在PGraphics上的位置。不过,我并不是在缩放mouseX,mouseY坐标,所以在测试时,您需要绘制小的左上角预览图。0.75距离起了作用:根据我的测试,任何比0.7499995更小的东西都会再次出现问题。
https://stackoverflow.com/questions/54408259
复制相似问题