Перейти к публикации

Определение толщины


Eugene186

Рекомендованные сообщения

Задача: необходимо определить толщины материала в нескольких направлениях порядка 1000, есть некоторая точка центр из нее исходят лучи, которые представляют эти направления.

Решение: ищем пересечение каждого луча со всеми поверхностями. В расчете аппроксимация каждой поверхности треугольниками

(

long triangcount;

float *tesstriang;

status = Face2->GetTessTriangleCount ( &triangcount );

tesstriang = new float[9 * triangcount];

status = Face2->IGetTessTriangles (VARIANT_TRUE, tesstriang);

). По сути решается задача пересения прямой с плоскостью.

Проблема: не находится пересечение некоторых лучей с поверхностями, которые эти лучи явно пересекают.

Альтернатива: можно брать параметры поверхностей и составлять аналитические уравнения, но поверхности могут быть резаными и необходимо будет определять принадлежность очки к ней.

Подскажите в чем может быть проблема.

Может быть есть какое-то более простое представление поверхностей с SW.

Заранее спасибо

Ссылка на сообщение
Поделиться на других сайтах


Задача: необходимо определить толщины материала в нескольких направлениях порядка 1000, есть некоторая точка центр из нее исходят лучи, которые представляют эти направления.

Решение: ищем пересечение каждого луча со всеми поверхностями. В расчете аппроксимация каждой поверхности треугольниками

......

По сути решается задача пересения прямой с плоскостью.

По моему аппроксимация здесь не нужна. Если у Вас есть некоторая точка(центр) и направления лучей (вектор), то достаточно спроецировать эту точку (центр) на поверхность. В этом случае функция IGetTessTriangles не нужна. Лучше, на мой взгляд использовать: GetProjectedPointOn. Она есть и в Face и в Surface. Т.е. можно работать как с твердыми телами, так и с поверхностями. И пример на использование этой функции, может пригодится.

void CRayFace::IntersectionRay()

{

	HRESULT hres;

	CComVariant vBodyArr;



	CComPtr<IModelDoc2> swModel;

	hres = iSwApp->get_IActiveDoc2(&swModel);

	if(swModel == NULL) {return;}

	long DocType;

	hres = swModel->GetType(&DocType);

	if(DocType != swDocPART) { return;}



	CComQIPtr<IPartDoc> swPart;

	swPart = swModel;



	hres = swPart->GetBodies2(swSolidBody, VARIANT_TRUE, &vBodyArr);



	SAFEARRAY *psaBody = V_ARRAY(&vBodyArr);

	LPDISPATCH *pBodyArray = NULL; 

	long bodyIndex = -1;

	long bodyCount = -1;



	hres = SafeArrayAccessData(psaBody, (void **) &pBodyArray);

	hres = SafeArrayGetUBound(psaBody, 1, &bodyIndex);

	bodyCount = bodyIndex + 1;

	if(bodyCount != 1) {return;}



	CComQIPtr<IBody2> swBody;

	swBody = pBodyArray[0];



	CComPtr<IFace2> swFace;

	hres = swBody->IGetFirstFace(&swFace);



	CComPtr<IMathUtility> swMathUtil = NULL;

	hres = iSwApp->IGetMathUtility(&swMathUtil);



	double *pPoint = new double[3]; // центр пучка лучей

	ZeroMemory(pPoint, 3 * sizeof(double));

	// координаты центра пучка лучей

	pPoint[0] = 0;

	pPoint[1] = 0;

	pPoint[2] = 0;



	double dRev = 3.14159265358979323846 * 2;

	double dStep = dRev / 18;



	while(swFace != NULL)

	{

		CComPtr<IFace2> pNextFace;

		CComPtr<IMathPoint> centerPoint = NULL; 

		hres = swMathUtil->ICreatePoint(pPoint, ¢erPoint);



		CComPtr<IMathPoint> intersectPoint;

		CComPtr<IMathVector> vectorRay;



		for(double i = 0; i < dRev; i = i + dStep)

		{

			for(double j = 0; j < dRev; j = j + dStep)

			{

				for(double k = 0; k < dRev; k = k + dStep)

				{

					double *pVector = new double[3]; // значения вектора

					ZeroMemory(pVector, 3 * sizeof(double));

					pVector[0] = cos(i);

					pVector[1] = cos(j);

					pVector[2] = cos(k);

					hres = swMathUtil->ICreateVector(pVector, &vectorRay);

					hres = swFace->GetProjectedPointOn(centerPoint, vectorRay, &intersectPoint); функция прецирования точки на поверхность

					if(intersectPoint == NULL)

					{

						vectorRay = NULL;

						continue;

					}

					double *resPoint = new double[3]; // значение точки пересечения луча с поверхностью

					ZeroMemory(resPoint, 3 * sizeof(double));

					hres = intersectPoint->get_IArrayData(resPoint);

					// координаты точки пересечения луча и поверхности

					double dX = resPoint[0];

					double dY = resPoint[1];

					double dZ = resPoint[2];



					delete[] resPoint;

					delete[] pVector;

					vectorRay = NULL;

					intersectPoint = NULL;

				}

			}

		}

		

		swFace->IGetNextFace(&pNextFace);

		swFace = NULL;

		swFace = pNextFace;

	}

	delete[] pPoint;

}
Ссылка на сообщение
Поделиться на других сайтах

У меня SW 2006, в нем нет такой функции. Может быть есть другой вариант?

Жаль, что у Вас нет такой функции, она бы облегчила жизнь.

Проблема: не находится пересечение некоторых лучей с поверхностями, которые эти лучи явно пересекают.

Альтернатива: можно брать параметры поверхностей и составлять аналитические уравнения, но поверхности могут быть резаными и необходимо будет определять принадлежность очки к ней.

Аналитическое уравнение составлять, я думаю, в данном случае, не надо. Поверхность может быть достаточно сложной. Придется, по всей видимости, все-таки воспользоваться функцией IGetTessTriangles. Проверять, попадает ли луч в область, ограниченную треугольником, попадает ли он на отрезок, соединяющий вершины его (в этом случае он попадает на соседний треугольник). Правда, циклы проверки будут большие, если поверхности довольно-таки сложными. А то, что не находятся пересечения луча с некоторыми поверхностями, которые он явно пересекает, то надо бы все-таки посмотреть код.
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




×
×
  • Создать...