Open CASCADE学习|按圆离散旋转体

news2024/11/17 5:40:59

旋转体是一个非常重要的概念,它涉及到三维空间中由二维曲线绕某一轴线旋转形成的立体形状。这种旋转体的形成过程,实际上是一个连续变化的动态过程,但在数学和几何学中,我们往往通过静态的方式来描述和研究它。

旋转体的基本特性包括其形状、大小、表面积和体积等。这些特性不仅取决于原始二维曲线的形状和大小,还受到旋转轴线位置和方向的影响。例如,一个圆绕其直径旋转会形成球体,而绕其切线旋转则会形成圆柱体。

将旋转体离散为一系列的圆(通常称为“截圆”或“横截面”)是一种常用的近似方法,用于在数值计算、计算机图形学以及物理模拟中描述和分析旋转体的性质。这种方法的基本思想是将连续的旋转体划分为一系列离散的、平行的截面,每个截面都是一个圆。

需要注意的是,离散化的精度取决于截面间距的选择。较小的间距可以提高精度,但也会增加计算复杂性和存储需求。因此,在实际应用中,需要根据具体需求和资源限制来选择合适的离散化方案。

#include <Geom_CylindricalSurface.hxx>
#include <gp_Ax3.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <GCE2d_MakeSegment.hxx>

#include <GeomAPI_PointsToBSpline.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <GC_MakeCircle.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepOffsetAPI_MakePipe.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <BRepAlgoAPI_Fuse.hxx>

#include <gp_GTrsf.hxx>
#include <BRepBuilderAPI_Transform.hxx>

#include"Viewer.h"

#include <BRepPrimAPI_MakeCylinder.hxx>
#include <BRepBuilderAPI_MakePolygon.hxx>
#include <BRep_Tool.hxx>
#include <TopoDS.hxx>
#include <BRepAlgoAPI_Cut.hxx>
#include <BRepAlgoAPI_Common.hxx>
#include <BRepAlgoAPI_Section.hxx>
#include <BRepPrimAPI_MakePrism.hxx>
#include <GC_MakeSegment.hxx>
#include <IntAna2d_AnaIntersection.hxx>
#include <ShapeUpgrade_UnifySameDomain.hxx>
#include <BRepTools_WireExplorer.hxx>
#include <GeomFill_TrihedronLaw.hxx>
#include <GeomFill_Frenet.hxx>
#include <GeomFill_CurveAndTrihedron.hxx>
#include <BRepFill_Edge3DLaw.hxx>
#include <BRepFill_SectionPlacement.hxx>
#include <ShapeUpgrade_RemoveLocations.hxx>
#include <BRepPrimAPI_MakeSphere.hxx>
#include <BRepPrimAPI_MakeRevol.hxx>
#include <BRepAdaptor_CompCurve.hxx>
#include <TopExp_Explorer.hxx>
#include <NCollection_Sequence.hxx>
TopoDS_Edge axis;
NCollection_Sequence<TopoDS_Edge> SplitShapebyaxis(TopoDS_Shape input, TopoDS_Edge cutaxis)
{
    Standard_Real startParam(0.), endParam(0.);
    Handle(Geom_Curve) c = BRep_Tool::Curve(cutaxis, startParam, endParam);//得到底层曲线
    Standard_Real step = (endParam - startParam) / 100;
    TColgp_HArray1OfPnt Points(1, 101);
    for (int i = 0; i < 101; i++) 
    {
        Points[i + 1] = c->Value(startParam + i * step);
    }
    gp_Vec dir(Points[1], Points[101]);
    NCollection_Sequence<TopoDS_Edge> edgeall;
    for (int i = 2; i < 100; i++)
    {
        gp_Pln cutplane(Points[i], dir);
        TopoDS_Face cf = BRepBuilderAPI_MakeFace(cutplane);
        // 进行布尔运算
        BRepAlgoAPI_Section section(input, cf, Standard_False);
        section.ComputePCurveOn1(Standard_True);
        section.Approximation(Standard_False);
        section.Build();
        TopExp_Explorer anExp(section.Shape(), TopAbs_EDGE);
        int j = 0;
        for (; anExp.More(); anExp.Next())
        {
            TopoDS_Edge anEdge = TopoDS::Edge(anExp.Current());
            edgeall.Append(anEdge);
            j++;
        }
        //std::cout << "j=" << j << std::endl;
    }
    return edgeall;
}
TopoDS_Edge createHelix(const Standard_Real HelixRadius, const Standard_Real HelixAngle, const Standard_Real HelixLength)
{
    Standard_Real u0 = 0.0;
    Standard_Real u1 = 2 * M_PI;
    Standard_Real v0 = 0.0;
    Standard_Real v1 = HelixLength;
    double uInter = (u1 - u0) / 1000;
    double vInter = (v1 - v0) / 1000;
    TColgp_HArray1OfPnt Points(1, 1001);
    Handle(Geom_CylindricalSurface) aCylinder = new Geom_CylindricalSurface(gp::XOY(), HelixRadius);
    double u;
    double v;
    //生成点
    for (int i = 0; i < 1001; i++) {
        u = i * vInter * tan(HelixAngle) / HelixRadius;
        v = i * vInter;
        Points[i + 1] = aCylinder->Value(u, v);
    }
    GeomAPI_PointsToBSpline Approx(Points);
    Handle_Geom_BSplineCurve K = Approx.Curve();
    TopoDS_Edge aHelixEdge = BRepBuilderAPI_MakeEdge(K);
    return aHelixEdge;
}

