找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 13|回复: 0

( algorithm ) Tension 3DMESH 最小曲面

[复制链接]

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]void cmdMinSurf()
{
        ads_name ename;
        ads_point pickpoint;
        int stat;
        LPCWSTR name[2][2] = { { L"left", L"right"}, { L"front", L"back"} };
        TCHAR msg[256];
        AcDbObjectId idCurve[2][2];
        Acad::ErrorStatus es;
        int i, j, count;

        static int N = 40, M = 50; // Grid size. Made static for quick experiments.
        // I'm using AcGeVector3d instead of AcGePoint3d because so I can simply add and multiply.
        // p[0][M-1] - p[1][M-1] - ... p[N-2][M-1] - p[N-1][M-1]
        //           +-----------------------------+
        // p[0][M-2] | p[1][M-2] - ... p[N-2][M-2] | p[N-1][M-2]
        // ...       .    ...      ...             .
        // ...       .    ...      ...             .
        // p[0][1]   | p[1][1]   - ... p[N-2][1]   | p[N-1][1]
        //           +-----------------------------+
        // p[0][0]   - p[1][0]   - ... p[N-2][0]   - p[N-1][0]
        //
        // p[0][j] and p[N-1][j] are the fixed points on the given curves in X-directions
        // p[i][0] and p[i][M-1] are the fixed points on the given curves in Y-directions
        // p[1..N-2][1..M-2] are the points inside of the grid

        std::vector< std::vector<AcGeVector3d > > p; // works like AcGeVector3d p[N][M] - but dynamic size
        p.resize(N);
        for (auto& arr : p)
                arr.resize(M);       

        AcGePoint3d pt;
        AcGePoint3d startpoints[2][2], endpoints[2][2];

        for (i=0; i<2; ++i) // 0: left/right    1:front/back
        {
                for (j = 0; j < 2; ++j) // 0: left/front    1:right/back
                {
                        swprintf_s(msg, L"\nSelect %s border curve: ", name[i][j]);
                        stat = acedEntSel(msg, ename, pickpoint);
                        if (stat != RTNORM)
                                return;
                        es = acdbGetObjectId(idCurve[i][j], ename);
                        if (!es)
                        {
                                AcDbCurve *curve;
                                if ((es = acdbOpenObject(curve, idCurve[i][j], AcDb::kForRead)) == Acad::eOk)
                                {
                                        curve->getStartPoint(startpoints[i][j]);
                                        curve->getEndPoint(endpoints[i][j]);
                                        curve->close();
                                }
                        }
                }
        }

        std::vector<double> distances;
        distances.resize(4);

        bool reverse[2][2];
        //startpoints[2][2], endpoints[2][2];
        // The "normal" case is: curves run from left to right and from front to back
        // we must make sure that the l/r curves and the f/b curves don't run in opposite directions
        distances[0] = startpoints[0][0].distanceTo(startpoints[1][0]); // should be 0 (or minimal)
        distances[1] = startpoints[0][0].distanceTo(endpoints[1][0]);
        distances[2] = endpoints[0][0].distanceTo(startpoints[1][0]);
        distances[3] = endpoints[0][0].distanceTo(endpoints[1][0]);
        auto itMin = std::min_element(distances.begin(), distances.end());
        size_t ixLF = itMin - distances.begin();
        reverse[1][0] = !!(ixLF & 1);
        reverse[0][0] = !!(ixLF & 2);

        distances[0] = endpoints[1][1].distanceTo(endpoints[0][1]);
        distances[1] = endpoints[1][1].distanceTo(startpoints[0][1]);
        distances[2] = startpoints[1][1].distanceTo(endpoints[0][1]);
        distances[3] = startpoints[1][1].distanceTo(startpoints[0][1]); // should be 0 (or minimal)
        itMin = std::min_element(distances.begin(), distances.end());
        size_t ixRB = itMin - distances.begin();
        reverse[0][1] = !!(ixRB & 1);
        reverse[1][1] = !!(ixRB & 2);

        for (i = 0; i < 2; ++i) // 0: left/right    1:front/back
        {
                for (j = 0; j < 2; ++j) // 0: left/front    1:right/back
                {
                        AcDbCurve* curve;
                        if ((es = acdbOpenObject(curve, idCurve[i][j], AcDb::kForRead)) == Acad::eOk)
                        {
                                bool r = reverse[i][j];
                                double par, parStart, parEnd, dPar;
                                es = curve->getStartParam(parStart);
                                es = curve->getEndParam(parEnd);

                                count = i ? M : N;
                                dPar = (parEnd - parStart) / (count - 1);
                                for (int k = 0; k < count; ++k)
                                {
                                        par = parStart + k * dPar;
                                        es = curve->getPointAtParam(par, pt);
                                        int kr = r ? count-k-1 : k; // reverse or not?
                                        if (i)
                                                p[j ? N - 1 : 0][kr] = pt.asVector();
                                        else
                                                p[kr][j ? M - 1 : 0] = pt.asVector();
                                }
                                curve->close();
                        }
                }
        }


        // Roughly initialize grid       
        double _N = 1.0 / N, _M = 1.0 / M;
        for (i = 1; i < N - 1; ++i)
        {
                for (j = 1; j < M - 1; ++j)
                {
                        double fn = i * _N;
                        double fm = j * _M;
                        p[i][j] = (
                                    (fm * p[i][0] + (1.0 - fm) * p[i][M-1])
                                + (fn * p[0][j] + (1.0 - fn) * p[N-1][j])
                                ) / 2.0;                               
                }
        }

        // Vary grid points until there is no more relevant change
        double deltaMax = 0.1;
        double delta;
        int innerGridCount = (N - 2) * (M - 2);
        AcGeVector3d pNew;
        do {
                delta = 0.0;
                for (i = 1; i < N - 1; ++i)
                        for (j = 1; j < M - 1; ++j)
                        {
                                // Calculate a new point p[i][j] by the "average" from p[i-1][j], p[i+1][j], p[i][j-1] and p[i][j+1].
                                // This simulates p[i][j] being "dragged" to the point with the smallest distance to these neighbour points.
                                pNew = (p[i - 1][j] + p[i + 1][j] + p[i][j - 1] + p[i][j + 1]) / 4;
                                delta += (p[i][j] - pNew).lengthSqrd();
                                p[i][j] = pNew;
                        }
                delta = delta / innerGridCount;
        } while (delta > deltaMax);

        //AcDbPolyFaceMesh,        AcDbSubDMesh
        AcGePoint3dArray totalArray(N*M);
        for (i = 0; i < N; ++i)
                for (j = 0; j < M; ++j)
                        totalArray.append(asPnt3d(asDblArray(p[i][j])));

        AcDbDatabase* pDB = acdbHostApplicationServices()->workingDatabase();
        AcDbPolygonMesh* mesh = new AcDbPolygonMesh(AcDb::kSimpleMesh, N, M, totalArray, false, false);
        mesh->setDatabaseDefaults(pDB);
        AcDbObjectId meshId;
        postToDb(pDB, mesh, meshId);
}

