Revit中实现GH Scan凸包算法

该博客详细介绍了计算几何中求解二维平面上点集的凸包问题的算法,提供了一个C#实现的ConvexHull函数。首先检查点的数量,如果少于3个直接返回。接着找到最低点并按角度排序,使用单调链方法构建凸包。此外,还定义了辅助函数用于判断三点是否构成左转。整个过程高效地构建了凸包并返回结果。
摘要由CSDN通过智能技术生成
             
public static IEnumerable<XYZ> ConvexHull(IEnumerable<XYZ> points)
        {
            if (points.Count() < 3)
            {
                return points;
            }
            var inputPoints = new List<XYZ>(points);
            var llt = FindLowestThenLeftPoint(inputPoints);
            var res = new List<XYZ>();

            inputPoints = inputPoints.OrderBy(x => (x - llt).Normalize().AngleTo(XYZ.BasisX)).ToList();

            var stack = inputPoints.ToArray();

            var lowPtr = 1;
            var upPtr = 2;

            while (upPtr != stack.Length)
            {
                var p1 = stack[lowPtr];
                var p2 = stack[lowPtr - 1];

                var candidate = stack[upPtr];

                var left = ToLeft(p2, p1, candidate);
                if (left > 0)
                {
                    stack[++lowPtr] = stack[upPtr++];
                }
                else
                {
                    lowPtr--;
                }
            }
            return stack.ToList().Take(lowPtr + 1);
        }

      
private static XYZ FindLowestThenLeftPoint(IEnumerable<XYZ> points)
        {
            var res = points.FirstOrDefault();

            var enumerator = points.GetEnumerator();
            while (enumerator.MoveNext())
            {
                var temp = enumerator.Current as XYZ;
                if (temp.Y < res.Y)
                {
                    res = temp;
                }
                else if (temp.Y == res.Y)
                {
                    res = temp.X < res.X ? temp : res;
                }
            }
            return res;
        }



public static int ToLeft(XYZ p1, XYZ p2, XYZ p3, double eps = 1e-4)
        {
            var area = p1.X * p2.Y - p1.Y * p2.X
                    + p2.X * p3.Y - p2.Y * p3.X
                    + p3.X * p1.Y - p3.Y * p1.X;
            if (Math.Abs(area) < eps)
            {
                return 0;
            }

            return area > 0 ? 1 : -1;
        }

效果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Revit 是一种建筑信息模型(BIM)软件,不太了解半色调的融合算法Revit 的应用场景,不过我可以给您提供一个 C++ 的半色调融合算法示例。 半色调融合算法是一种将两幅图像融合在一起的方法,它可以使得融合后的图像既能够保留原始图像的细节信息,又能够获得更好的视觉效果。该算法的基本思路是将两幅图像的灰度值进行平均,然后根据平均灰度值将两幅图像进行分割,并对分割后的图像进行半色调处理。 以下是一个简单的 C++ 实现示例: ```c++ #include <opencv2/opencv.hpp> using namespace cv; void halfToning(Mat& src, Mat& dst) { int threshold = 128; int width = src.cols; int height = src.rows; int x, y; uchar grayValue; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { grayValue = src.at<uchar>(y, x); if (grayValue > threshold) { dst.at<uchar>(y * 2, x * 2) = 255; dst.at<uchar>(y * 2, x * 2 + 1) = 255; dst.at<uchar>(y * 2 + 1, x * 2) = 255; dst.at<uchar>(y * 2 + 1, x * 2 + 1) = 255; } else { dst.at<uchar>(y * 2, x * 2) = 0; dst.at<uchar>(y * 2, x * 2 + 1) = 0; dst.at<uchar>(y * 2 + 1, x * 2) = 0; dst.at<uchar>(y * 2 + 1, x * 2 + 1) = 0; } } } } int main() { Mat src = imread("input.jpg", IMREAD_GRAYSCALE); Mat dst(src.rows * 2, src.cols * 2, CV_8UC1, Scalar(0)); halfToning(src, dst); imshow("Half Toning", dst); waitKey(0); return 0; } ``` 该示例,我们使用 OpenCV 库来读取图像并进行半色调处理。`halfToning` 函数,我们将输入的灰度图像 `src` 进行半色调处理,并将结果保存在输出图像 `dst` 。在半色调处理,我们使用一个阈值 `threshold` 来将灰度值进行分割,并根据分割后的结果进行半色调处理。最终,我们展示了处理后的图像并等待用户按下任意键退出程序。 需要注意的是,该示例只是一个简单的示例,实际应用可能需要更加复杂的算法或者处理逻辑。同时,该示例也没有涉及到 Revit 软件的相关内容,如果您有更加详细的应用场景或者要求,可以提供更加详细的信息,以便我能够更好地回答您的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值