TopoDS_Shape createGrindingwheel2()
{
    Standard_Real Line1_angle = 280 * M_PI / 180;
    Standard_Real Line1_length = 0.5031;
    Standard_Real Line2_angle = 236 * M_PI / 180;
    Standard_Real Line2_length = 0.5925;
    Standard_Real Arc1_r = 0.112;
    Standard_Real Arc1_angle = (180 + 10 + 50) * M_PI / 180;
    gp_Pnt Line1_p1(-0.6822 / 2, 0, 0);
    gp_Pnt Line2_p1(0.6822 / 2, 0, 0);
    gp_Lin Line1(Line1_p1, gp_Dir(cos(Line1_angle), sin(Line1_angle), 0.));
    gp_Lin Line2(Line2_p1, gp_Dir(cos(Line2_angle), sin(Line2_angle), 0.));
    Handle(Geom_TrimmedCurve) L1 = GC_MakeSegment(Line1, 0., Line1_length);
    TopoDS_Edge L1e = BRepBuilderAPI_MakeEdge(L1);
    Handle(Geom_TrimmedCurve) L2 = GC_MakeSegment(Line2, 0., Line2_length);
    TopoDS_Edge L2e = BRepBuilderAPI_MakeEdge(L2);
    gp_Pnt l1end = L1->EndPoint();
    gp_Pnt l2end = L2->EndPoint();
    gp_Lin Line1v(l1end, gp_Dir(cos(Line1_angle + M_PI_2), sin(Line1_angle + M_PI_2), 0.));
    gp_Lin2d Line2v(gp_Pnt2d(l2end.X(), l2end.Y()), gp_Dir2d(cos(Line2_angle - M_PI_2), sin(Line2_angle - M_PI_2)));
    gp_Lin Line2v3d(l2end, gp_Dir(cos(Line2_angle - M_PI_2), sin(Line2_angle - M_PI_2), 0.));
    Handle(Geom_TrimmedCurve) L1v = GC_MakeSegment(Line1v, 0., Arc1_r);
    gp_Pnt l1vend = L1v->EndPoint();
    gp_Circ c1(gp_Ax2(l1vend, gp_Dir(0, 0, 1)), Arc1_r);
    Handle(Geom_TrimmedCurve) c1c = GC_MakeArcOfCircle(c1, l1end, Arc1_angle, 1);
    gp_Pnt c1end = c1c->EndPoint();
    gp_Lin2d Line3(gp_Pnt2d(c1end.X(), c1end.Y()), gp_Dir2d(l2end.X() - c1end.X(), l2end.Y() - c1end.Y()));
    gp_Lin2d Line3v = Line3.Normal(gp_Pnt2d((l2end.X() + c1end.X()) / 2, (l2end.Y() + c1end.Y()) / 2));
    IntAna2d_AnaIntersection aIntAna;
    aIntAna.Perform(Line2v, Line3v);
    IntAna2d_IntPoint aIntPoint = aIntAna.Point(1);
    gp_Pnt o2(aIntPoint.Value().X(), aIntPoint.Value().Y(), 0.);
    Handle(Geom_TrimmedCurve) L2v = GC_MakeSegment(Line2v3d, l2end, o2);
    Standard_Real r2 = L2v->LastParameter();
    gp_Circ c2(gp_Ax2(o2, gp_Dir(0, 0, 1)), r2);
    Handle(Geom_TrimmedCurve) c2c = GC_MakeArcOfCircle(c2, c1end, l2end, 0);
    gp_Pnt c2low = c2c->Value(M_PI_2);

    TopoDS_Edge c1ce = BRepBuilderAPI_MakeEdge(c1c);
    TopoDS_Edge L1ev = BRepBuilderAPI_MakeEdge(L1v);
    TopoDS_Edge c2ce = BRepBuilderAPI_MakeEdge(c2c);

    gp_Pnt Line1_up(-0.9832 / 2, 5, 0);
    gp_Pnt Line2_up(0.9832 / 2, 5, 0);
    TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(Line1_p1, Line1_up);
    TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(Line1_up, Line2_up);
    TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(Line2_up, Line2_p1);
    TopTools_ListOfShape listEdge;
    listEdge.Append(anEdge1);
    listEdge.Append(anEdge2);
    listEdge.Append(anEdge3);
    listEdge.Append(L1e);
    listEdge.Append(c1ce);
    listEdge.Append(c2ce);
    listEdge.Append(L2e);
    BRepBuilderAPI_MakeWire mw;
    mw.Add(listEdge);
    mw.Build();
    TopoDS_Edge tmpAxis = BRepBuilderAPI_MakeEdge(gp_Pnt(-0.9832 / 2, 5, 0), gp_Pnt(0.9832 / 2, 5, 0));
    TopoDS_Shape gwheel = BRepPrimAPI_MakeRevol(mw, gp_Ax1(gp_Pnt(0, 5, 0), gp_Dir(1, 0, 0)), 2 * M_PI);
    //平移到最低点与原点重合
    gp_Trsf theTransformation1;
    gp_Vec theVectorOfTranslation1(-c2low.X(), -c2low.Y(), 0.);
    theTransformation1.SetTranslation(theVectorOfTranslation1);
    //往上平移芯厚一半的距离
    gp_Trsf theTransformation2;
    gp_Vec theVectorOfTranslation2(0., 0.125 / 2, 0.);
    theTransformation2.SetTranslation(theVectorOfTranslation2);
    //顺时针旋转90°,绕z轴
    gp_Trsf theTransformation3;
    gp_Ax1 axez = gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(0., 0., 1.));
    theTransformation3.SetRotation(axez, -90 * M_PI / 180);
    //顺时针旋转50°,绕x轴
    gp_Trsf theTransformation4;
    gp_Ax1 axex = gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(1., 0., 0.));
    theTransformation4.SetRotation(axex, -50 * M_PI / 180);
    //实施以上变换:对旋转体、对轴线
    BRepBuilderAPI_Transform myBRepTransformation(gwheel, theTransformation4 * theTransformation3 * theTransformation2* theTransformation1);
    TopoDS_Shape TransformedShape = myBRepTransformation.Shape();

    BRepBuilderAPI_Transform myBRepTransformation2(tmpAxis, theTransformation4 * theTransformation3 * theTransformation2 * theTransformation1);
    TopoDS_Shape initAxis = myBRepTransformation2.Shape();
    axis = TopoDS::Edge(initAxis);
    return TransformedShape;
}
TopoDS_Shape getShapeOnPosition(TopoDS_Shape myProfile, Handle(BRepFill_LocationLaw) myLoc, Standard_Real pos, Standard_Real a, Standard_Real b, gp_Trsf myTrsf)
{
    TopoDS_Shape myPos;
    Handle(GeomFill_LocationLaw) law;
    gp_Mat M;
    gp_Vec V;
    gp_Trsf fila;
    Standard_Real first, last;
    myLoc->Law(1)->GetDomain(first, last);
    Standard_Real px = (pos - a) / (b - a);
    myLoc->Law(1)->D0(px, M, V);
    fila.SetValues(M(1, 1), M(1, 2), M(1, 3), V.X(),
        M(2, 1), M(2, 2), M(2, 3), V.Y(),
        M(3, 1), M(3, 2), M(3, 3), V.Z());

    fila.Multiply(myTrsf);
    myPos = myProfile;
    TopLoc_Location LocPos(fila);
    if (!LocPos.IsIdentity()) {
        myPos = BRepBuilderAPI_Transform(myProfile, fila, Standard_True); //copy
    }
    ShapeUpgrade_RemoveLocations RemLoc;
    RemLoc.SetRemoveLevel(TopAbs_COMPOUND);
    RemLoc.Remove(myPos);
    myPos = RemLoc.GetResult();
    return myPos;
}
int main(int argc, char* argv[])
{
    gp_Dir  Z(0.0, 0.0, 1.0);
    gp_Pnt center(0, 0, 0.0);
    gp_Pnt xr(0.5, 0, 0.0);
    gp_Pnt yr(0.0, 1.0, 0.0);
    gp_Pnt zr(0.0, 0.0, 7.0);
    gp_Ax2  wb(center, Z);
    gp_Circ  wbcircle(wb, 0.125 / 2);
    TopoDS_Edge wbe = BRepBuilderAPI_MakeEdge(wbcircle);
    TopoDS_Edge xline = BRepBuilderAPI_MakeEdge(center, xr);
    TopoDS_Edge yline = BRepBuilderAPI_MakeEdge(center, yr);
    TopoDS_Edge zline = BRepBuilderAPI_MakeEdge(center, zr);
    //creat a profile of gringing wheel
    TopoDS_Shape gw = createGrindingwheel2();
    //creat a cylinder surface
    Standard_Real R = 0.306 / 2;
    Handle(Geom_CylindricalSurface) aCylinder = new Geom_CylindricalSurface(gp::XOY(), R);
    TopoDS_Shape cF = BRepBuilderAPI_MakeFace(aCylinder->Cylinder(), 0, 2 * M_PI, 0, 3.);

    TopoDS_Solid cys = BRepPrimAPI_MakeCylinder(gp::XOY(), R, 7);

    TopoDS_Edge aE = createHelix(R, M_PI / 4, 6.);
    TopoDS_Wire spine = BRepBuilderAPI_MakeWire(aE);


    TopoDS_Wire mySpine;
    TopoDS_Shape myProfile;
    TopoDS_Shape myShape;
    gp_Trsf myTrsf;
    Handle(BRepFill_LocationLaw) myLoc;
    Handle(TopTools_HArray2OfShape) mySections;
    Handle(TopTools_HArray2OfShape) myFaces;
    Handle(TopTools_HArray2OfShape) myEdges;
    TopTools_MapOfShape myReversedEdges;
    BRepFill_DataMapOfShapeHArray2OfShape myTapes;
    BRepFill_DataMapOfShapeHArray2OfShape myRails;
    Standard_Integer myCurIndexOfSectionEdge;
    TopoDS_Shape myFirst;
    TopoDS_Shape myLast;
    TopTools_DataMapOfShapeListOfShape myGenMap;
    Standard_Integer myDegmax;
    Standard_Integer mySegmax;
    GeomAbs_Shape myContinuity;
    GeomFill_Trihedron myMode;
    Standard_Boolean myForceApproxC1;
    Standard_Real myErrorOnSurf;

    mySections.Nullify();
    myFaces.Nullify();
    myEdges.Nullify();

    mySpine = spine;
    myProfile = gw;
    //myProfile = BRepPrimAPI_MakeSphere(gp_Pnt(0.306/2, 0., 0.),0.306/2);

    TopoDS_Shape TheProf;

    Handle(GeomFill_TrihedronLaw) TLaw;
    TLaw = new GeomFill_Frenet();
    Handle(GeomFill_CurveAndTrihedron) Loc = new (GeomFill_CurveAndTrihedron) (TLaw);
    myLoc = new (BRepFill_Edge3DLaw) (mySpine, Loc);
    if (myLoc->NbLaw() == 0) {
        return 0; // Degenerated case
    }
    myLoc->TransformInG0Law(); // Set into continuity

    BRepFill_SectionPlacement Place(myLoc, gw);
    myTrsf = Place.Transformation();

    TopLoc_Location Loc2(myTrsf), Loc1;
    Loc1 = gw.Location();
    TopoDS_Shape aux;
    TheProf = myProfile;
    TheProf.Location(Loc2.Multiplied(Loc1));

    // Construct First && Last Shape
    Handle(GeomFill_LocationLaw) law;

    gp_Mat M;
    gp_Vec V;
    gp_Trsf fila;
    Standard_Real first, last;
    myLoc->Law(1)->GetDomain(first, last);
    myLoc->Law(1)->D0(first, M, V);
    fila.SetValues(M(1, 1), M(1, 2), M(1, 3), V.X(),
        M(2, 1), M(2, 2), M(2, 3), V.Y(),
        M(3, 1), M(3, 2), M(3, 3), V.Z());

    fila.Multiply(myTrsf);
    TopLoc_Location LocFirst(fila);
    myFirst = myProfile;
    if (!LocFirst.IsIdentity()) {
        //myFirst.Location( LocFirst.Multiplied(myProfile.Location()) );
        myFirst = BRepBuilderAPI_Transform(myProfile, fila, Standard_True); //copy
    }

    ShapeUpgrade_RemoveLocations RemLoc;
    RemLoc.SetRemoveLevel(TopAbs_COMPOUND);
    RemLoc.Remove(myFirst);
    myFirst = RemLoc.GetResult();

    myLoc->Law(myLoc->NbLaw())->GetDomain(first, last);
    myLoc->Law(myLoc->NbLaw())->D0(last, M, V);
    //    try { // Not good, but there are no other means to test SetValues
    fila.SetValues(M(1, 1), M(1, 2), M(1, 3), V.X(),
        M(2, 1), M(2, 2), M(2, 3), V.Y(),
        M(3, 1), M(3, 2), M(3, 3), V.Z());
    fila.Multiply(myTrsf);
    TopLoc_Location LocLast(fila);
    if (!myLoc->IsClosed() || LocFirst != LocLast) {
        myLast = myProfile;
        if (!LocLast.IsIdentity()) {
            //myLast.Location(LocLast.Multiplied(myProfile.Location()) );
            myLast = BRepBuilderAPI_Transform(myProfile, fila, Standard_True); //copy
        }
    }
    else {
        myLast = myFirst;
    }
    RemLoc.Remove(myLast);
    myLast = RemLoc.GetResult();
    NCollection_Sequence<TopoDS_Edge> es=SplitShapebyaxis(gw, axis);
    

    Viewer vout(50, 50, 500, 500);
    vout << wbe;
    vout << xline;
    vout << yline;
    vout << zline;
    vout << gw;
    vout << axis;
    // 遍历点集合
    for (int i = 1; i <= es.Length(); ++i) {
        vout << es.Value(i);
    }
    vout.StartMessageLoop();
    return 0;
}

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

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

