C++ 替换IF语句和切换案例

C++ 替换IF语句和切换案例,c++,if-statement,switch-statement,C++,If Statement,Switch Statement,在我的程序中,我得到了一个向量矩阵。该向量包含点的x、y和z坐标。为了简化程序,z坐标不变。现在我得到了一个名为infl的变量。其思想是点的坐标形成一个连续。可变内嵌定义了模型的contur和较小contur之间的间隙。为了说明这张图片: 如你所见,我得到了模型的conture和一个较小的contur。对于矩形,它工作得很好。但这只是一个特例。如果我把它用在圆圈上,它就不工作了 所以我的想法是用if语句检查。因为我至少有条件,我必须检查16个if语句 case 1 x<0 y<0

在我的程序中,我得到了一个向量矩阵。该向量包含点的x、y和z坐标。为了简化程序,z坐标不变。现在我得到了一个名为infl的变量。其思想是点的坐标形成一个连续。可变内嵌定义了模型的contur和较小contur之间的间隙。为了说明这张图片:

如你所见,我得到了模型的conture和一个较小的contur。对于矩形,它工作得很好。但这只是一个特例。如果我把它用在圆圈上,它就不工作了

所以我的想法是用if语句检查。因为我至少有条件,我必须检查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
案例1
如果我也检查x或y是否等于0或填充,我将有大约87个案例。现在我的问题是,如果我使用if/else if/else语句,即使我对每件事都发表评论,我的ase阅读也会很痛苦。因为我必须对向量中的每个元素都这样做,我使用的是for循环

我向社区提出的问题是:是否有一种明智的方法来处理所有这些案件。if语句是最好的吗?还是使用开关/外壳更好?这里我的问题是我不知道如何将switch与double向量和整数变量一起使用

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

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];
         }
        }
       }
      }
     }
int size=matrix.size();
对于(尺寸i=0;i(填充*(-1))){
矩阵push_-back(std::vector(3,0));
r=矩阵大小()-1;
基质[r][0]=基质[i][0]+填充物;
矩阵[r][1]=(矩阵[i][1]+填充)*(-1);
矩阵[r][2]=矩阵[i][2];
}
}
}
}
}

所以我在检查这个盒子是否属于x和y值,然后计算出内部连接的坐标。此外,我不能确定所有点总是围绕原点分组。

按照您的布局,每个条件都可以表示为四位二进制数中的一个二进制数字。意识到很容易看到条件(通过几次移位)是如何变成单个数字的,这些数字既可以用作表的索引,也可以用作
switch
语句


如果您想要扩展案例的数量,即添加更多的“位”,那么表解决方案似乎是最好的方法。因为你没有说如果每个“案例”都是真的或假的话应该发生什么,所以我真的不能说表中的元素应该是什么。如果您应该为每个“案例”执行不同的操作,那么拥有一个可调用对象表可能是一个好主意。

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

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

  • 查找存储在向量矩阵中的多边形中的所有闭合多边形
  • 对于要查找的每个多边形,它都位于内部
  • 对于每个多边形,对于要查找平分线的每个角度
  • 对于找到平分线的角度中的每个点Pn,您希望通过沿内部多边形方向“填充”(创建Pn点)移动它
请记住,在switch case中,您只能使用编译常量变量,这意味着您不能在这里使用switch case

如果我理解正确,这个问题涉及: 这意味着您应该看看Angus Johnson和他通过的链接中的解决方案:
关于这个主题有很多详细说明。

形状是否总是能够以(0,0)原点为中心?例如,似乎可以将所有坐标的大小减小50%,并使形状缩小。也许我不太清楚转换的含义——非矩形示例可能会有所帮助。同时列出你在16个案例中实际做了什么也会有所帮助。谢谢你对安格斯·约翰逊的帖子的提示。我得看看这个。