admin 发表于 2024-3-6 11:45:00

几何类(中心点,偏移,删除重复点等)

AcGePoint2d FymGeometry::GetMiddlePt(const AcGePoint2d& startPt, const AcGePoint2d& endPt)
{
        double x = (startPt.x + endPt.x) * 0.5;
        double y = (startPt.y + endPt.y) * 0.5;
        return AcGePoint2d(x, y);
}

AcGePoint3d FymGeometry::GetMiddlePt(const AcGePoint3d& startPt, const AcGePoint3d& endPt)
{
        double x = (startPt.x + endPt.x) * 0.5;
        double y = (startPt.y + endPt.y) * 0.5;
        double z = (startPt.z + endPt.z) * 0.5;
        return AcGePoint3d(x, y, z);
}

AcGePoint3d FymGeometry::Polar(const AcGePoint3d& basePoint, double angle, double length)
{
        double x = basePoint.x + length * cos(angle);
        double y = basePoint.y + length * sin(angle);
        return AcGePoint3d(x,y,basePoint.z);
}

AcGePoint3d FymGeometry::RelativePoint(const AcGePoint3d& Pt, double x, double y)
{
        AcGePoint3d ptReturn(Pt.x + x, Pt.y + y, Pt.z);
        return ptReturn;
}
//比较两个AcGePoint2d类型的点(即二维坐标点)是否相等,tol为公差
bool CGePointUtil::IsEqual(const AcGePoint2d & firstPoint, const AcGePoint2d & secondPoint, double tol)
{
        return (fabs(firstPoint.x - secondPoint.x) < tol&&
                fabs(firstPoint.y - secondPoint.y) < tol);
}
//比较两个AcGePoint3d类型的点(即三维坐标点)是否相等。
bool CGePointUtil::IsEqual(const AcGePoint3d & firstPoint, const AcGePoint3d & secondPoint, double tol)
{
        return (fabs(firstPoint.x - secondPoint.x) < tol&&
                fabs(firstPoint.y - secondPoint.y) < tol&&
                fabs(firstPoint.z - firstPoint.z) < tol);
}
//在给定的三维点数组points中查找一个特定的三维点point。如果找到了这个点,函数会返回这个点的索引值;如果没有找到,函数会返回-1。
int CGePointUtil::FindPoint(const AcGePoint3dArray & points, const AcGePoint3d & point, double tol)
{
        for (int i = 0; i < points.length(); i++)
        {

                if (IsEqual(points, point, tol)) {
                        return i;
                }

        }
        return -1;
}
//在给定的二维点数组points中查找一个特定的二维点point。如果找到了这个点,函数会返回这个点的索引值;如果没有找到,函数会返回-1。
int CGePointUtil::FindPoint(const AcGePoint2dArray & points, const AcGePoint2d & point, double tol)
{
        for (int i = 0; i < points.length(); i++)
        {

                if (IsEqual(points, point, tol)) {
                        return i;
                }

        }
        return -1;
}
//过滤掉那些在给定的公差范围内的重复点。
void CGePointUtil::FilterEqualPoints(AcGePoint3dArray & points, double tol)
{
        for (int i = points.length() - 1; i > 0; i--) {
//遍历数组中的每个点,从最后一个开始
                for (int j = 0; j < i; j++) {

                        if (MathUtil::IsEqual(points.x, points.x, tol) &&
                                MathUtil::IsEqual(points.y, points.y, tol)) {
                                //检查当前点(i)和另一个点(j)的x和y坐标是否在给定的公差范围内是否相等。
                                points.removeAt(i); //移除当前点(i),删除重复的点
                                break;
                        }

                }

        }

}
//遍历一个包含三维点的数组,并删除所有与给定的二维点距离在给定的公差范围内的三维点
void CGePointUtil::FilterEqualPoints(AcGePoint3dArray & points, const AcGePoint2d & pt, double tol)
{

        AcGePoint3dArray tempPoints; //存储过滤后的非重复三维点

        for (int i = 0; i < points.length(); i++)
        {
                //距离大于给定的公差tol,那么它将这个三维点添加到临时数组tempPoints中
                if (CConvertUtil::ToPoint2d(points).distanceTo(pt)>tol) {

                        tempPoints.append(points);
                }
        }

        points = tempPoints;
        //这样输入数组points现在就只包含那些距离给定的二维点pt大于给定公差的非重复三维点
}
页: [1]
查看完整版本: 几何类(中心点,偏移,删除重复点等)