相关文章

中电金信智能视觉分析系统,以AI技术助力企业升级

基于行业需求与业务痛点&#xff0c;中电金信推出了智能视觉分析系统。该系统是集视频接入、视频识别与分析、AI算法管理、异常报警等为一体&#xff0c;可提供视频安全监管标准的场景应用方案以及二次开发能力的通用智能视觉分析系统。该系统拥有强大的监控摄像头设备接入能力…

EFI引导模式下配置Windows和Linux双系统共存

这几天在VirtualBox虚机里玩Modular MAX下的LLama3大模型&#xff0c;实在受不了这执行速度&#xff0c;于是下决心把Ubuntu系统安装在硬盘上跟Windows11做双系统共存。之前在传统BIOS引导模式下做过不少次双系统引导&#xff0c;EFI模式下第一次做&#xff0c;加之windows系统…

【JavaSE】--数据类型与变量

文章目录 1. 字面常量2. 数据类型3. 变量3.1 变量概念3.2 整型变量3.2.1 整型变量3.2.2 长整型变量3.2.3 短整型变量3.2.4 字节型变量 3.3 浮点型变量3.3.1 双精度浮点型3.3.2 单精度浮点型 3.4 字符型变量3.5 布尔型变量3.6 类型转换3.6.1 自动类型转换&#xff08;隐式&#…

