2011-04-06 4 views
0

Je veux calculer la ligne d'intersection, donnée par 2 plans. mon programme principal me donne des paramètres de plan a, b, -1, d (mon équation est ax + by-z + d = 0). donc, ma fonction pour calculer l'équation de la ligne d'intersection est comme;ligne d'intersection: erreur dans les fonctions vectorielles

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

dans le programme principal, j'appelle cette fonction:

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

mais, je suis message d'erreur et ne peut pas exécuter le programme. toute aide s'il vous plaît.

+0

Quel message d'erreur avez-vous obtenu? –

+0

@ oli => Cette application a demandé au Runtime de le terminer de façon inhabituelle. Veuillez contacter l'équipe d'assistance de l'application pour plus d'informations. – niro

+0

Il semble que vous n'initialisiez pas correctement plan1 et plan2 - comment les configurez-vous? – ltjax

Répondre

1

fundementally, votre problème est que vous assignez à des endroits dans le vecteur point sans les allouer. De plus, pointout ne sert à rien, et vous avez une erreur de syntaxe. Voici mes recommandations:

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

Cette ligne apparaît deux fois. Supprimez la ligne la première fois qu'il apparaît, et remplacer la deuxième instance avec:

vector <double> point(3); 

Notez que le (3). Sans cela, point est un vecteur vide, c'est-à-dire qu'il n'y a pas de double du tout. Avec ça, il y a 3 doubles. L'objet pointout ne sert à rien. Remplacer ces deux lignes:

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

avec cette ligne:

return point; 
+0

@ Rob. Merci beaucoup. Ça marche. – niro

1

Je suggère d'utiliser un débogueur. Vous avez un accès hors limites. Par exemple, vous accédez au vecteur de point alors qu'il est vide.

+0

merci, mais désolé, je ne pouvais pas vous obtenir. alors, comment puis-je suivre votre solution? – niro

+0

@g_niro: Un débogueur vous dira exactement où sont vos problèmes. Je peux vous dire que chaque ligne de votre instruction switch provoquera un crash. à (x) lancera une exception car votre vecteur de point est vide. –

0

changement

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

à

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