在我的程序中,我得到了一个矢量矩阵。该向量包含点的x,y和z坐标。为了简化程序,z坐标不会改变。现在我得到了一个名为填充的变量。这个想法是点的坐标形成一个conture。变量填充定义了轮廓与模型的较小轮廓之间的间隙。为了说明这里的图片:
正如你所看到的,我得到了模型的缩小和较小的轮廓。对于矩形,它工作正常。但这只是一个特例。如果我在圆圈上使用它,它就不再起作用了。
所以我的想法是检查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值,然后计算内部轮廓的坐标。此外,我无法确定所有点总是围绕着原点。
答案 0 :(得分:1)
他们将它布局,每个条件可以用四位二进制数表示为单个二进制数字。意识到很容易看出条件(有几个班次)如何组成一个数字,可以用作表格的索引或switch
语句。
如果你想扩展案例数量,即增加更多的“位”,那么表格解决方案似乎是最好的方法。既然你没有说明如果每个“案例”都是真或假的话会发生什么,我真的不能说出表中的元素应该是什么。如果你应该为每个“案例”做不同的事情,那么拥有一个可调用对象表可能是个好主意。
答案 1 :(得分:1)
如果我错了,请纠正我,但基本上你想要从矢量矩阵和较小的轮廓创建轮廓 - 使用名为填充的偏移量调整大小,这是点Pn和Pn之间的距离。 (Pn&#39;是调整大小后的Pn)。我做了这个假设,看着上面图片的左上角。此外,我认为矩阵中的所有点都是有序的 - 这意味着点Point_n和Point_n + 1之间存在实际的线,而不是在随机点之间。知道所有这些,你不想创建更复杂的if语句,但创建一个算法,按阈值调整多边形大小。
我能想到的最容易的是:
请记住,在切换情况下,您只能使用编译常量变量,这意味着您无法在此处使用切换案例。
如果我理解你这个问题涉及到: Scaling an arbitrary polygon 这意味着你应该看看Angus Johnson和他通过的链接中的解决方案: An algorithm for inflating/deflating (offsetting, buffering) polygons 其中有很多关于该主题的详细说明。