Тема: почему не пересекаются 2 луча?

Задано :PoiontStartnew[X],PoiontStartnew[Y],PoiontStartnew[Z],v1;PoiontEndnew[X],PoiontEndnew[Y],PoiontEndnew[Z],v2.
используются функции:
AcDbObjectId  createRay(double x,double y,double z,AcGeVector3d vector)
{
    AcGePoint3d startPt(x,y,z);
    AcDbRay *pRay = new AcDbRay();
    pRay->setBasePoint(startPt);
    pRay->setUnitDir(vector);
       AcDbObjectId Rayid;
    AcDbBlockTable *pBlockTable;
    acdbHostApplicationServices()->workingDatabase()
    ->getSymbolTable(pBlockTable, AcDb::kForRead);
    AcDbBlockTableRecord *pBlockTableRecord;
    pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
    pBlockTable->close();
    pBlockTableRecord->appendAcDbEntity(Rayid,pRay);
    pBlockTableRecord->close();
    pRay->close();
       return Rayid ;
}
AcGePoint3dArray Get_intersection_point (AcDbObjectId id1,AcDbObjectId id2)
{
     AcGePoint3d point;
     AcGePoint3dArray points;
     AcDbEntity* pent1 = NULL;
     AcDbEntity* pent2 = NULL;
     acdbOpenAcDbEntity(pent1,id1,AcDb::kForRead);
     acdbOpenAcDbEntity(pent2,id2,AcDb::kForRead);
     pent1 -> intersectWith( pent2,AcDb::kOnBothOperands,points);
     pent1->close();
     pent2->close();
     return points;
  }
void peresechenie()
{
AcDbObjectId idr1 = createRay(PoiontStartnew[X],PoiontStartnew[Y],PoiontStartnew[Z],v1);
    AcDbObjectId idr2 = createRay(PoiontEndnew[X],PoiontEndnew[Y],PoiontEndnew[Z],v2);
    AcGePoint3dArray mas = NULL;
    mass = Get_intersection_point(idr1,idr2);
    for (i=0;i<mas.length();i++)
    {
        acutPrintf(_T("\np1 x = %g p1 y = % g"),mas[X],mas[Y]);
    }
}
лучи рисует, но массив не заполняет. Почему? ведь AcDbRay наследник AcDbEntity.

Re: почему не пересекаются 2 луча?

1) С какими значениями ты проверял, т.е. лучи действительно пересекаются или это мнимое пересечение?
2) Что это за ерунда:

AcGePoint3dArray mas = NULL;

Re: почему не пересекаются 2 луча?

1)действительно пересекаются в одной плоскости.
2) я думал что так задается пустой массив AcGePoint3dArray mas = NULL; :)), но и без этой строчки не работает.

Re: почему не пересекаются 2 луча?

вот полный код последней функции peresechenie()
void peresechenie(AcGePoint3d PoiontStartold,AcGePoint3d PoiontEndold,AcGePoint3d PoiontStartnew,AcGePoint3d PoiontEndnew,
                     AcGePoint3d Poiontunknow)
{
    int i;
    double uAB,uAC,uBC,uBA,uABnew,uBAnew,deltaAB,deltaBA,uACnew,uBCnew;
    AcDbObjectId idlAB = createLine(PoiontStartold[X],PoiontStartold[Y],PoiontStartold[Z],
                                   PoiontEndold[X],PoiontEndold[Y],PoiontEndold[Z]);
    AcDbObjectId idlAC = createLine(PoiontStartold[X],PoiontStartold[Y],PoiontStartold[Z],
                                   Poiontunknow[X],Poiontunknow[Y],Poiontunknow[Z]);
    AcDbObjectId idlBC = createLine(PoiontEndold[X],PoiontEndold[Y],PoiontEndold[Z],
                                   Poiontunknow[X],Poiontunknow[Y],Poiontunknow[Z]);
    AcDbObjectId idlBA = createLine(PoiontEndold[X],PoiontEndold[Y],PoiontEndold[Z],
                                   PoiontStartold[X],PoiontStartold[Y],PoiontStartold[Z]);
    AcDbObjectId idlABnew = createLine(PoiontStartnew[X],PoiontStartnew[Y],PoiontStartnew[Z],
                                   PoiontEndnew[X],PoiontEndnew[Y],PoiontEndnew[Z]);
    AcDbObjectId idlBAnew = createLine(PoiontEndnew[X],PoiontEndnew[Y],PoiontEndnew[Z],
                             PoiontStartnew[X],PoiontStartnew[Y],PoiontStartnew[Z]);
    uAB = ugol(idlAB);
    uAC = ugol(idlAC);
    uBC = ugol(idlBC);
    uBA = ugol(idlBA);
    uABnew = ugol(idlABnew);
    uBAnew = ugol(idlBAnew);
    deltaAB = uAB - uABnew;
    deltaBA = uBA - uBAnew;
    uACnew = uAC - deltaAB;
    uBCnew = uBC - deltaBA;
    AcGeVector3d v1(cos(uACnew),sin(uACnew),0);
    AcGeVector3d v2(cos(uBCnew),sin(uBCnew),0);
    AcDbObjectId idr1 = createRay(PoiontStartnew[X],PoiontStartnew[Y],PoiontStartnew[Z],v1);
    AcDbObjectId idr2 = createRay(PoiontEndnew[X],PoiontEndnew[Y],PoiontEndnew[Z],v2);
    AcGePoint3dArray mas = NULL;
    mass = Get_intersection_point(idr1,idr2);
    for (i=0;i<mas.length();i++)
    {
        acutPrintf(_T("\np1 x = %g p1 y = % g"),mas[X],mas[Y]);
    }
    /*AcGePoint3d p = mass[1];
    /*return p;*/
   
}
AcGePoint3d PoiontStartold,AcGePoint3d PoiontEndold,AcGePoint3d PoiontStartnew,AcGePoint3d PoiontEndnew, AcGePoint3d Poiontunknow - находятся в одной плоскости.

