替换为IF语句并切换案例

时间:2016-05-11 11:38:32

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

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

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

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

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语句,即使我对Everythin发表评论,我也可能会感到痛苦。因为我必须对向量中的每个元素使用for循环执行此操作。

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

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

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值,然后计算内部轮廓的坐标。此外,我无法确定所有点总是围绕着原点。

2 个答案:

答案 0 :(得分:1)

他们将它布局,每个条件可以用四位二进制数表示为单个二进制数字。意识到很容易看出条件(有几个班次)如何组成一个数字,可以用作表格的索引或switch语句。

如果你想扩展案例数量,即增加更多的“位”,那么表格解决方案似乎是最好的方法。既然你没有说明如果每个“案例”都是真或假的话会发生什么,我真的不能说出表中的元素应该是什么。如果你应该为每个“案例”做不同的事情,那么拥有一个可调用对象表可能是个好主意。

答案 1 :(得分:1)

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

我能想到的最容易的是:

  • 查找存储在矢量矩阵
  • 中的多边形中的所有闭合多边形
  • 对于您想在
  • 中找到它的每个多边形
  • 对于每个多边形,对于要查找平分线的每个角度
  • 对于角度中的每个点Pn,您发现想要通过“渗透”移动它的平分线。 (在
  • 内的多边形方向上创建Pn&#39;点)

请记住,在切换情况下,您只能使用编译常量变量,这意味着您无法在此处使用切换案例。

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

相关问题