Acad::ErrorStatus postToDb(AcDbDatabase *db, AcDbEntity* ent, AcDbObjectId& objId)
{
        Acad::ErrorStatus      es;
        AcDbBlockTable* pBlockTable;
        AcDbBlockTableRecord* pSpaceRecord;
        if ((es = db->getSymbolTable(pBlockTable, AcDb::kForRead)) != Acad::eOk)
                return es;
        if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE, pSpaceRecord, AcDb::kForWrite)) != Acad::eOk)
                return es;
        pBlockTable->close();
        es = pSpaceRecord->appendAcDbEntity(objId, ent);
        pSpaceRecord->close();
        ent->close();
        return es;
}[/code]

 

 

 

 

( algorithm ) Tension 3DMESH 最小曲面

主题

0

回帖

0

积分

管理员

积分
0
发表于 2024-7-28 09:28:43 | 显示全部楼层
  法拉利膜材作为一种高性能的建筑材料,在建筑、汽车及广告等多个领域有着广泛的应用。以下是对法拉利膜材型号、特点及优点的详细分析:
[img]http://www.mjgou.com/data/attachment/forum/202403/13/223041uiqmeujen4jjj6zv.jpg[/img]
[b]一、法拉利膜材型号[/b]
法拉利膜材有多种型号,包括但不限于以下几种:1302 S2 Flexlight Advanced:这是一种高性能IV型柔性复合膜材,以其卓越的透光性、耐久性和易维护性而受到青睐。942、1202 S2、1002 S2、902 S2、1212 S2、912 S2:这些型号同样属于法拉利膜材系列,各自具有不同的特性和适用范围,但具体特点需根据具体型号进一步分析。需要注意的是,法拉利膜材的型号可能随着产品更新换代而有所变化,具体型号及其特性请参考最新产品资料。
[img=860,1255]http://www.mjgou.com/data/attachment/forum/202403/13/223254bbblwlbvbvsbwlsl.jpg[/img]
[b]二、法拉利膜材特点[/b]
法拉利膜材的特点主要体现在以下几个方面:
1、高强度与耐用性:法拉利膜材采用高强度材料制成,具有良好的抗拉强度和撕裂强度,能够承受较大的外力作用而不易破损。耐用性强,能够在恶劣气候条件下保持稳定的性能,延长使用寿命。
2、透光性与美观性:部分型号如1302 S2 Flexlight Advanced具有高透光性,能够在保持室内光线充足的同时,提供清晰的视野。膜材表面平整光滑,色彩丰富多样,能够满足不同建筑和装饰需求,提升整体美观性。
3、轻质与灵活性:法拉利膜材重量较轻,便于运输和安装,能够降低施工成本和时间。膜材具有一定的柔韧性,能够适应各种复杂形状和结构的设计要求。
4、环保与可回收性:法拉利膜材符合环保要求,部分材料可回收利用,减少了对环境的影响。
[img]http://www.mjgou.com/data/attachment/forum/202403/13/223128owhn0099rrds5h5y.jpg[/img]
[b]三、法拉利膜材优点[/b]
法拉利膜材的优点主要体现在以下几个方面:
1、提升建筑性能:高强度与耐用性使得法拉利膜材能够提升建筑的稳定性和安全性,延长使用寿命。透光性与美观性使得建筑内部光线充足、视野开阔,同时提升整体美观度。
2、降低施工成本:轻质特性使得运输和安装成本降低,施工效率提高。膜材的柔韧性使得施工更加灵活多变,能够适应各种复杂地形和结构要求。
3、节能环保:部分材料可回收利用,符合环保要求,减少了对环境的影响。良好的透光性能够减少室内照明需求,降低能耗。
4、广泛应用领域:
法拉利膜材不仅适用于建筑领域(如体育设施、商业设施、文化设施、交通设施等),还广泛应用于汽车及广告领域(如高档车辆贴膜保护和装饰、广告招贴等),展现出其多功能的特性。