Re: почему не пересекаются 2 луча?

функция ugol определяет угол между Оx и id (id - отрезок

Re: почему не пересекаются 2 луча?

> giena
Проверь размер массива и распечатай значения точек пересечния внутри функции Get_intersection_point
Кроме того что это за ерунда у тебя в печати точек? Должно  быть так:

for (i=0;i<mas.length();i++)
{
acutPrintf(_T("\np1 x = %g p1 y = % g"),mas[i][X],mas[i][Y]);
}

Учи C++!

Re: почему не пересекаются 2 луча?

Когда вставляешь код - вставляй его в теги:
[code]
здесь код
[/code]

Re: почему не пересекаются 2 луча?

блин ,спасибо, с печатью массива действительно облажался, внимания уже нет никакого....

Re: почему не пересекаются 2 луча?

результат такой же. Т.е. ничего, может надо метод intersectWith перегружать для луча?

Re: почему не пересекаются 2 луча?

попробовал еще раз получил вот что : p1 x = -1.961098E-012 p1 y = -6.252776E-013
?????

Re: почему не пересекаются 2 луча?

У тебя какая-то ерунда. Вот это у меня работает. Ищи у себя ошибку:

static AcGePoint3dArray Get_intersection_point (AcDbObjectId id1,AcDbObjectId id2)
{
  AcGePoint3d point;
  AcGePoint3dArray points;
  AcDbObjectPointer<AcDbRay> pRay1(id1,AcDb::kForRead);
  AcDbObjectPointer<AcDbRay> pRay2(id2,AcDb::kForRead);
  if (pRay1.openStatus() == Acad::eOk && pRay2.openStatus() == Acad::eOk) {
    Acad::ErrorStatus es = pRay1->intersectWith(pRay2.object(),AcDb::kOnBothOperands,points);
    acutPrintf(_T("\npoints.length()=%d"),points.length());
    for (int i=0; i < points.length(); i++) {
      acutPrintf(_T("\np =(%g %g)"),points[i][X],points[i][Y]);
    }
  }
  return points;
}
// TESTRAY command (do not rename)
static void TESTRAY(void)
{
  AcDbObjectId id1 = createRay(-10,-10,0,AcGeVector3d(0,1,0));
  AcDbObjectId id2 = createRay(+10,+10,0,AcGeVector3d(-1,0,0));
  Get_intersection_point (id1,id2);
}
Command: TESTRAY
points.length()=1
p =(-10.000000 10.000000)

Re: почему не пересекаются 2 луча?

да да, я уже сам проверил. Спасибо.

Re: почему не пересекаются 2 луча?

Разобрался. Ошибка очень досадная, моя невнииательность как всегда. Александру Ривилису агромный респект за то, что он отвечает даже на такие ламерские и глупые вопросы. Впредь буду тщательно проверять свой код перед тем как постить сюда. Извеняюсь.

Re: почему не пересекаются 2 луча?

> giena
smile Ну и отлично, что разобрался! Извиняю!