Openeuler22 部署 RackTables0.22.0

目录 0、前言 一、部署lamp环境&#xff0c;lamp环境测试 1、部署Apache&#xff0c;apache环境测试 2、部署php、mysql&#xff0c;php环境测试 二、放文件 三、配置mysql 四、安装racktables 第一步、点击proceed继续 第二步、点击proceed 第三步、根据提示进行操作…

【Qt】解决设置QPlainTextEdit控件的Tab为4个空格

前言 PyQt5 是一个用于创建跨平台桌面应用程序的 Python 绑定集合&#xff0c;它提供了对 Qt 应用程序框架的访问。用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序&#xff0c;以及非GUI程序。PyQt5 使得 Python 开发者可以使用 Qt 的丰富功能来构建应用程序。…

【无线通信发展史⑨】1791年路易吉·伽伐尼-关于动物电的研究与1800年亚历山大·伏打伯爵-电池:伏打电池

前言&#xff1a;用这几个问答形式来解读下我这个系列的来龙去脉。如果大家觉得本篇文章不水的话希望帮忙点赞收藏加关注&#xff0c;你们的鼓舞是我继续更新的动力。 我为什么会写这个系列呢&#xff1f; 首先肯定是因为我本身就是一名从业通信者&#xff0c;想着更加了解自己…

