Определить лежит ли точка внутри полигона элемента, имеющего площадь опоры (штриховка, плита, 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 << "Точка находится внутри контура полигона элемента";
}