2011-04-06 137 views
0

我想计算由2个平面给出的交线。我的主程序给出了平面参数a,b,-1,d(我的方程是ax + by-z + d = 0)。所以,我计算交线方程的函数为;交叉线:矢量函数中的误差

vector<double> LineofIntersection(vector<double> plane1,vector<double> plane2) { 
    double a1=plane1.at(0); double a2=plane2.at(0); 
    double b1=plane1.at(1); double b2=plane2.at(1); 
    double d1=plane1.at(2); double d2=plane2.at(2); 
    int c1=-1,c2=-1; 
    double cros_x=fabs((b1*c2)-(b2*c1)); 
    double cros_y=fabs((a2*c1)-(a1*c2)); 
    double cros_z=fabs((a1*b2)-(a2*b1)); 
    vector <double> point; vector <double> pointout; 

    int maxc; // max coordinate 
    if (cros_x > cros_y){ 
     if (cros_x > cros_z) 
      maxc = 1; 
     else maxc = 3; 
     } 
    else { 
     if (cros_y > cros_z) 
      maxc = 2; 
     else maxc = 3; 
     } 
    // 
    vector <double> point; vector <double> pointout; 
    switch (maxc) { // select max coordinate   
    case 1: // intersect with x=0     
     point.at(0)=0; 
     point.at(1)=(d2-d1)/(b2-b1); 
     point.at(2)=(b1*d2-2*b1*d1+d1*b2)/(b2-b1); 
     break; 
    case 2: // intersect with y=0     
     point.at(0)=(d2-d1)/(a1-a2); 
     point.at(1)=0; 
     point.at(2)=(a1*d2-a2*d1)/(a1-a2); 
     break; 
    case 3: // intersect with z=0     
     point.at(0)=(b1*d2-b2*d1)/(a1*b2-a2*b1); 
     point.at(1)=(a2*d1-a1*d2)/(a1*b2-a2*b1); 
     point.at(2)=0; 
     break; 
    } 
    pointout.push_back(point.at(0)); 
    pointout.push_back(point.at(1)); 
    pointout.push_back(point.at(2)); 
    return pointout; 
} 

在主程序中,我调用这个函数为:

vector<double> linep=LineofIntersection(plane1,plane2); 
cout<<linep.at(1)<<" "<<linep.at(1)<<" "<<linep.at(2); 

但是,我得到错误信息而无法运行该程序。请任何帮助。

+0

你得到什么错误讯息? – 2011-04-06 14:30:53

+0

@ oli =>此应用程序已请求运行时以不寻常的方式终止它。 有关更多信息,请联系应用程序的支持团队。 – niro 2011-04-06 14:33:07

+0

看起来你没有正确初始化plane1和plane2 - 你怎么设置它们? – ltjax 2011-04-06 14:36:14

回答

1

Fundementally,你的问题是,你没有先分配将它们分配给在point向量位置。此外,pointout没有任何用处,并且您有语法错误。以下是我的建议:

vector <double> point; vector <double> pointout; 

此行出现两次。删除线出现在第一时间,并将其替换第二个实例:

vector <double> point(3); 

通知的(3)。没有它,point是一个空的向量,即它根本没有双打。有了它,它有3个双打。

pointout对象没有任何用处。

pointout.push_back(point.at(0));pointout.push_back(point.at(1));pointout.push_back(point.at(2)); 
return pointout; 

这一行:这两行替换

return point; 
+0

@ Rob。非常非常感谢你。有用。 – niro 2011-04-06 14:50:19

1

我建议使用调试器。你有一些越界访问。例如,您可以在空的时候访问点矢量。

+0

谢谢,但对不起,我不能得到你。那么,我该如何遵循你的解决方案 – niro 2011-04-06 14:41:36

+0

@ g_niro:调试器会告诉你到底你的问题在哪里。我可以告诉你,switch语句中的每一行都会导致崩溃。在(x)将会抛出一个异常,因为你的点向量是空的。 – 2011-04-06 14:47:49

0

变化

vector <double> point; vector <double> pointout; 

vector <double> point(3); // You need to init the size of this! 
vector <double> pointout;