RHEL 7 安装配置( Linux 网络操作系统 02)

一、虚拟机安装 我们的每台电脑都已经安装了VMware 虚拟机&#xff0c;其安装相当简单&#xff0c;在此不再赘述。可以参考如下链接&#xff1a; VMWare安装傻瓜式教程 &#xff08;大家可以关注老师的博客&#xff0c;也建议大家写博客。&#xff09; 二、红帽 rhel 7 安装 找…

Windows系统Docker部署AList并挂载阿里云盘实现远程访问详细教程——“cpolar内网穿透”

文章目录 前言1. 使用Docker本地部署Alist1.1 本地部署 Alist1.2 访问并设置Alist1.3 在管理界面添加存储 2. 安装cpolar内网穿透3. 固定Alist公网地址 前言 本文和大家分享如何在Windows系统使用Docker本地部署Alist全平台网盘神器&#xff0c;然后结合cpolar内网穿透工具实现…

运维Tips | 如何安全的移除系统中旧的Linux内核?

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] 如何安全的删除系统中旧的 Linux 内核? 描述&#xff1a;如果更新了 Linux 操作系统&#xff0c;那么你会注意到&#xff0c;每次升级 Linux 内核后&#xff0c;GRUB 菜单都会添加一个新的引导条…

如何解决 Windows PowerShell 中 “无法加载文件 pnpm.ps1” 的错误

