【OCCT+ImGUI系列】001-GP-点与向量

在这里插入图片描述

按照官网的User guide,现在介绍模型数据部分。本章先介绍点与向量。

**模型数据(Model Data,MD)**是用来描述三维物体形状的工具。它分为两部分:

  • 几何:就是物体的外形,比如曲线和曲面,帮助我们画出物体的轮廓。
  • 拓扑:就是描述这些外形如何连接在一起,像是拼图一样,把不同的部分组合成一个完整的物体。

这样,模型数据就能帮助我们准确地在三维空间中表示物体的形状。

本文介绍 点 与 向量
在这里插入图片描述

什么是pg_Pnt和pg_Vect

  • 点(gp_Pnt):表示三维空间中的一个位置,比如一个具体的坐标点 (X, Y, Z)。
  • 向量(gp_Vec):表示一个方向和大小,通常是从一个点指向另一个点的“箭头”。

gp是什么意思

gp_ 是一个命名空间前缀,用来表示几何和数学基础类。gp_ 代表了 Geometry and Positioning (几何与定位),是 Open CASCADE 几何库的一部分,主要用于处理几何实体、坐标系、向量、点等数学构造。

向量的作用

  • 表示方向

    • 向量可以表示物体的运动方向、法线方向、旋转方向等。
  • 计算距离

    • 向量可以表示两个点之间的距离或差异。例如,计算两个点之间的直线距离。
  • 加法和减法

    • 向量可以相加或相减,帮助你合成多个方向的效果,或者计算它们之间的差异。
  • 点与向量的结合

    • 向量可以用来从一个点沿某个方向移动,得到一个新位置。例如,用一个向量从一个点出发,得到另一个点。
  • 点积和叉积

    • 向量可以进行数学运算,如点积(计算夹角)和叉积(计算垂直方向)。这些在计算几何和物体定位时非常有用。
  • 缩放和旋转

    • 向量可以被缩放(放大或缩小)或旋转,用于物体变形、旋转等操作。
  • 001-MD-PointAndVector.h

    #pragma once
    
    #include "BaseScene.h"
    #include "VisSceneComponents.h"
    
    class MDPointAndVector001 : public BaseScene, public VisSceneComponents {
    public:
        void displayScene(Handle(V3d_View)& view, Handle(AIS_InteractiveContext)& context) override {
            //<创建起始点
            // 1. 使用默认构造函数创建一个零点
            gp_Pnt point1;
            // 2. 使用三维坐标创建一个点
            gp_Pnt point2(1.0, 2.0, 3.0);
            // 3. 使用另外一个点来构造新点
            gp_Pnt point3 = point2;
    
            //<创建Vector
            // 1. 使用默认构造函数创建一个零向量
            gp_Vec vec1;
            // 2. 使用两个点之间的差值创建向量
            gp_Pnt p1(2.0, 3.0, 4.0);
            gp_Pnt p2(1.0, 3.0, 5.0);
            gp_Vec vec2(p1, p2);  // vec2 = p2 - p1
            // 3. 使用三维坐标直接创建一个向量
            gp_Vec vec3(7.0, 8.0, 9.0);
    
            //<向量计算演示
            // 计算两个向量之间的加法
            gp_Vec vec4 = vec2 + vec3;  // vec4 = vec2 + vec3
             计算向量的点积
            //Standard_Real dotProduct = vec2.Dot(vec3);
             计算向量的叉积
            //gp_Vec crossProduct = vec2.Crossed(vec3);
    
            //<可视化
            visPoint(point2, context);  // 可视化点
            visVector(gp_Pnt(7.0, 8.0, 9.0), vec2, context, makeColor(0.4157, 0.5020, 0.7255));    // 可视化向量vec2
            visVector(point1, vec3, context, makeColor(0.5333, 0.6196, 0.4510));    // 可视化向量加法结果
            visVector(point1, vec4, context, makeColor(0.6627, 0.2902, 0.2902));    // 可视化向量叉积结果
    
        }
    };
    
  • 001-MD-PointAndVector.cpp

    #include "001-MD-pointAndVector.h"
    #include "SceneSelector.h"
    
    namespace {
        struct Registrar {
            Registrar() {
                SceneSelector::RegisterScene("001-MD-PointAndVector", []() {
                    return std::make_shared<MDPointAndVector001>();
                    });
            }
        };
        static Registrar registrar;
    
    }
    
  • VisSceneComponents.h
    为了解耦和遵守DRY(Don’t Repeat Yourself)原则,我把可视化代码放在了单独的头文件中,以后context的可视化相关函数就先放这边了。

    #pragma once
    
    #include <AIS_Shape.hxx>
    #include <TopoDS_Shape.hxx>
    #include <BRepBuilderAPI_MakeVertex.hxx>
    #include <BRepBuilderAPI_MakeEdge.hxx>
    #include <BRepBuilderAPI_MakeFace.hxx>
    #include <V3d_View.hxx>
    #include <gp_Pnt.hxx>
    #include <gp_Vec.hxx>
    #include <AIS_InteractiveContext.hxx>
    #include <BRepBuilderAPI_MakeWire.hxx>
    
    class VisSceneComponents {
    public:
        // 构造函数
        VisSceneComponents() = default;
    
        // 可视化一个点
        void visPoint(const gp_Pnt& point, Handle(AIS_InteractiveContext)& context) {
            Handle(AIS_Shape) pointShape = new AIS_Shape(BRepBuilderAPI_MakeVertex(point).Shape());
            context->Display(pointShape, Standard_True);
        }
    
        // 可视化一个向量
        void visVector(const gp_Pnt& startPoint, const gp_Vec& vector, Handle(AIS_InteractiveContext)& context) {
            gp_Pnt endPoint = startPoint.Translated(vector);
            Handle(AIS_Shape) edgeShape = new AIS_Shape(BRepBuilderAPI_MakeEdge(startPoint, endPoint).Shape());
            context->Display(edgeShape, Standard_True);
        }
    };
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值