Почему различна площадь двух "одинаковых" многоугольников? - Страница 3
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Почему различна площадь двух "одинаковых" многоугольников?

Почему различна площадь двух "одинаковых" многоугольников?

Ответ
Поиск в этой теме
Непрочитано 11.06.2023, 10:33
Почему различна площадь двух "одинаковых" многоугольников?
Юрий_Нд
 
Регистрация: 29.01.2016
Сообщений: 720

Доброго дня Уважаемые.
Сегодня такой вопрос:
- слева я начертил многоугольник, который в начале состоял из множества не объединённых отрезков;
- затем я скопировал все отрезки вправо и объединил в полилинию;
- и в конце концов объединил левые отрезки в полилинию.
Вопрос:"Почему площади левого и правого многоугольника различные? Примерно 33 и 24 м²"
Спасибо ____________ Юрий.
https://dropmefiles.com/s3o9y
Просмотров: 4180
 
Непрочитано 21.06.2023, 22:01
#41
Старый Дилетант

Дилетант
 
Регистрация: 06.12.2017
Сообщений: 2,944


Цитата:
Сообщение от gumel Посмотреть сообщение
Ну, а вот это вообще непонятно. Площадь левой фигуры ноль. После копирования, не ноль:
У меня почему-то площадь у обеих 2400 и каким способом ни копирую - получается так же
Старый Дилетант вне форума  
 
Непрочитано 22.06.2023, 05:12
#42
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 2,075


Цитата:
Сообщение от Старый Дилетант Посмотреть сообщение
площадь у обеих 2400
В свойствах на панели выводится одно и то же правильное значение. А если смотреть через GeomProps - разные. У меня еще своя считалка суммарной длины есть, написанная, когда ковырял программирование под ObjectARX. Она тоже работает через getArea, и тоже показывает разные площади.

Интересу ради, простейшая команда, которая считает площадь через:
- AcDbCurve::getArea
- AcDbPolyline::getArea (на всякий случай, вдруг она переопределенная)
- честным суммированием трапеций:

Код:
[Выделить все]
 
#include "StdAfx.h"


void GetArea(AcDbCurve* pCurve)
{
	double area;
	if (pCurve->getArea(area) != Acad::eOk)
		return;

	acutPrintf(ACRX_T("\nGet  area (Curve)    = %f"), area);
}


void GetArea(AcDbPolyline* pPolyline)
{
	double area;
	if (pPolyline->getArea(area) != Acad::eOk)
		return;

	acutPrintf(ACRX_T("\nGet  area (Polyline) = %f"), area);
}


void CalcArea(AcDbPolyline* pPolyline)
{
	if (pPolyline->hasBulges())
		return;

	unsigned nSegments = pPolyline->numVerts() - 1;

	AcGePoint2d point_i;
	AcGePoint2d point_j;

	double area = 0.0;

	for (unsigned iSegment = 0; iSegment < nSegments; iSegment++) {
		unsigned i = iSegment;
		unsigned j = iSegment + 1;
		
		pPolyline->getPointAt(i, point_i);
		pPolyline->getPointAt(j, point_j);

		area += (point_i.x - point_j.x) * (point_i.y + point_j.y);
	}

	pPolyline->getPointAt(nSegments, point_i);
	pPolyline->getPointAt(0, point_j);

	area += (point_i.x - point_j.x) * (point_i.y + point_j.y);

	area = std::abs(area) / 2.0;

	acutPrintf(ACRX_T("\nCalc area (Polyline) = %f"), area);
}


void GetArea(AcDbEntity* pEnt)
{
	if (pEnt->isKindOf(AcDbCurve::desc())) {
		AcDbCurve* pCurve = AcDbCurve::cast(pEnt);
		GetArea(pCurve);
	}

	if (pEnt->isKindOf(AcDbPolyline::desc())) {
		AcDbPolyline* pPolyline = AcDbPolyline::cast(pEnt);
		GetArea(pPolyline);
		CalcArea(pPolyline);
	}
}


void GetArea(ads_name name)
{
	AcDbObjectId objId;
	if (acdbGetObjectId(objId, name) != Acad::eOk)
		return;

	AcDbEntity* pEnt;
	if (acdbOpenObject(pEnt, objId) != Acad::eOk)
		return;

	GetArea(pEnt);

	pEnt->close();
}


void GetArea()
{
	for (;;) {
		ads_name  name;
		ads_point point;
		
		switch (acedEntSel(NULL, name, point)) {
		case RTNORM:
			GetArea(name);
			continue;
		case RTCAN:
			return;
		}
	}
}


extern "C" __declspec(dllexport) AcRx::AppRetCode 
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
	const ACHAR* cmdGroupName  = ACRX_T("GetArea");
	const ACHAR* cmdGlobalName = ACRX_T("GetArea");
	const ACHAR* cmdLocalName  = ACRX_T("GetArea");
	const Adesk::Int32 commandFlags = ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET;

	switch (msg) {
		case AcRx::kInitAppMsg:
			acrxUnlockApplication(appId);
			acrxRegisterAppMDIAware(appId);
			acedRegCmds->addCommand(cmdGroupName, cmdGlobalName, cmdLocalName, commandFlags, GetArea);
			break;
		case AcRx::kUnloadAppMsg:
			acedRegCmds->removeGroup(cmdGroupName);
		break;
	}
	return AcRx::kRetOK;
}
Кому интересно поковырять - во вложении проект для VS2022, и ARX, собранный под Acax2020x64. Добавляет команду GETAREA. Перед сборкой в папку ObjectARX закинуть содержимое.

P.S.
Которые в Лиспе сильны - предложите и вашу версию. А то, кто Автокад сиплюсплющит, тот его не лиспует.
Миниатюры
Нажмите на изображение для увеличения
Название: GetArea.png
Просмотров: 54
Размер:	7.4 Кб
ID:	256850  
Вложения
Тип файла: zip GetArea.zip (31.6 Кб, 1 просмотров)
Нубий-IV вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Почему различна площадь двух "одинаковых" многоугольников?

Реклама i


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему лофт не создает тело из двух областей? Zets AutoCAD 10 08.04.2024 13:05
Почему нагрузка от двух кранов как от одного? eilukha Конструкции зданий и сооружений 16 13.03.2024 17:00
Площадь застройки здания Wera222 Архитектура 49 29.11.2018 11:05
Должна ли, площадь проёма (1.2 м) без двери учитываться при подсчёте площади квартиры? freshman Архитектура 12 28.05.2014 20:37
Как в AutoCAD задать площадь, чтобы площадь сразу была написана на черчеже? Elbrus AutoCAD 10 14.01.2010 08:38