当你在 Windows 系统上尝试使用 pnpm 时&#xff0c;如果遇到“无法加载文件 pnpm.ps1”的错误&#xff0c;通常这意味着 PowerShell 的执行策略阻止了脚本的运行。这种限制是为了防止未经授权的脚本在您的计算机上执行&#xff0c;但它同样也会阻止合法但未签名的脚本运行。 …

解读:靠卖石头能否实现财务自由?

在生活中&#xff0c;我们常常听闻各种独特的创业故事&#xff0c;而 “卖石头实现月入过万” 也成为了一个令人好奇的话题。 在大家生活压力都比较大的情况下&#xff0c;许多人都在寻找新的收入来源&#xff0c;尤其是在经济压力日益增加的情况下。最近&#xff0c;一些人开…

如何选择可靠的相亲交友平台:安全与诚信并重

在数字化时代&#xff0c;相亲交友系统已成为寻找伴侣的重要途径。然而&#xff0c;选择一个可靠的平台对于确保安全和诚信至关重要。以下是如何选择可靠相亲交友平台的指南 &#xff1a; 第一章&#xff1a;安全为先 选择相亲交友系统时&#xff0c;安全性是首要考虑的因素。…

读书记录:谷歌工作法 工作效率提升10倍的57个技巧

​ 前言 我在谷歌工作时留下的最深刻印象是“必须以全世界最快的速度取得成果”这一谷歌特有的强烈的使命感。 为什么日本的企业生产效率低下 过度推迟讨论 过分讨论 过度的交流 改变工作方式方法才是生存之道 在这样的时代&#xff0c;我们不应该害怕“自己的工作消失”&a…

