c++ - 替代 IF 语句和 switch case

标签 c++ if-statement switch-statement

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

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

所以我的想法是检查 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 语句,即使我对所有内容发表评论,我的阅读起来也会很痛苦。因为我必须对 vector 中的每个元素执行此操作,所以我使用了 for 循环。

我向社区提出的问题是:是否有一种智能方式来处理所有这些情况。 if 语句是最好的吗?还是使用 switch/case 更好?我的问题是我不知道如何将 switch 与 double vector 和整数变量一起使用。

编辑:关于这里的评论是一个案例的代码

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];
         }
        }
       }
      }
     }

所以我正在检查女巫大小写属于 x 和 y 值,然后计算内部结构的坐标。此外,我不能确定所有的点总是围绕着原点。

最佳答案

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

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

  • 找到存储在 vector 矩阵中的多边形中的所有闭合多边形
  • 对于每个你想找到的多边形,它都在里面
  • 对于每个多边形,对于每个角,你想找到平分线
  • 对于您找到的角平分线中的每个点 Pn,您希望将其沿多边形内部方向“infil”(创建 Pn' 点)移动

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

如果我没听错的话,这个问题涉及: Scaling an arbitrary polygon 这意味着您应该查看他传递的链接中的 Angus Johnson 和解决方案: An algorithm for inflating/deflating (offsetting, buffering) polygons 其中对该主题有很多阐述。

关于c++ - 替代 IF 语句和 switch case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37161507/

相关文章:

C++编译错误: unexpected type name 'string' : expected expression

java - 如何使用JAVA编写更优化和通用而不是200个if条件?

java - 来自 JOptionPane 的返回值表示选择的按钮

c++ - 如何访问 friend 类方法?

c++ - 为什么在函数参数类型中使用模板参数包作为其模板参数列表无法显式指定

c++ - 如何在不进入无限循环的情况下使用 C++ 中的 Detours 扩展程序内函数?

c++ if语句导致无限循环

javascript - `if (condition = value)` 是用于比较的正确语法吗?

无法在 switch case 中声明变量

swift - Swift 中相同的结果不同的情况?