在处理中,获得恒定的笔划宽度,与刻度无关

时间:2017-03-16 23:51:35

标签: processing

无论当前的scale()设置如何,送入strokeWidth()的值都会给出一个像素的笔触宽度?

3 个答案:

答案 0 :(得分:1)

凯文确实提供了一些很好的方法。 您的问题并未明确表达您对该语言的满意程度。我的假设(我可能错了)是层方法不明确,因为您之前可能没有使用PGraphics

然而,Kevin提供的这个选项很简单直接:

  

手动乘以坐标

请注意,大多数绘图功能不仅需要坐标,还需要尺寸? 不要使用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);
}

您可以将其作为演示程序运行:

function setup(){
  createCanvas(100,100);
}
function draw(){
  //map mouseX to a scale between 10% and 300%
  var scale = map(constrain(mouseX,0,width),0,width,0.1,3.0);
  
  background(200);
  //scale the shape dimensions, without using scale()
  ellipse(50,50, 30 * scale, 30 * scale);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.7/p5.min.js"></script>

问题本身就是另一个答案:你会向strokeWidth()提供什么价值?如果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);
  translate(50,50);
  scale(scale);
  strokeWeight(1/scale);
  //scaled shape, same appearing stroke, just smaller in value as scale increases
  ellipse(0,0, 30, 30);
}

你可以运行这个:

function setup(){
  createCanvas(100,100);
}
function draw(){
  //map mouseX to a scale between 10% and 300%
  var scaleValue = map(constrain(mouseX,0,width),0,width,0.1,3.0);
  
  background(240);
  translate(50,50);
  scale(scaleValue);
  strokeWeight(1/scaleValue);
  //scale the shape dimensions, without using scale()
  ellipse(0,0, 30, 30);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.7/p5.min.js"></script>

凯文很有耐心,不仅要回答你的问题,还要回答你的意见,对他的时间充满慷慨。您需要耐心仔细阅读并理解所提供的答案。如果是这种情况,请自行尝试,然后回答有关澄清的具体问题。这是最好的学习方式。

只是问“我该怎么办?”没有展示你的尝试以及你对问题背后的想法是什么,期望复制/粘贴的片段不会让你走得太远,这不是stackoverflow的意思。

通过学习,使用可用的文档,特别是首先考虑问题,您将获得更多收获。你可能不会在第一时间解决这个问题(我知道我当然不会这样做),但是对它进行推理并从不同的角度进行观察会让你的装备运转起来。

无论情况如何,始终保持耐心,从长远来看,它将为您提供良好的服务。

更新也许您的意思是

  

无论当前的scale()设置如何,送入strokeWidth()的值都会给出一个像素的笔触宽度?

是如何在没有anti-aliasing的情况下绘制的?

如果是这样,您可以通过一行禁用平滑:在setup()中调用noSmooth();一次。尝试使用上面的示例代码。

答案 1 :(得分:1)

我认为acs::api.key.install("YOUR CENSUS KEY")应该有效。这是一个例子:

strokeWeight(0)

答案 2 :(得分:0)

无。

scale()的重点在于,它可以扩展所有内容。

您可能想要在图层中绘制内容:绘制一个缩放图层和一个包含单像素宽度线的未缩放图层。然后组合这些层。

如果您需要混合图层(例如缩放形状顶部的未缩放线条,在另一个缩放线条顶部),则无效。在这种情况下,您只需要在绘制线条之前进行缩放,然后再缩放以绘制形状。