линия пересечения: ошибка в векторных функциях - PullRequest
0 голосов
/ 06 апреля 2011

я хочу вычислить линию пересечения, заданную двумя плоскостями.моя основная программа дает мне параметры плоскости 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);

но я получил сообщение об ошибке и не могузапустить программу.любая помощь, пожалуйста.

Ответы [ 3 ]

1 голос
/ 06 апреля 2011

По сути, ваша проблема в том, что вы назначаете местоположения в векторе 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; 
1 голос
/ 06 апреля 2011

Я предлагаю использовать отладчик.У вас есть доступ за пределы.Например, вы получаете доступ к вектору точек, пока он пуст.

0 голосов
/ 06 апреля 2011

Изменение

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

до

vector <double> point(3); // You need to init the size of this!
vector <double> pointout;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...