Processing 在处理过程中,获得与比例无关的恒定笔划宽度

Processing 在处理过程中,获得与比例无关的恒定笔划宽度,processing,Processing,输入到strokeWidth()的哪个值将给出一个像素的笔划宽度,而不考虑当前的scale()设置?无 scale() 您可能希望在层中绘制对象:绘制一个缩放层和一个包含单像素宽度线的未缩放层。然后将这些层组合起来 如果需要混合图层(例如缩放形状顶部的未缩放线或另一条缩放线顶部的未缩放线),则这将不起作用。在这种情况下,您只需在绘制线条之前取消缩放,然后再次缩放以绘制形状。凯文确实提供了一些很好的方法。 你的问题没有明确说明你对语言的舒适程度。我的假设(我可能是错的)是,层方法并不清楚,因为您以

输入到strokeWidth()的哪个值将给出一个像素的笔划宽度,而不考虑当前的scale()设置?

scale()


您可能希望在层中绘制对象:绘制一个缩放层和一个包含单像素宽度线的未缩放层。然后将这些层组合起来


如果需要混合图层(例如缩放形状顶部的未缩放线或另一条缩放线顶部的未缩放线),则这将不起作用。在这种情况下,您只需在绘制线条之前取消缩放,然后再次缩放以绘制形状。

凯文确实提供了一些很好的方法。 你的问题没有明确说明你对语言的舒适程度。我的假设(我可能是错的)是,层方法并不清楚,因为您以前可能没有使用过

但是,该选项简单明了:

手动乘以坐标

请注意,大多数绘图函数不仅采用坐标,还采用尺寸? 不要使用
scale()
,而是跟踪用于形状标注的乘数浮点变量。手动缩放每个形状的尺寸:

void draw(){
  //map mouseX to a scale between 10% and 300%
  float scale = map(constrain(mouseX,0,width),0,width,0.1,3.0);

  background(255);
  //scale the shape dimensions, without using scale()
  ellipse(50,50, 30 * scale, 30 * scale);
}
您可以将其作为演示文件运行,如下所示:

函数设置(){
createCanvas(100100);
}
函数绘图(){
//将鼠标缩放到10%到300%之间
变量比例=贴图(约束(鼠标,0,宽度),0,宽度,0.1,3.0);
背景(200);
//缩放形状尺寸,而不使用scale()
椭圆(50,50,30*比例,30*比例);
}
我认为
冲程重量(0)
应该有效。以下是一个例子:

void setup() {
   size(100,100);
   noFill();
   scale(10);
   // 1st square, stroke will be 10 pixels
   translate(3,3);
   strokeWeight(1);
   beginShape();
   vertex(-1.0, -1.0);
   vertex(-1.0,  1.0);
   vertex( 1.0,  1.0);
   vertex( 1.0, -1.0);
   endShape(CLOSE);
   // 2nd square, stroke will be 1 pixel
   translate(3,3);
   strokeWeight(0);
   beginShape();
   vertex(-1.0, -1.0);
   vertex(-1.0,  1.0);
   vertex( 1.0,  1.0);
   vertex( 1.0, -1.0);
   endShape(CLOSE);
}

“绘制一个缩放层和一个包含单像素宽度线的未缩放层。”不幸的是,这将无法实现我需要的单像素元素的点位置缩放。“如果您需要混合图层,例如缩放形状顶部的未缩放线或另一条缩放线顶部的未缩放线,那么这将不起作用。在这种情况下,您只需在绘制线之前取消缩放,”同样的问题。@ChrisJJ我不知道该告诉您什么。你的建议是不可能的。你必须想出一些别的办法——也许你可以通过手动乘以坐标来进行缩放?”凯文提供了一些好的方法。“我不清楚你说的好是什么意思。”。两人都没有回答这个问题。谢谢你的建议,但这两个问题都没有答案。不管当前的比例设置如何,当被问及解决方案时,“不要使用比例()”并没有多大用处——说得委婉一点。@ChrisJJ冷静点:你把这一切看得太严肃了:)坦白地说,你的一行式问题有点模糊,留下了很大的解释空间:因此有许多不同的选择。如果问题的核心实际上是一个像素的厚度,请参阅上面我的更新:只需删除锯齿。否则,请重新表述您的问题,使其尽可能清楚。我很惊讶它还没有被否决,说到这里,我不相信你否决凯文和我是公平的。你能举一个例子说明
strokewweight(0)
会被提到的缩放操作忽略吗?如果可能的话,一个代码片段会很好。@Frits:这里有一个代码片段:
void setup(){size(100100);scale(10);//第一个正方形,笔划将是10像素平移(3,3);strokeWeight(1);beginShape();顶点(-1.0,-1.0);顶点(-1.0,1.0);顶点(1.0,1.0);顶点(1.0,-1.0);endShape(CLOSE);//第二个正方形,笔划将是1像素平移(3,3);笔划权重(0);beginShape();顶点(-1.0,-1.0);顶点(-1.0,1.0);顶点(1.0,1.0);顶点(1.0,-1.0);endShape(CLOSE);}
太好了:请将它添加到那里,而不是添加到注释中。