Определить лежит ли точка внутри полигона элемента, имеющего площадь опоры (штриховка, плита, 3d-сетка и т.п.)

Обращение

bool res = ac_request("geometry_calc_2d","is_point_on_element_polygon",double x1,double y1, int iElemDedcr, bool mainContOnly, double grow_contour, double, grow_holes);

Здесь:

x1 и y1 - координаты исследуемой точки, iElemDescr - дескриптор объекта, чей полигон проверяется на содержание точки.

mainContOnly – если да, то учитывать только внешний контур второго полигона,

grow_contour и grow_holes – на сколько расширить или сузить контур и отверстия второго полигона.

Пример.

Считать  элементы 3d-сеток с ID="Рельеф" в список элементов, взять первый, создать на его базе объект ac_eleemnt_guid, из него получить объект ac_element. Получить рельеф в таблицу координат. И проверить лежит ли точка внутри полигона.

// считать таблицу координат элемент рельефа 3d mesh с ID="Рельеф"

int iMeshCoordTable; // дескриптор таблицы координат полигона

// считать элементы типа 3d-сетка с ID="Рельеф" в список № 2

ac_request("load_elements_list",2,"MeshType","ID","Рельеф","MainFilter",2);

// определить сколько элементов содержит список № 2

ac_request("get_loaded_elements_list_count",2);

int iicount = ac_getnumvalue();

if(iicount == 0)

{

   cout << "В проекте отсутствует 3d сетка с ID=Рельеф.\nПрограмма остановлена";

   return -1;

}

// создать объект динамической таблицы для координат полигона

object("create","ts_table",MeshCoordTable);

// установить фокус на первом элементе (индекс 0) списка № 2

ac_request("set_current_element_from_list",2, 0);

// создать объект для guid элемента

int iMeshGuidDescr; // дескриптор объекта guid

object("create","ac_element_guid",iMeshGuidDescr);

// записать из текущего элемента в списке № 2 guid в объект iMeshGuidDescr 

ac_request("store_cur_element_to_descr", iMeshGuidDescr);

int iMeshElemDedcr; // дескриптор объекта элемента

// создать объект для работы с элементом

object("create","ac_element",iMeshElemDedcr); 

// загрузить объект элемент из guid

ac_request("load_element_from_guid",iMeshElemDedcr,iMeshGuidDescr);

// считать таблицу координат полигона 

ac_request("get_element_value","SimpleCoordTable",iMeshCoordTable);

// проверить сколько точек содержит полученная таблица координат полигона

int irowcount;

ts_table(iMeshCoordTable, "get_rows_count", irowcount);

cout << "Количество точек в контуре рельефа=" << irowcount << "\n";

object("delete",MeshCoordTable);

double x1=1.1, y1=2.2; // координаты исследуемой точки

// проверить лежит ли точка с координатами x1, y1 

int res = ac_request("geometry_calc_2d","is_point_on_element_polygon",x1,y1, iMeshElemDedcr);

if(res == 1) 

{

   cout << "Точка находится внутри контура полигона элемента";

}