Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:简化公式以避免if语句_Javascript_Math - Fatal编程技术网

JavaScript:简化公式以避免if语句

JavaScript:简化公式以避免if语句,javascript,math,Javascript,Math,我认为有一种方法可以更好地使用单行公式编写此代码,它不使用if语句,因此X(0->0.5->1)Y应该是(0->1->0) var h=200; var w=200; var canvas=document.getElementById(“canvas”); var ctx=canvas.getContext('2d'); 对于(变量i=0;i

我认为有一种方法可以更好地使用单行公式编写此代码,它不使用
if
语句,因此X(0->0.5->1)Y应该是(0->1->0)

var h=200;
var w=200;
var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext('2d');
对于(变量i=0;i

一个选项是使用。这将允许您将条件逻辑简化为一行,如下所示:

const h = 200;
const w = 200;
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext('2d');

for(var i = 0; i < w; i++){
   const x = i/w;

   // Use ternary operator, and apply factor to ternary result
   const y = ((x < 0.5) ? (1 - x) : (x - 0.5)) * 2;

   drawPoint(x, y);
}

function drawPoint(x, y){
  ctx.fillRect(x * w, y * h, 1, 1);
}
常数h=200;
常数w=200;
const canvas=document.getElementById(“canvas”);
const ctx=canvas.getContext('2d');
对于(变量i=0;i
请注意,从技术上讲,这仍然是一个“if like”语句,它允许您在一行中表达与原始代码等价的逻辑

如果您真的想避免使用“If like”语句,可以使用以下数值插值方法来实现您所需要的:

for(var i = 0; i < w; i++){
   const x = i/w;

   const c = Math.round(x); // Returns 0 if x < 0.5 otherwise 1
   const y = (((1 - c) * (1 - x)) + (c * (x - 0.5))) * 2;

   drawPoint(x, y);
}
(变量i=0;i{ 常数x=i/w; const c=Math.round(x);//如果x<0.5则返回0,否则返回1 常数y=((1-c)*(1-x))+(c*(x-0.5))*2; 提取点(x,y); }
然而,我倾向于避免这种方法,因为乍一看,它并不是特别清楚发生了什么。

1-x*2==-(x-0.5)*2
(不知道为什么把一个放在括号里而不是另一个)。你有一个条件,所以你需要一个“如果”,或类似的东西。如果您确实不想要If,您可以始终使用例如
y=(1-x*2)*(x<0.5?1-1),但可读性较差。单行公式=不必要的复杂性哈!非信徒@丹尼做到了^^
但是我倾向于避免这种数值方法,因为乍一看,
y=(x*2-1)*Math.sign(x-0.5)
怎么样?我的理解是,如果你想避免一个明确的if,并将原始逻辑简化为一个单一的if,那就不太清楚了?“使用单行公式,不使用if语句。”