Хорошо, проверим, есть ли ошибка в логике
Для проверки модифицируем функцию таким образом, чтобы из кода рисовался тестовый полигон, который будет пересекать круг.
Легенда:
- Красный - секущий круг
- Красный пунктир - линии пересечения
- Полигон с синими границами - тестовый полигон
[CODE]void getTestLineCrossCircle(MapView *mapview_)
{
//имитация береговой черты
HOBJ hPolygon = mapCreateSiteObject(mapview_->h_gd, mapview_->taskCoord);
mapRegisterObject(hPolygon,131044100,LOCAL_SQUARE);
mapAppendPointPlane(hPolygon,5110074, 6375971);
mapAppendPointPlane(hPolygon,5159727, 6387064);
mapAppendPointPlane(hPolygon,5129354, 6404760);
mapAppendPointPlane(hPolygon,5147050, 6452300);
mapAppendPointPlane(hPolygon,5103207, 6464185);
mapAppendPointPlane(hPolygon,5119318, 6516480);
mapAppendPointPlane(hPolygon,5072041, 6487691);
mapAppendPointPlane(hPolygon,5110074, 6375971);
mapCommit(hPolygon);
mapFreeObject(hPolygon);
//секущий круг
HOBJ hCircle;
hCircle = mapCreateSiteObject(mapview_->h_gd, mapview_->taskCoord);
mapRegisterObject(hCircle,201053200,LOCAL_SQUARE);
DOUBLEPOINT altCenter;
altCenter.X = 5045102; altCenter.Y = 6399477;
mapBuildEllpse( hCircle, &altCenter/*&dpos*/, 100000/*radius*/, 100000/*radius*/, 0, 100);
mapAppendPointPlane(hCircle, mapXPlane( hCircle, 1 ), mapYPlane( hCircle, 1 ));
//объект для сохранения линий пересечения
HOBJ hLand = mapCreateSiteObject(mapview_->h_gd, mapview_->taskCoord);
mapRegisterObject(hLand, 221054733,LOCAL_LINE);
int excode(0);
int flag = WO_FIRST;
HOBJ hObj = mapCreateSiteObject(mapview_->h_gd, mapview_->taskCoord);
HSELECT select = mapCreateSiteSelectContext( mapview_->h_gd, mapview_->taskCoord ); //селект содержит все нарисованные элементы слоя
mapSelectLocal( select, -1, 0); //блок всех локализаций
mapSelectLocal( select, LOCAL_SQUARE, 1); //выбираем площадные объекты
while(mapSeekSelectObject(mapview_->h_gd, hObj, select, flag))
{
flag = WO_NEXT;
if(hObj)
{
excode = mapObjectExcode(hObj);
if(excode == /*131044100*/31110000) //131044100 - корона, 31110000 - океаны и моря
{
//пересечение
HCROSS hCross = mapCreateObjectsCross( hCircle, hObj, LOCAL_LINE, 0);
if (hCross) //0 если нет пересечения или если ошибка
{
HOBJ hIntersect = mapCreateSiteObject(mapview_->h_gd, mapview_->taskCoord);
mapRegisterObject(hIntersect, 221054733,LOCAL_LINE);
while( mapGetNextCross( hCross, hIntersect) ) //0 если ошибки
{
int cnt = mapPointCount( hIntersect, 0 );
if( cnt )
{
int subject(0);
if( mapPointCount( hLand, 0 ) ) subject = mapCreateSubject( hLand ); //если метрика объекта занята - создаем подобъект
for( int i = 1; i <= cnt; i++ )
mapAppendPointPlane( hLand, mapXPlane( hIntersect, i ), mapYPlane( hIntersect, i ), subject );
}
}
mapFreeObject( hIntersect );
}
mapFreeObjectsCross( hCross );
}
}
}
mapDeleteSelectContext( select );
mapCommit( hLand );
mapFreeObject( hLand );
// mapDeleteObject(hCircle);
mapCommit( hCircle );
mapFreeObject(hCircle);
mapFreeObject( hObj );
mapview_->dmap->UpdatePictureBorder();
}
[/CODE]В [URL=https://hostingkartinok.com/show-image.php?id=6d9a778d2dc88c7e24c1860144d9fd71]результате выполнения этого кода[/URL] получим 3 линии пересечения, как и должно быть.
Далее, раскомментируем второй excode в строке:
[CODE]if(excode == /*131044100*/31110000) //131044100 - корона, 31110000 - океаны и моря[/CODE]В этом случае в качестве объекта, который режут, выступает полигон "Океаны и моря". В [URL=https://hostingkartinok.com/show-image.php?id=9bad0b29e40a535d33945e51a0137db4]результате получаем[/URL] только одну линию пересечения, хотя очевидно, что должна быть как минимум вторая в правом нижнем углу. Очевидно потому, что этот объект "Океаны и моря" [URL=https://hostingkartinok.com/show-image.php?id=0283908273597d67d234b6a5706c3c71]выглядит вот так[/URL], если выделить его (QDMapView::SetObjSelected()).
Возможно, причина - сложность полигона "Океаны и моря", он имеет полости, [URL=https://hostingkartinok.com/show-image.php?id=d3294afbebeb6421bf37756f4ce4312f]как видно на картинке[/URL].
Как бы то ни было, мне нужно получить все линии пересечения.