【问题标题】:Alternativ to IF-Statement and switch caseIF-Statement 和 switch case 的替代方案
【发布时间】:2016-05-11 11:38:32
【问题描述】:

在我的程序中,我得到了一个向量矩阵。该向量包含点的 x、y 和 z 坐标。为了简化程序,z 坐标不变。现在我得到了一个名为 infill 的变量。这个想法是点的坐标形成一个轮廓。变量填充定义了模型的轮廓和较小轮廓之间的间隙。为了说明这里的图片:

如您所见,我得到了模型的轮廓和较小的轮廓。对于矩形,它工作正常。但这只是特例。如果我在一个圆圈上使用它,它就不再起作用了。

所以我的想法是检查 if 语句。因为我至少有 for 条件,所以我必须检查 16 个 if 语句。

case 1  x<0 y<0 x<infill y<infill
case 2  x<0 y<0 x<infill y>infill
case 3  x<0 y<0 x>infill y<infill
case 4  x<0 y<0 x>infill y>infill
case 5  x<0 y>0 x<infill y<infill
case 6  x<0 y>0 x<infill y>infill
case 7  x<0 y>0 x>infill y<infill
case 8  x<0 y>0 x>infill y>infill

case 9  x>0 y<0 x<infill y<infill
case 10 x>0 y<0 x<infill y>infill
case 11 x>0 y<0 x>infill y<infill
case 12 x>0 y<0 x>infill y>infill
case 13 x>0 y>0 x<infill y<infill
case 14 x>0 y>0 x<infill y>infill
case 15 x>0 y>0 x>infill y<infill
case 16 x>0 y>0 x>infill y>infill

如果我还检查 x 或 y 是否等于 0 或填充,我将有大约 87 个案例。现在我的问题是,如果我使用 if/else if/else 语句,我可能会很难阅读,即使我对所有内容都发表评论。因为我必须对向量中的每个元素都执行此操作,所以我使用了 for 循环。

我对社区的疑问是:是否有一种智能的方法来处理所有这些情况。 if 语句是最好的吗?还是使用开关/外壳更好?这里我的问题是我不知道如何将 switch 与双精度向量和整数变量一起使用。

编辑:关于 cmets,这里是一个案例的代码

int size=matrix.size();
for(size_t i=0; i<size; i++) {
   if(matrix[i][0] < 0) {
     if(matrix[i][1] < 0){
       if(matrix[i][0] < (infill*(-1))) {
         if(matrix[i][1] < (infill*(-1))) {
            matrix.push_back(std::vector<double>(3, 0));
            r = matrix.size()-1;
            matrix[r][0]=matrix[i][0]+infill;
            matrix[r][1]=matrix[i][1]+infill;
            matrix[r][2]=matrix[i][2];
         }
         else if(matrix[i][1] > (infill*(-1))) {
            matrix.push_back(std::vector<double>(3, 0));
            r = matrix.size()-1;
            matrix[r][0]=matrix[i][0]+infill;
            matrix[r][1]=(matrix[i][1]+infill)*(-1);
            matrix[r][2]=matrix[i][2];
         }
        }
       }
      }
     }

所以我正在检查 wwitch case 是否属于 x 和 y 值,然后计算内部轮廓的坐标。此外,我不能确定所有点总是围绕原点分组。

【问题讨论】:

  • 形状是否总是能够像这样以 (0,0) 原点为中心?例如,您似乎可以将所有坐标的大小减少 50%,并具有缩小的形状。也许我不太清楚转换的含义是什么——非矩形示例可能会有所帮助。同时列出你在 16 个案例中的实际操作也会有所帮助。

标签: c++ if-statement switch-statement


【解决方案1】:

如果我错了,请纠正我,但本质上你想从矢量矩阵和一个更小的轮廓创建轮廓 - 使用名为 infill 的偏移调整大小,这是点 Pn 和 Pn' 之间的距离(调整大小后 Pn' 是 Pn)。我做了这个假设,看上图的左上角。此外,我认为矩阵中的所有点都是有序的 - 这意味着点 Point_n 和 Point_n+1 之间存在一条实际线,而不是随机点之间。了解所有这些后,您不想创建更复杂的 if 语句,而是创建一个通过阈值调整多边形大小的算法。

我能想到的最简单的方法是:

  • 在您存储在向量矩阵中的多边形中查找所有闭合多边形
  • 对于您想要在其中找到的每个多边形
  • 对于每个多边形,对于每个角,您要找到平分线
  • 对于每个角度 Pn 点,您找到的平分线要在多边形内部的方向上移动“infil”(创建 Pn 点)

记住,在switch case中你只能使用编译常量变量,这意味着你不能在这里使用switch case。

如果我理解正确,这个问题涉及: Scaling an arbitrary polygon 这意味着您应该查看 Angus Johnson 和他通过的链接中的解决方案: An algorithm for inflating/deflating (offsetting, buffering) polygons 其中有很多关于该主题的详细说明。

【讨论】:

  • 感谢安格斯约翰逊帖子的提示。得看看这个。
【解决方案2】:

按照您的布局方式,每个条件都可以表示为四位二进制数中的单个二进制数。意识到如何将条件(通过几个班次)转换为单个数字很容易,该数字既可以用作表的索引,也可以用于 switch 语句。

如果您想扩大案例数量,即添加更多“位”,那么表格解决方案似乎是最好的方法。由于您没有说如果每个“案例”是真还是假应该发生什么,我真的不能说表中的元素应该是什么。如果您应该为每个“案例”做不同的事情,那么拥有一个可调用对象表可能是个好主意。

【讨论】:

    猜你喜欢
    • 2010-11-28
    • 2014-05-22
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多