第4章_多边形偏移操作

news/2025/11/29 12:20:32/文章来源:https://www.cnblogs.com/znlgis/p/19285980

第四章 多边形偏移操作(C#版)

4.1 引言

多边形偏移(Polygon Offsetting)也称为多边形膨胀(Inflate)或收缩(Deflate),是指将多边形的边界向内或向外移动指定的距离。这是一个在实际应用中极为常见的操作,从CNC加工的刀具补偿到地图制作的缓冲区分析,从3D打印的轮廓生成到游戏开发的碰撞边界创建,多边形偏移操作无处不在。

Clipper2提供了强大而灵活的偏移功能,支持多种连接类型和端点类型,能够处理复杂的多边形结构。本章将详细介绍Clipper2 C#版本中多边形偏移的使用方法和高级技巧。

4.2 偏移的基本概念

4.2.1 什么是多边形偏移

多边形偏移是将多边形的每条边沿其法线方向移动指定距离的操作。当偏移距离为正值时,多边形向外扩张;当偏移距离为负值时,多边形向内收缩。

原始多边形          正向偏移(膨胀)      负向偏移(收缩)
┌─────────┐        ┌───────────────┐    ┌───────┐
│         │        │               │    │       │
│         │   →    │   ┌─────┐     │    │       │
│         │        │   │     │     │    └───────┘
└─────────┘        └───┴─────┴─────┘

4.2.2 偏移中的几何问题

在多边形偏移过程中,会遇到几个重要的几何问题:

拐角处理

当两条边在顶点相遇时,它们的偏移边会在拐角处产生间隙(外角)或重叠(内角)。处理这些拐角的方式称为"连接类型"(Join Type)。

       原始拐角              圆角连接            斜角连接            方角连接(Round)            (Miter)            (Square)╱                    ╱  ‾‾‾             ╱      ╲            ╱──────╲╱                    ╱      ╲           ╱        ╲          ╱        ╲
────╱              ──────╱        ╲    ─────╱          ╲   ─────╱          ╲

端点处理

对于开放路径(折线),需要决定如何处理两端的端点。处理端点的方式称为"端点类型"(End Type)。

原始折线        方角端点           圆角端点         平头端点─────        ┌─────┐           (─────)         ═════└─────┘

自交处理

当偏移距离过大时,偏移后的多边形可能会自交。Clipper2能够自动检测并正确处理这些自交情况。

4.2.3 偏移方向与符号约定

在Clipper2中:

  • 正值偏移:使多边形区域增大(向外扩张)
  • 负值偏移:使多边形区域减小(向内收缩)

这个约定与多边形的顶点方向无关——无论多边形是顺时针还是逆时针,正值始终表示扩张。

4.3 使用简化API进行偏移

Clipper2提供了简化的偏移函数,可以用一行代码完成偏移操作。

4.3.1 InflatePaths函数

using System;
using Clipper2Lib;class InflatePathsExample
{static void Main(){// 创建一个正方形Paths64 paths = new Paths64();paths.Add(Clipper.MakePath(new long[] { 100, 100, 200, 100, 200, 200, 100, 200 }));// 向外偏移10个单位,使用圆角连接Paths64 inflated = Clipper.InflatePaths(paths, 10, JoinType.Round, EndType.Polygon);Console.WriteLine($"膨胀后顶点数: {inflated[0].Count}");// 向内偏移10个单位Paths64 deflated = Clipper.InflatePaths(paths, -10, JoinType.Round, EndType.Polygon);Console.WriteLine($"收缩后顶点数: {deflated[0].Count}");}
}

4.3.2 方法签名

public static Paths64 InflatePaths(Paths64 paths,              // 输入路径double delta,               // 偏移距离(正值膨胀,负值收缩)JoinType joinType,          // 连接类型EndType endType,            // 端点类型double miterLimit = 2.0,    // 斜角限制(仅对Miter连接有效)double arcTolerance = 0.0   // 弧度容差(仅对Round连接有效)
)

4.3.3 使用浮点数坐标

using Clipper2Lib;class FloatOffsetExample
{static void Main(){// 使用浮点数坐标PathsD pathsD = new PathsD();pathsD.Add(Clipper.MakePath(new double[] { 1.5, 1.5, 2.5, 1.5, 2.5, 2.5, 1.5, 2.5 }));// 偏移0.1个单位PathsD result = Clipper.InflatePaths(pathsD, 0.1, JoinType.Round, EndType.Polygon, 2.0, 0.01);Console.WriteLine($"结果顶点数: {result[0].Count}");}
}

4.4 连接类型(JoinType)

连接类型决定了在多边形的拐角处如何连接偏移后的边。

4.4.1 Round(圆角连接)

圆角连接在拐角处创建圆弧形的过渡。这是最常用的连接类型,产生的结果最为平滑。

Paths64 result = Clipper.InflatePaths(paths, 10, JoinType.Round, EndType.Polygon);

特点

  • 拐角处为圆弧形
  • 视觉效果最平滑
  • 顶点数量较多
  • 适合CNC加工、3D打印等需要圆滑轮廓的应用

弧度容差(Arc Tolerance)

arcTolerance参数控制圆弧的精度。值越小,圆弧越精确,但顶点数量越多:

// 高精度圆弧(更多顶点)
Paths64 highQuality = Clipper.InflatePaths(paths, 10, JoinType.Round, EndType.Polygon, 2.0, 0.1);// 低精度圆弧(较少顶点)
Paths64 lowQuality = Clipper.InflatePaths(paths, 10, JoinType.Round, EndType.Polygon, 2.0, 1.0);

如果arcTolerance为0或负值,Clipper2会根据偏移距离自动选择一个合适的值。

4.4.2 Miter(斜角连接)

斜角连接延长相邻的偏移边直到它们相交。这会在锐角处产生尖锐的突出。

Paths64 result = Clipper.InflatePaths(paths, 10, JoinType.Miter, EndType.Polygon);

特点

  • 锐角处会产生尖锐的尖角
  • 顶点数量与原始多边形相同
  • 在非常锐的角度时,尖角可能延伸得非常远

斜角限制(Miter Limit)

miter_limit参数用于限制斜角的最大长度。当斜角延伸超过此限制时,会被截断为平头:

// miter_limit = 2.0(默认值)
Paths64 result1 = InflatePaths(paths, 10, JoinType::Miter, EndType::Polygon, 2.0);// miter_limit = 4.0(允许更长的斜角)
Paths64 result2 = InflatePaths(paths, 10, JoinType::Miter, EndType::Polygon, 4.0);// miter_limit = 1.0(斜角很快被截断)
Paths64 result3 = InflatePaths(paths, 10, JoinType::Miter, EndType::Polygon, 1.0);

斜角限制的计算方式:当斜角长度超过 delta * miter_limit 时,斜角会被截断。

4.4.3 Square(方角连接)

方角连接在拐角处创建矩形的突出,每个拐角固定向外延伸一个偏移距离的长度。

Paths64 result = InflatePaths(paths, 10, JoinType::Square, EndType::Polygon);

特点

  • 每个拐角处添加固定大小的矩形突出
  • 产生的形状较为规则
  • 顶点数量是原始多边形的两倍
  • 适合需要均匀边界厚度的应用

4.4.4 Bevel(斜切连接)

斜切连接(也称为倒角)在拐角处创建一个平面截断,而不是尖角或圆弧。

Paths64 result = InflatePaths(paths, 10, JoinType::Bevel, EndType::Polygon);

特点

  • 拐角处为斜切平面
  • 类似于miter_limit=1.0时的Miter连接
  • 顶点数量是原始多边形的两倍
  • 视觉效果介于Miter和Square之间

4.4.5 连接类型对比

// 创建一个三角形来展示不同连接类型的效果
Paths64 triangle;
triangle.push_back(MakePath({0, 100, 50, 0, 100, 100}));// 分别使用不同的连接类型偏移
Paths64 roundResult = InflatePaths(triangle, 10, JoinType::Round, EndType::Polygon);
Paths64 miterResult = InflatePaths(triangle, 10, JoinType::Miter, EndType::Polygon);
Paths64 squareResult = InflatePaths(triangle, 10, JoinType::Square, EndType::Polygon);
Paths64 bevelResult = InflatePaths(triangle, 10, JoinType::Bevel, EndType::Polygon);
连接类型 锐角表现 顶点数量 适用场景
Round 圆弧过渡 平滑外观、CNC加工
Miter 尖锐延伸 等于原始 保持尖角外观
Square 矩形突出 2倍原始 规则边界
Bevel 斜切平面 2倍原始 倒角效果

4.5 端点类型(EndType)

端点类型决定了开放路径(折线)的两端如何处理。对于闭合路径(多边形),端点类型应设为Polygon或Joined。

4.5.1 Polygon端点

用于闭合的多边形,路径会自动闭合。

Paths64 paths;
paths.push_back(MakePath({100, 100, 200, 100, 200, 200, 100, 200}));
Paths64 result = InflatePaths(paths, 10, JoinType::Round, EndType::Polygon);

4.5.2 Joined端点

类似于Polygon,但专门用于开放路径的处理,路径两端会连接起来形成闭合的偏移区域。

Paths64 openPath;
openPath.push_back(MakePath({100, 100, 200, 100, 200, 200}));  // 一条折线
Paths64 result = InflatePaths(openPath, 10, JoinType::Round, EndType::Joined);
// 结果是一个闭合的管状区域

4.5.3 Butt端点(平头端点)

在路径端点处创建垂直于路径方向的平头截断。

Paths64 openPath;
openPath.push_back(MakePath({100, 100, 200, 100, 200, 200}));
Paths64 result = InflatePaths(openPath, 10, JoinType::Round, EndType::Butt);
// 路径两端是平头的

特点

  • 端点处与路径方向垂直
  • 产生平整的端面
  • 偏移后的长度与原始路径相同

4.5.4 Square端点(方角端点)

类似于Butt端点,但在端点处向外延伸一个偏移距离的长度。

Paths64 openPath;
openPath.push_back(MakePath({100, 100, 200, 100, 200, 200}));
Paths64 result = InflatePaths(openPath, 10, JoinType::Round, EndType::Square);
// 路径两端是方形的,向外延伸

特点

  • 端点处创建方形突出
  • 偏移后的长度增加 2 * delta

4.5.5 Round端点(圆角端点)

在路径端点处创建半圆形的端帽。

Paths64 openPath;
openPath.push_back(MakePath({100, 100, 200, 100, 200, 200}));
Paths64 result = InflatePaths(openPath, 10, JoinType::Round, EndType::Round);
// 路径两端是圆形的

特点

  • 端点处为半圆形
  • 视觉效果平滑
  • 偏移后的长度增加 2 * delta

4.5.6 端点类型对比

端点类型 描述 长度变化 适用场景
Polygon 闭合多边形 不适用 闭合图形
Joined 开放路径闭合 不适用 创建管状区域
Butt 平头截断 无变化 精确边界
Square 方形延伸 +2*delta 方形端帽
Round 圆形端帽 +2*delta 圆滑端帽

4.6 使用ClipperOffset类

对于需要更多控制的场景,可以使用ClipperOffset类。

4.6.1 基本使用

#include "clipper2/clipper.h"
using namespace Clipper2Lib;int main() {// 创建ClipperOffset对象ClipperOffset offsetter;// 设置属性offsetter.MiterLimit(2.0);offsetter.ArcTolerance(0.25);// 添加路径Paths64 paths;paths.push_back(MakePath({100, 100, 200, 100, 200, 200, 100, 200}));offsetter.AddPaths(paths, JoinType::Round, EndType::Polygon);// 执行偏移Paths64 result;offsetter.Execute(10, result);  // 偏移10个单位return 0;
}

4.6.2 多次偏移

使用ClipperOffset类可以对同一组路径执行多次不同距离的偏移:

ClipperOffset offsetter;
offsetter.AddPaths(paths, JoinType::Round, EndType::Polygon);// 执行多个不同距离的偏移
Paths64 offset5, offset10, offset15;
offsetter.Execute(5, offset5);
offsetter.Execute(10, offset10);
offsetter.Execute(15, offset15);// 所有偏移都基于原始路径

4.6.3 使用PolyTree输出

ClipperOffset offsetter;
offsetter.AddPaths(paths, JoinType::Round, EndType::Polygon);PolyTree64 tree;
offsetter.Execute(10, tree);// 遍历PolyTree获取层次结构
// 这对于负向偏移产生的孔洞很有用

4.6.4 清空和复用

ClipperOffset offsetter;for (int i = 0; i < 100; i++) {// 清空之前的数据offsetter.Clear();// 添加新的路径offsetter.AddPaths(GetPaths(i), JoinType::Round, EndType::Polygon);// 执行偏移Paths64 result;offsetter.Execute(10, result);
}

4.6.5 属性设置

ClipperOffset offsetter;// 设置斜角限制(用于Miter连接)
offsetter.MiterLimit(4.0);// 设置弧度容差(用于Round连接)
offsetter.ArcTolerance(0.1);// 设置是否保留共线点
offsetter.PreserveCollinear(true);// 设置是否反转解决方案
offsetter.ReverseSolution(false);

4.7 处理复杂情况

4.7.1 带孔洞的多边形

当对带孔洞的多边形进行偏移时,外边界和孔洞会以相反的方向偏移:

// 创建带孔洞的多边形
Paths64 paths;
// 外边界(逆时针)
paths.push_back(MakePath({0, 0, 100, 0, 100, 100, 0, 100}));
// 孔洞(顺时针)
paths.push_back(MakePath({25, 25, 25, 75, 75, 75, 75, 25}));// 正向偏移:外边界扩张,孔洞收缩
Paths64 inflated = InflatePaths(paths, 10, JoinType::Round, EndType::Polygon);// 负向偏移:外边界收缩,孔洞扩张
Paths64 deflated = InflatePaths(paths, -10, JoinType::Round, EndType::Polygon);

4.7.2 自交处理

当偏移距离较大时,可能会产生自交。Clipper2会自动检测并处理这些情况:

// 创建一个凹多边形
Paths64 paths;
paths.push_back(MakePath({0, 0, 100, 0, 100, 50, 50, 50, 50, 100, 0, 100}));// 大距离负向偏移可能导致多边形消失或分裂
Paths64 result = InflatePaths(paths, -20, JoinType::Round, EndType::Polygon);
// result 可能为空或包含多个分离的多边形

4.7.3 多边形消失

当负向偏移距离足够大时,多边形可能完全消失:

// 一个小正方形
Paths64 paths;
paths.push_back(MakePath({0, 0, 20, 0, 20, 20, 0, 20}));// 偏移距离大于宽度的一半
Paths64 result = InflatePaths(paths, -15, JoinType::Round, EndType::Polygon);
// result 为空,因为多边形已完全收缩消失

4.7.4 岛屿生成

对于带孔洞的多边形,负向偏移可能导致孔洞扩张并与外边界相遇,产生新的岛屿:

// 创建一个环形(外边界加孔洞)
Paths64 ring;
ring.push_back(MakePath({0, 0, 100, 0, 100, 100, 0, 100}));  // 外边界
ring.push_back(MakePath({25, 25, 25, 75, 75, 75, 75, 25}));  // 孔洞// 负向偏移使孔洞扩张
Paths64 deflated = InflatePaths(ring, -20, JoinType::Round, EndType::Polygon);
// 当偏移距离足够大时,可能产生复杂的结果

4.7.5 使用PolyTree追踪层次

使用PolyTree输出可以追踪偏移后多边形的层次关系:

ClipperOffset offsetter;
offsetter.AddPaths(paths, JoinType::Round, EndType::Polygon);PolyTree64 tree;
offsetter.Execute(-10, tree);// 遍历PolyTree
void ProcessTree(const PolyPath64* node, int depth) {if (!node->Polygon().empty()) {std::cout << std::string(depth * 2, ' ');std::cout << (node->IsHole() ? "孔洞" : "多边形");std::cout << " 顶点数: " << node->Polygon().size() << std::endl;}for (auto child = node->begin(); child != node->end(); ++child) {ProcessTree(*child, depth + 1);}
}for (auto child = tree.begin(); child != tree.end(); ++child) {ProcessTree(*child, 0);
}

4.8 实际应用示例

4.8.1 CNC刀具路径补偿

// 零件轮廓
Paths64 partContour;
partContour.push_back(MakePath({...}));// 刀具半径(例如5mm刀具)
double toolRadius = 5.0 * 1000;  // 假设使用0.001mm作为单位// 外轮廓加工:向外偏移刀具半径
Paths64 outerToolPath = InflatePaths(partContour, toolRadius, JoinType::Round, EndType::Polygon);// 内轮廓(口袋)加工:向内偏移刀具半径
Paths64 innerToolPath = InflatePaths(partContour, -toolRadius,JoinType::Round, EndType::Polygon);

4.8.2 3D打印轮廓生成

// 切片轮廓
Paths64 sliceContour;
sliceContour.push_back(MakePath({...}));// 挤出线宽(例如0.4mm)
double lineWidth = 0.4 * 1000;  // 使用0.001mm作为单位// 生成多层偏移轮廓
std::vector<Paths64> perimeterLayers;
for (int i = 0; i < 3; i++) {double offset = -lineWidth * (0.5 + i);  // 第一层偏移半个线宽Paths64 perimeter = InflatePaths(sliceContour, offset,JoinType::Miter, EndType::Polygon);if (!perimeter.empty()) {perimeterLayers.push_back(perimeter);}
}

4.8.3 地图缓冲区分析

// 道路中心线
Paths64 roadCenterlines;
roadCenterlines.push_back(MakePath({...}));// 创建道路缓冲区(道路宽度的一半)
double halfRoadWidth = 7.5 * 1000;  // 15米宽道路
Paths64 roadBuffer = InflatePaths(roadCenterlines, halfRoadWidth,JoinType::Round, EndType::Round);// 创建噪音影响区域(道路两侧50米)
double noiseZone = 50.0 * 1000;
Paths64 noiseBuffer = InflatePaths(roadCenterlines, noiseZone,JoinType::Round, EndType::Round);

4.8.4 安全边界生成

// 建筑物轮廓
Paths64 buildings;
for (const auto& building : buildingList) {buildings.push_back(building.getContour());
}// 创建安全间距(5米)
double safetyDistance = 5.0 * 1000;
Paths64 safetyZones = InflatePaths(buildings, safetyDistance,JoinType::Round, EndType::Polygon);// 合并重叠的安全区域
Paths64 mergedSafety = Union(safetyZones, FillRule::NonZero);

4.8.5 字体描边效果

// 文字轮廓(已转换为多边形)
Paths64 textContour;
textContour.push_back(MakePath({...}));  // 字符轮廓// 创建描边效果
double strokeWidth = 2.0 * 1000;  // 2mm描边// 外描边
Paths64 outerStroke = InflatePaths(textContour, strokeWidth,JoinType::Round, EndType::Polygon);
// 描边区域 = 外描边 - 原始轮廓
Paths64 strokeOnly = Difference(outerStroke, textContour, FillRule::NonZero);// 或者创建内描边
Paths64 innerStroke = InflatePaths(textContour, -strokeWidth,JoinType::Round, EndType::Polygon);
Paths64 innerStrokeOnly = Difference(textContour, innerStroke, FillRule::NonZero);

4.8.6 碰撞边界扩展

// 游戏中的角色边界
Paths64 characterBounds;
characterBounds.push_back(MakePath({...}));// 扩展碰撞检测范围(预警区域)
double warningZone = 10.0;  // 10像素
Paths64 collisionWarning = InflatePaths(characterBounds, warningZone,JoinType::Round, EndType::Polygon);// 检查是否有物体进入预警区域
Paths64 obstacles = GetObstacles();
Paths64 potentialCollisions = Intersect(collisionWarning, obstacles, FillRule::NonZero);
if (!potentialCollisions.empty()) {// 有潜在碰撞风险
}

4.9 性能优化

4.9.1 控制圆弧精度

圆弧精度是影响性能的主要因素之一:

// 低精度(快速)
Paths64 fast = InflatePaths(paths, 10, JoinType::Round, EndType::Polygon, 2.0, 2.0);// 高精度(慢速)
Paths64 precise = InflatePaths(paths, 10, JoinType::Round, EndType::Polygon, 2.0, 0.1);

选择合适的精度

// 根据偏移距离自动计算合适的弧度容差
double arcTolerance = delta / 50.0;  // 经验值
if (arcTolerance < 0.1) arcTolerance = 0.1;
if (arcTolerance > 1.0) arcTolerance = 1.0;Paths64 result = InflatePaths(paths, delta, JoinType::Round, EndType::Polygon, 2.0, arcTolerance);

4.9.2 使用Miter连接

当不需要圆滑的拐角时,使用Miter连接可以显著提高性能:

// Round连接需要生成多个圆弧顶点
Paths64 roundResult = InflatePaths(paths, 10, JoinType::Round, EndType::Polygon);
// 顶点数量可能增加很多// Miter连接保持相同的顶点数量
Paths64 miterResult = InflatePaths(paths, 10, JoinType::Miter, EndType::Polygon);
// 顶点数量与原始相同

4.9.3 预处理路径

在偏移之前简化路径可以提高性能:

// 简化路径,移除共线点和接近的点
Paths64 simplified = SimplifyPaths(paths, 0.5);// 然后进行偏移
Paths64 result = InflatePaths(simplified, 10, JoinType::Round, EndType::Polygon);

4.9.4 批量处理

复用ClipperOffset对象:

ClipperOffset offsetter;
offsetter.ArcTolerance(0.25);std::vector<Paths64> results(inputs.size());for (size_t i = 0; i < inputs.size(); i++) {offsetter.Clear();offsetter.AddPaths(inputs[i], JoinType::Round, EndType::Polygon);offsetter.Execute(10, results[i]);
}

4.10 常见问题与解决方案

4.10.1 偏移结果为空

问题:负向偏移后结果为空。

解决方案

// 检查偏移距离是否过大
double minDistance = GetMinimumOffset(paths);  // 计算最大可能的内偏移距离
if (std::abs(delta) > minDistance) {// 警告用户偏移距离过大
}

4.10.2 意外的自交

问题:偏移后出现意外的自交或孔洞。

解决方案

// 使用Union清理结果
Paths64 result = InflatePaths(paths, delta, JoinType::Round, EndType::Polygon);
Paths64 cleaned = Union(result, FillRule::NonZero);

4.10.3 性能问题

问题:偏移操作非常慢。

解决方案

// 1. 降低圆弧精度
double arcTol = delta / 20.0;// 2. 使用Miter连接代替Round
Paths64 result = InflatePaths(paths, delta, JoinType::Miter, EndType::Polygon);// 3. 预先简化路径
Paths64 simplified = SimplifyPaths(paths, 1.0);
Paths64 result = InflatePaths(simplified, delta, JoinType::Round, EndType::Polygon);

4.10.4 圆弧质量问题

问题:圆弧看起来不够圆滑。

解决方案

// 降低弧度容差
Paths64 result = InflatePaths(paths, delta, JoinType::Round, EndType::Polygon, 2.0, 0.1);
// 或者使用自动计算
Paths64 result = InflatePaths(paths, delta, JoinType::Round, EndType::Polygon, 2.0, 0.0);

4.11 本章小结

本章我们深入学习了Clipper2的多边形偏移功能:

  1. 基本概念:偏移、膨胀、收缩的含义及方向约定
  2. 连接类型:Round、Miter、Square、Bevel及其特点
  3. 端点类型:Polygon、Joined、Butt、Square、Round及其应用场景
  4. ClipperOffset类:高级控制选项和多次偏移
  5. 复杂情况处理:孔洞、自交、消失、岛屿
  6. 实际应用:CNC加工、3D打印、地图缓冲区、碰撞检测
  7. 性能优化:弧度精度、连接类型选择、路径预处理

在下一章中,我们将学习Clipper2的矩形裁剪和闵可夫斯基运算功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/980692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第3章_布尔运算操作

第三章 布尔运算操作(C#版) 3.1 引言 布尔运算是Clipper2最核心的功能之一,它允许我们对多边形进行交集、并集、差集和异或等操作。这些操作在计算机图形学、CAD设计、GIS分析等领域有着广泛的应用。本章将深入介绍…

第1章_Clipper2概述与安装

第一章 Clipper2概述与安装(C#版) 1.1 引言 在计算机图形学和地理信息系统(GIS)领域,多边形的布尔运算和偏移操作是极其重要的基础功能。无论是CAD软件、游戏开发、地图制作还是激光切割机的路径规划,都需要对多…

about

关于我 大家好,我是 znlgis,一名专注于 GIS(地理信息系统)开发的技术爱好者。 我做什么📺 在 B 站直播分享 GIS 开发技术 📝 撰写技术文档和教程 💻 开发开源 GIS 工具联系方式QQ群: 289280914 B站: znlgis的…

2025年质量好的mpp电力管TOP品牌厂家排行榜

2025年质量好的MPP电力管TOP品牌厂家排行榜行业背景与市场趋势随着我国电力基础设施建设的持续投入和城市电网改造的深入推进,MPP电力管作为电力电缆保护的重要材料,市场需求呈现稳定增长态势。MPP(改性聚丙烯)电力…

2025年热门的开口圆轮水泥垫块厂家最新权威实力榜

2025年热门的开口圆轮水泥垫块厂家权威实力榜行业背景与市场趋势随着中国基础设施建设的持续投入和城市化进程的加速推进,水泥制品行业迎来了新的发展机遇。作为建筑基础工程中的重要组成部分,开口圆轮水泥垫块因其优…

2025年河南十大叛逆孩子学校推荐:靠谱的问题少年教育学校有

本榜单依托河南本地青少年教育市场调研与真实家长口碑,聚焦10-18岁偏差行为青少年教育需求,筛选出十家专业机构,为陷入教育困境的家庭提供客观选型依据,助力孩子回归成长正轨。 TOP1 推荐:护航专门教育 推荐指数…

2025哈尔滨短期西点培训排名:甜品西点培训学校有哪些

近年来,哈尔滨及周边城市(齐齐哈尔、大庆、绥化、牡丹江)的西式烘焙市场快速升温,连锁饼房、网红甜品店数量年增30%,催生了对专业西点技能的旺盛需求。但市场上培训学校鱼龙混杂:部分机构低学费引流却暗藏二次收…

2025年热门的隐藏三折轨最新TOP厂家排名

2025年热门的隐藏三折轨TOP厂家排名行业背景与市场趋势随着家居智能化与空间优化需求的不断提升,隐藏三折轨作为现代家居五金的核心部件,正迎来前所未有的市场机遇。2024年全球家居五金市场规模已突破1200亿美元,其…

WGLOG日志审计系统如何采集网络设备的日志

WGLOG是一款轻量友好的日志管理平台,可以采集各种类型的日志文件,我们只需要在主机安装好采集端agent即可 那么WGLOG如何采集网络设备的日志呢,比如交换机这样的设备,因为它们可不能安装agent程序 WGLOG也可以支持…

2025年精品甜酒酿/醪糟甜酒酿厂家选购指南与推荐

2025年精品甜酒酿/醪糟甜酒酿厂家选购指南与推荐行业背景与市场趋势甜酒酿,又称醪糟,是中国传统发酵食品的代表之一,具有悠久的历史和深厚的文化底蕴。近年来,随着消费者对健康食品需求的增长和传统饮食文化的复兴…

2025年优秀的酚醛胶厂家最新TOP排行榜

2025年优秀的酚醛胶厂家TOP排行榜 行业背景与市场趋势 酚醛胶作为一种高性能粘合剂,广泛应用于木材加工、建筑、汽车制造、电子封装等领域。随着环保要求的提高和工业技术的进步,市场对酚醛胶的性能、环保性及稳定…

2025年热门的大口径缠绕管设备/pph缠绕管设备热门厂家推荐榜单

2025年热门的大口径缠绕管设备/PPH缠绕管设备热门厂家推荐榜单行业背景与市场趋势随着城市化进程加速和环保要求日益严格,大口径塑料缠绕管在市政排水、工业排污、农业灌溉等领域的应用越来越广泛。2025年,预计全球塑…

AI智能媒体助理,一款为自媒体人提供的神器测评报告

说到AI大家都懂,说到自媒体大家也懂,那么把AI和自媒体结合到一起会是怎么样的? 我觉得应该是更便利,更方便,原来我们在写自媒体文章的时候也会用到AI来辅助一下,帮助我们润色、修饰、给初稿、给大纲,最后发现该…

测评系统开发公司TOP5权威推荐:助力企业高效获客与管理升级

数字化时代,测评系统已成为企业获客引流、用户分层的核心工具,但市场上服务商质量参差不齐,企业常面临功能不符需求、数据安全无保障、落地效果差等痛点。据2024年行业调研,超35%企业因选错测评系统定制服务商导致…

2025防伪公司TOP5权威推荐:深度测评防伪产品供应商

在假冒伪劣商品年造成超2000亿元市场损失的背景下,企业对专业防伪溯源服务的需求激增。2024年数据显示,防伪技术市场规模突破350亿元,年增速达32%,但41%的企业反馈现有方案存在易仿制数据不可信功能单一三大痛点—…

11.11总结

1.今天完成了修改页面信息的部分 2.明天完成查看信息

2025年评价高的燃气壁挂炉厂家推荐及采购参考

2025年评价高的燃气壁挂炉厂家推荐及采购参考行业背景与市场趋势随着我国"双碳"目标的持续推进和居民生活水平的不断提高,燃气壁挂炉作为高效、环保的供暖设备,近年来市场需求持续增长。据中国家用电器协会…

03-几何建模基础

第三章:几何建模基础 3.1 OpenCascade内核介绍 3.1.1 什么是OpenCascade OpenCascade Technology(简称OCCT或OCC)是一个开源的3D CAD/CAM/CAE内核,由法国Matra Datavision公司最初开发,后来开源并由OpenCascade公…

01-概述与入门

第一章:Chili3D概述与入门 1.1 什么是Chili3D Chili3D是一款基于Web浏览器的开源3D CAD(计算机辅助设计)应用程序,专为在线模型设计和编辑而构建。该项目由开发者"仙阁"创建,采用TypeScript编写,通过将…

08-性能优化与高级配置

第8章 性能优化与高级配置 8.1 性能监控与分析 8.1.1 性能监控的重要性 在生产环境中,性能监控是确保GeoServer稳定运行的关键。通过监控可以:及时发现性能瓶颈 预测容量需求 优化资源配置 诊断问题根源8.1.2 GeoSer…