Предлагаю воспользоваться набором оверлейных операций (см. crossapi.h). Пример:
[CODE] // Создать пустой объект для записи шаблона для обрезки объектов
HOBJ templet = mapCreateSiteObject(hmap, hsite, IDDOUBLE2, 0);
// Создать пустой объект для записи обрабатываемого объекта
HOBJ object = mapCreateSiteObject(hmap, hsite, IDDOUBLE2, 0);
// Создать пустой объект для записи результата
// (для записи результата рекомендуется тип IDDOUBLE2 или IDDOUBLE3)
HOBJ objectpart = mapCreateSiteObject(hmap, hsite, IDDOUBLE2, 0);
// Запросить объект карты
mapReadObjectByNumber(hmap, hsite, templet, 1, templetnumber);
// Запросить объект карты
mapReadObjectByNumber(hmap, hsite, object, 1, objectnumber);
// Установить тип результирующего объекта равным типу обрабатываемого
mapDescribeObject(objectpart, mapObjectCode(object));
// Создать объект оверлейных операций
HOVL hovl = ovlCreate(hmap, 1, DOUBLENULL);
if (hovl == 0)
{
// Ошибка создания объекта оверлейных операций
}
else
{
// Установить шаблон для оверлейных операций
// (по основному контуру объекта, с согласованием контура
// шаблона с обрабатываемыми объектами)
int res = ovlSetTemplet(hovl, templet, 0, 1);
if (res == 0)
{
// Запросить код ошибки
if (ovlGetErrorCode(hovl) != 0)
{
// Запросить описание ошибки для вывода в окно или записи в журнал
::MessageBox(0, ovlGetError(hovl), "", MB_OK);
}
}
else
{
int errorcode = 0;
// Установить обрабатываемый объект и метод обработки
// (все контура, результат - все площадные контура)
int location = ovlSetObjectCross(hovl, object, -1, 0.0, 0, METHOD_SQUARE, 0);
// Расположение объекта относительно шаблона
if (location == 0)
{
// Запросить код ошибки
if (ovlGetErrorCode(hovl) != 0)
{
// Запросить описание ошибки
::MessageBox(0, ovlGetError(hovl), "", MB_OK);
}
}
else if (location == 1)
{
// Объект внутри шаблона
// ...
}
else if (location == 2)
{
// Объект вне шаблона
// ...
}
else // location == 3 или 4 (Объект пересекается с шаблоном)
{
int side;
while(1)
{
// Запросить очередную часть разрезаемого объекта
side = ovlGetNextObject(hovl, objectpart);
if (side == 0)
{
// Запросить код ошибки
if (ovlGetErrorCode(hovl) != 0)
{
// Запросить описание ошибки
::MessageBox(0, ovlGetError(hovl), "", MB_OK);
break;
}
// Запросить метрику основного контура шаблона, согласованного
// с частями разрезаемого объекта
if (ovlGetAdjustTemplet(hovl, templet, 0))
{
// Сохранить объект, если контур шаблона обновился
mapCommitObject(templet);
}
else
{
// Запросить код ошибки
if (ovlGetErrorCode(hovl) != 0)
{
// Запросить описание ошибки
::MessageBox(0, ovlGetError(hovl), "", MB_OK);
}
}
// Поиск частей разрезаемого объекта закончен
break;
}
// Установить разные коды объектов для результирующих объектов
if (side == 1)
{
// Объект, находящийся внутри шаблона
mapRegisterObjectByKey(objectpart, "L1000000008");
}
else
{
// Объект, находящийся вне шаблона
mapRegisterObjectByKey(objectpart, "L1000000007");
}
// Сохранить объект objectpart
mapCommitObjectAsNew(objectpart);
}
}
}
// Освободить объект оверлейных операций
ovlFree(hovl);
}
// Освободить объекты
mapFreeObject(objectpart);
mapFreeObject(object);
mapFreeObject(templet);[/CODE]