综上所述,法拉利膜材以其高强度、耐用性、透光性、美观性、轻质灵活性以及环保可回收性等优点,在建筑、汽车及广告等多个领域发挥着重要作用。具体型号的选择应根据实际需求和应用场景进行综合考虑。
[url=http://www.mjgou.com/forum-17-1.html][size=88914][color=Red]法拉利膜材中国代理商 - 膜结构网[/color][/size][/url]

 

 

 

 

( algorithm ) Tension 3DMESH 最小曲面

主题

0

回帖

2

积分

新手上路

积分
2
发表于 2024-8-6 10:42:43 | 显示全部楼层
法拉利膜材,作为法拉利技术织物工业集团(Serge Ferrari)的核心产品,在膜结构工程、建筑设计及工业应用等多个领域展现出卓越的性能和广泛的应用价值。以下是对法拉利膜材的详细分析:
[b]一、公司背景与实力[/b]
法拉利技术织物工业集团(Serge Ferrari)是全球柔性复合织物技术的领导企业之一,致力于为设计创新项目提供专业产品和专业经验。该公司秉持创新理念,致力于减少材料和能源消耗,同时提供更好的解决方案。其膜材产品因其轻柔、耐用及可循环利用的特性,得到了国际公认的知名建筑师和设计师的推荐使用。
[b]二、产品特点[/b]
轻柔耐用:法拉利膜材以其轻柔的质地和卓越的耐用性著称,能够满足各种复杂环境和长期使用的需求。
高透光率:法拉利膜材具有良好的透光性,不仅增加了建筑的美观度,还能保证室内光线充足,减少照明能耗。例如,某些型号的法拉利膜材透光率可达13%,同时具有较高的热能反射率(如73%),有助于调节室内温度。
防腐蚀与自洁性:膜材表面经过特殊处理,具有优异的防腐蚀性和自洁性。能够抵抗酸雨、盐分等化学物质的侵蚀,同时减少灰尘和污染物的附着,降低清洁成本。
防火难燃:法拉利膜材采用防火材料制成,不易燃烧,提高了建筑的安全性。
环保性:膜材材料可循环利用,符合现代环保理念。法拉利技术织物工业集团还利用Texyloop高效回收系统提供产品循环再生服务,满足生态环保的期望。
高性能技术参数:如法拉利STFE膜材,具有极高的耐磨性、抗老化性、耐化学性和高透明度。其抗拉强度高,能够有效抵抗外界力量的冲击;耐热性能好,能在高温环境下保持稳定。
[b]三、应用领域[/b]
法拉利膜材广泛应用于以下领域:
建筑及设计:应用于停车棚膜结构、体育看台膜结构、球场膜结构、景观膜结构、环境工程膜结构以及充气膜结构等各种膜结构工程。其轻柔耐用的特性使得膜结构建筑更加美观、经济且实用。
工业及特种应用:在化工、食品、医药等行业中,法拉利膜材的耐化学性、耐高温性和机械稳定性使其成为高要求的工业场合的理想选择。
家具及游艇:法拉利膜材的优异性能也使其在家具和游艇制造领域得到应用,提升了产品的整体品质和耐用性。
[b]四、技术创新与发展[/b]
法拉利技术织物工业集团一直致力于技术创新和产品研发。其Précontraint®技术专利为材料提供了最佳的重量/性能比及尺寸稳定性,适应了最苛刻的结构要求。同时,公司还通过预应力技术提高材料的同质性和可靠性,进一步提升了产品的性能和使用寿命。
[b]五、总结[/b]
法拉利膜材以其轻柔耐用、高透光率、防腐蚀与自洁性、防火难燃以及环保性等特点,在多个领域展现出卓越的性能和广泛的应用价值。作为柔性复合织物技术的全球领导企业之一,法拉利技术织物工业集团将继续秉承创新理念,为客户提供更加优质的产品和服务。

 

 

 

 

( algorithm ) Tension 3DMESH 最小曲面
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-11-14 11:23 , Processed in 0.108771 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表