Показать сообщение отдельно
Старый 23.05.2019, 17:09   #414
Letos
Консультант
 
Регистрация: 28.06.2017
Сообщений: 555
Сказал(а) спасибо: 127
Поблагодарили 1,030 раз(а) в 366 сообщениях
Вес репутации: 344
Letos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордитсяLetos за этого человека можно гордится
По умолчанию

Цитата:
Сообщение от Letos Посмотреть сообщение
Попытался сделать пример подсчёта площади поверхности для выделенного объекта, но сразу оговорюсь - кроме того, что считаются все треугольники (будут проблемы со стыками объектов, если считать суммарную площадь нескольких объектов), ещё, из-за операций с вещественными числами (в основном, деление и корень), будет возникать погрешность (скорее всего неприемлемая). Например: есть шар с радиусом 100. Его площадь поверхности: 4*Pi*R^2 = 125663.706. Скрипт же у меня выдаёт 110134.391.

Код для получения площади


PHP код:

// длина вектора
function VectorLength(v) {
    return 
Math.sqrt(v.v.v.v.v.v.z)
}
/**
 * Вычитание векторов
 * @param {Vector} v1 
 * @param {Vector} v2 
 * @returns {Vector}
 */
function VectorSub(v1v2) {
    return {
        
xv1.v2.x,
        
yv1.v2.y,
        
zv1.v2.z
    
}
}

/**
 * Сложение векторов
 * @param {Vector} v1 
 * @param {Vector} v2 
 * @returns {Vector}
 */
function VectorAdd(v1v2) {
    return {
        
xv1.v2.x,
        
yv1.v2.y,
        
zv1.v2.z
    
}
}

// скалярное произведение векторов
function VectorDot(v1v2) {
    return 
v1.v2.v1.v2.v1.v2.z;
}
/**
 * Проекция точки на линию
 * @param {Vector} p Исходная точка
 * @param {Vector} ls точка на линии
 * @param {Vector} ld направление линии
 * @returns {Vector}
 */
function PointLineProj(plsld) {
    var 
VectorSub(pls)
    var 
c1 VectorDot(vld);
    var 
c2 VectorDot(ldld);
    var 
c1 c2;
    return {
        
xls.ld.c,
        
yls.ld.c,
        
zls.ld.c
    
}
}

/**
 * Расстояние от точки до линии
 * @param {Vector} p Исходная точка
 * @param {Vector} ls точка на линии
 * @param {Vector} ld направление линии
 */
function PointLineDistance(plsld) {
    var 
proj PointLineProj(plsld);
    var 
dv VectorSub(projp);
    return 
VectorLength(dv)
}

// Площадь треугольника - Основание * Высота / 2 (a*h/2)
// Точки p1, p2, p3 - вершины треугольника
// Если p1p2 - основание, тогда высота - расстояние от точки p3 до линии, на 
// которой лежит основание.
//
//        p3
//        /|\
//       / | \
//      /  |  \
//     /   |h  \
//    /____|____\
//  p1   a       p2
//
function Square(tri) {
    var 
p1 tri.Vertex1p2 tri.Vertex2p3 tri.Vertex3;
    var 
ld VectorSub(p1p2)
    var 
VectorLength(ld);
    var 
PointLineDistance(p3p1ld);
     return 
2;
}


var 
obj Model.Selected;
var 
0;
if (
obj.TriListsCount 0) {
    for (var 
0obj.TriListsCountt++) {
        var list = 
obj.TriLists[t];
        for (var 
0< list.Counti++) {
            var 
tri = list[i];
            if (
tri) {
                
+= Square(tri);
            }
        }
    }
}
alert('s = ' 'mm'); 
[свернуть]
Некоторое время гуглил, как получше искать площадь поверхности и набрёл на англоязычную фразу "Surface Area". Оказалось, что у списка треугольников есть такой метод, поэтому скрипт может выглядеть гораздо короче:

PHP код:
var area 0;
// Получение площади поверхности объекта
function GetSurfaceArea(obj){
  var 
result 0;
  if (
obj.TriListsCount 0) {
      for (var 
0obj.TriListsCountt++) {
          var list = 
obj.TriLists[t];
          
result += list.SurfaceArea();
      }
  }
  return 
result;
}

//Обработка объекта и вложенных объектов.
function ProcessObject(obj){
    if (
obj.List){
        for (var 
0obj.AsList().Counti++){
            
ProcessObject(obj[i]);
        }
    }
    else
        
area += GetSurfaceArea(obj);
}

for (var 
0Model.SelectionCounti++){
    var 
obj Model.Selections[i];
    
ProcessObject(obj);
}

alert('Площадь поверхности выделенных объектов = ' area 'mm\u00b2'); 
P.S. Также я заметил, что погрешность вычислений зависит от параметров "Гладкость дуг" (меньше - хуже) и "ядро C3D" (выкл. - хуже).

Последний раз редактировалось Letos; 23.05.2019 в 17:15. Причина: Удалил лишнюю цитату
Letos вне форума   Ответить с цитированием Вверх
5 пользователя(ей) сказали cпасибо:
bbb i ko (24.05.2019), Ovsyanicov (24.05.2019), roollz (24.05.2019), volunka (24.05.2019), zorro (23.05.2019)