027集—CAD中批量删除多段线重复点、距离过近点——vba代码实现

cad图中多段线存在重复点、或距离过近点,可通过vba插件一键删除。

(精度可人工设定,例如精度设置0.001:小于0.001 的点视为重复点,删除此点。)

如下图:

 如下图:

大量重复点和距离过近点:

 

运行dvb插件(使用方法:命令行输入vbaman,加载此dvb插件,输入vbarun运行,选择多段线即可。)

另附部分源代码:


Sub AddIntersectionPointsToMultiplePolylines()
     'yngqq443440204@2024年8月25日10:41:30
    'On Error Resume Next
    Dim polyline1 As AcadLWPolyline ' 用于存储第一批中的单个多段线
    Dim selSet1 As AcadSelectionSet ' 第一批多段线的选择集
    Dim selSet2 As AcadSelectionSet ' 第二批多段线的选择集
    Dim i As Integer
    On Error Resume Next
    ThisDrawing.SelectionSets.Item("selSet1").Delete
    On Error GoTo 0
    Set selSet1 = ThisDrawing.SelectionSets.Add("selSet1")
    ThisDrawing.Utility.Prompt "请选择第一批需要加点的线,并按空格键结束。"
    selSet1.SelectOnScreen
    If selSet1.Count = 0 Then GoTo erro
    For i = 0 To selSet1.Count - 1
        Set polyline1 = selSet1.Item(i)
        'Call SimplifyPolyline(polyline1)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''省略部分源码,qq完整代码443440204
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Next i
    ThisDrawing.Utility.Prompt "交点已加入到第一批多段线中。"
erro:
    MsgBox "OK,CAD二次开发", , "443440204"
End Sub

在C++,你可以使用优先队列(`std::priority_queue`)来解决这个问题。这是一个最小堆数据结构,每次添加元素都会保证顶部元素是最小的。我们可以维护两个堆,一个存放距离最远的,另一个存放距离当前已知最近点距离次远的。 首先,假设每个是一个结构体,包含一个整数ID和一对坐标。下面是基本的代码实现: ```cpp #include <iostream> #include <queue> #include <vector> struct Point { int id; int x, y; // 假设二维坐标 }; int distance(const Point& a, const Point& b) { return std::sqrt(std::pow(a.x - b.x, 2) + std::pow(a.y - b.y, 2)); } void findNearestPoints(int n, std::vector<Point>& points) { if (n < 2) { std::cerr << "Error: At least two points are required.\n"; return; } std::priority_queue<Point, std::vector<Point>, std::greater<Point>> minHeap; // 最近点 std::priority_queue<Point> secondMinHeap; // 次近点 // 初始化最小堆 for (const auto& point : points) { minHeap.push(point); } Point nearest = minHeap.top(); // 当前最近点 minHeap.pop(); while (!minHeap.empty()) { // 遍历剩余 Point next = minHeap.top(); minHeap.pop(); // 更新次近点 if (distance(nearest, next) > distance(nearest, secondMinHeap.top())) { secondMinHeap.push(next); } // 如果新更接近 if (distance(secondMinHeap.top(), nearest) > distance(next, nearest)) { nearest = secondMinHeap.top(); secondMinHeap.pop(); minHeap.push(next); // 把更新后的次近点放回最小堆 } } std::cout << "The closest pair of points is (" << nearest.id << ", (" << nearest.x << ", " << nearest.y << ")) and (" << secondMinHeap.top().id << ", (" << secondMinHeap.top().x << ", " << secondMinHeap.top().y << "))\n"; } int main() { int n; std::cout << "Enter the number of points: "; std::cin >> n; std::vector<Point> points(n); for (int i = 0; i < n; ++i) { std::cout << "Enter coordinates for point " << i+1 << ": "; std::cin >> points[i].id >> points[i].x >> points[i].y; } findNearestPoints(n, points); return 0; } ``` 这段代码首先获取用户输入的的数量和坐标,然后计算并找到最近的两个。注意,如果需要处理负数或非欧几里得距离,`distance`函数的实现可能会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值