【CSS in Depth 2 精译_027】4.4 Flexbox 元素对齐、间距等细节处理(下)+ 4.5 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

[MySQL表的增删改查-进阶]

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 &#x1f4bb…

【拥抱AI】主流平台AI Agent使用体验对比

为了更好的了解和学习RAG的原理和实战效果&#xff0c;也因为工作需要&#xff0c;这两天都奔波在各大主流AI平台。 以下自己收集的是一些主流大模型LLM的AI Agent对比&#xff0c;通过功能特性、易用性与集成性、成本与商业模式、安全性与隐私性几个方面来了解&#xff0c;有不…

LSP协议:打造流动性管理的市场新标杆

随着以太坊从 PoW&#xff08;工作量证明&#xff09;向 PoS&#xff08;权益证明&#xff09;的转型&#xff0c;PoS已然成为主流区块链共识机制的重要组成部分。再加上跨链技术的发展&#xff0c;包含比特币在内的不同生态之间进行资产质押与交换也催生出市场对于流动性管理的…

CentOS Stream 8中安装和使用 Docker

docker安装包-CSDN博客 〇、常用的docker命令 docker的作用&#xff1a; 快速进行软件的安装&#xff0c;便于软件环境的维护 docker的镜像: 压缩了指定软件的安装包的文件。使用镜像文件创建容器 docker的容器: 容器可以理解为就是一台小电脑。安装的linux系统&am…

《OpenCV计算机视觉》—— 对图片进行旋转的两种方法

文章目录 一、用numpy库中的方法对图片进行旋转二、用OpenCV库中的方法对图片进行旋转 一、用numpy库中的方法对图片进行旋转 numpy库中的 np.rot90 函数方法可以对图片进行旋转 代码实现如下&#xff1a; import cv2 import numpy as np# 读取图片 img cv2.imread(wechat.jp…

[基金理财] 投资组合的搭建

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…