首页 > 其他分享 >编写一款2D CAD/CAM软件(五)视图

编写一款2D CAD/CAM软件(五)视图

时间:2024-04-07 09:59:44浏览次数:23  
标签:JView point geo 视图 2D CAM include JNSGeometry view

j-view模块

目录配置:

JCad
    include
        j-view
            j-view.h
j-view
    prj
        CMakeLists.txt
    src
        j-view.cpp

CMakeLists.txt

存在多种计算机图形学的引擎,用于将图形绘制到显卡缓存并显示出来。有些引擎使用CPU的能力,有些则充分发挥GPU的能力,而对于CAD/CAM这种面向大型绘图设计的图形软件,不仅仅需要充分发挥硬件的能力,而且需要进行多种图形学、算法的优化才能达到满足用户需求的目的。

这里我们暂时使用Qt提供的QPainter作为绘图引擎,该引擎是使用CPU来进行绘图,理解容易、使用简单。后续将实现基于OpenGL引擎的绘图方式,这里定义了一个USE_QPAINTER宏用于区分使用了哪一种绘图引擎。

cmake_minimum_required(VERSION 3.5)

project(j-view)

add_library(
    j-view
    SHARED
)

find_package(Qt5 COMPONENTS Widgets Core REQUIRED)
target_link_libraries(
    j-view
    PRIVATE
    Qt5::Widgets
    Qt5::Core
    j-geometry)

add_compile_definitions(USE_QPAINTER=1) #define macro to use QPAINTER

include_directories(
        ${QT_INCLUDE_DIR}
        ../../include
        ../src
)

target_sources(
        j-view
        PRIVATE
        ../src/j-view.cpp
)

QT5_WRAP_CPP(
        MOC_FILES
        ../../include/j-view/j-view.h
)

include(${CMAKE_SOURCE_DIR}/cmake/common.cmake)

头文件 j-view.h

需要使用QPainter在一块画布上进行绘图,想象一下你手握画笔蘸取不同的颜色来在一块画图上绘图各种不同的图形,这里的画布是一个QImage的数字图像对象。这里图像的大小与视图尺寸相等,正好覆盖在整个视图上,并且由一个个相邻的像素点按照矩阵排列组成。

而对于图形坐标系和视图坐标系的缩放比例ratio_,以及图形坐标系的原点在视图坐标系下的坐标位置(x_orig_geo_, y_orig_geo_)可以参照上一篇关于坐标系的说明。

//j-view.h

#pragma once

#include <QObject>
#include <QPainter>
#include <QImage>

#include <vector>
#include <algorithm>

#include "j-geometry/j-geometry-point.h"
#include "j-geometry/j-geometry-line.h"
#include "j-geometry/j-geometry-circle.h"

namespace JNSView {

class JView : public QObject {
    Q_OBJECT
public:
    JView(int width, int height);
    ~JView();

    /// draw geometry APIs
    void DrawAllGeo(const std::vector<JNSGeometry::JGeometry*>& geos);
    void DrawPoint(JNSGeometry::JGeoPoint* point);
    void DrawLine(JNSGeometry::JGeoLine* line);
    void DrawCircle(JNSGeometry::JGeoCircle* circle);

    /// coordinate convert
    JNSGeometry::JGeoPoint GeoToView(const JNSGeometry::JGeoPoint& point_geo);
    JNSGeometry::JGeoPoint ViewToGeo(const JNSGeometry::JGeoPoint& point_view);

    /// static APIs
    static QPointF GeoPointToQPointF(const JNSGeometry::JGeoPoint& geo_point);

private:
#ifdef USE_QPAINTER
    QPainter painter_;
#endif

    QImage buffer_;

    double ratio_ = 1.0; // geo/view
    double x_orig_geo_ = 0.0;
    double y_orig_geo_ = 0.0;

};

}

源文件j-view.cpp

GeoToView和ViewToGeo接口用于实现上一篇坐标系中关于仿射变换的方法。GeoToView将图形坐标系下的坐标点转换为视图坐标系下的像素坐标,而ViewToGeo接口则将视图坐标系下的像素坐标转换为图形坐标系下的坐标点。

#include "j-view/j-view.h"

namespace JNSView {

JView::JView(int width, int height) : QObject() {
    buffer_ = QImage(width, height, QImage::Format::Format_ARGB32);
}

JView::~JView() {}

void JView::DrawAllGeo(const std::vector<JNSGeometry::JGeometry*>& geos) {
    std::for_each(geos.begin(), geos.end(), [&](JNSGeometry::JGeometry* geo) {
        if(geo->IsGeoPoint()){
            DrawPoint(static_cast<JNSGeometry::JGeoPoint*>(geo));
        } else if (geo->IsGeoLine()) {
            DrawLine(static_cast<JNSGeometry::JGeoLine*>(geo));
        } else if (geo->IsGeoCircle()) {
            DrawCircle(static_cast<JNSGeometry::JGeoCircle*>(geo));
        }
    });
}
void JView::DrawPoint(JNSGeometry::JGeoPoint* point) {
    painter_.drawPoint(GeoPointToQPointF(GeoToView(*point)));
}
void JView::DrawLine(JNSGeometry::JGeoLine* line) {
    painter_.drawLine(GeoPointToQPointF(GeoToView(line->GetStart())), GeoPointToQPointF(GeoToView(line->GetEnd())));
}
void JView::DrawCircle(JNSGeometry::JGeoCircle* circle) {
    Q_UNUSED(circle)
}

JNSGeometry::JGeoPoint JView::GeoToView(const JNSGeometry::JGeoPoint& point_geo){
    double x_pixel = x_orig_geo_ + point_geo.GetX()/ratio_;
    double y_pixel = y_orig_geo_ + point_geo.GetY()/ratio_;
    return JNSGeometry::JGeoPoint(x_pixel, y_pixel);
}
JNSGeometry::JGeoPoint JView::ViewToGeo(const JNSGeometry::JGeoPoint& point_view){
    double x_physical = (point_view.GetX() - x_orig_geo_)*ratio_;
    double y_physical = (point_view.GetY() - y_orig_geo_)*ratio_;
    return JNSGeometry::JGeoPoint(x_physical, y_physical);
}

QPointF JView::GeoPointToQPointF(const JNSGeometry::JGeoPoint& geo_point) {
    return QPointF(geo_point.GetX(), geo_point.GetY());
}
}

这里有很多细节实现需要注意,后续需要持续的优化。例如

  • 点point的绘制,如果只占据一个像素点,那么对于用户而言需要举着放大镜进行观察才能明确地确认这是个点图元,而不是屏幕上的灰尘;所以点图元应该占据一定的像素面积。
  • 绘制不同图元的接口可以设置为同名函数,并一定需要利用函数名称加以甄别等。

标签:JView,point,geo,视图,2D,CAM,include,JNSGeometry,view
From: https://blog.csdn.net/qq_35414398/article/details/137370019

相关文章

  • Camera KMD ISP学习笔记(8)-Camera SMMU
    学习资料来源:https://deepinout.com/camx-kmd/camera-kmd-isp-subsystem-intro.html仅用于个人学习,侵联删 SMMU/IOMMU:处理IODeviceDMA访问内存的计算机硬件,实现dmaaddr(IOVA)到物理地址的映射MMU:处理CPU访问内存的计算机硬件,实现CPU虚拟地址到物理地址的映射 SMMU&&DMA......
  • Camera KMD ISP学习笔记(7)-CRM pipeline delay和V4L2 Event
    学习资料来源:https://deepinout.com/camx-kmd/camera-kmd-isp-subsystem-intro.html仅用于个人学习,侵联删 Realtimepipeline或实时Pipeline,在这个Pipeilne上的硬件设备有一些特点:实时,实时是指streamon后一直在出图,如下图的蓝色线(flash和actuator不会出图,但也是挂载到Realt......
  • 6.7物联网RK3399项目开发实录-驱动开发之Camera摄像头的使用(wulianjishu666)
    90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】链接:https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwd=c53f ========================================================Camera使用简介AIO-3399J开发板分别带有两个MIPI,MIPI支持最高4K拍照......
  • Qcom Camera调试(网络资料整理)
    网络资料:Android:高通平台Camera调试之SetpropKey/camxoverridesettings.txt-sheldon_blogs-博客园(cnblogs.com)Camera疑难杂症_yaoming168的博客-CSDN博客高通camera调试经验总结_高通af调试教程-CSDN博客camera命令的总结_adbshell"echoautoimagedump=true>>......
  • QCOM Camera常用指令
    参考资料:Camera疑难杂症_yaoming168的博客-CSDN博客 1、骁龙相机开发者模式adbshellsetproppersist.sys.camera.devoption.debug100 2、查看上层得到的cameraid数量adbshelldumpsysmedia.camera>camdump.txt 3、打开骁龙相机adbshellamstart-nor......
  • 闲来无事-esp32cam实现延时摄影
    扯淡时间在上一篇文章中我提了一嘴,打算使用esp32cam实现一个延迟摄影,奈何存在各种硬件问题,商家发了好几个地板都不好使(就是那个拼多多商家的问题,还说我供电不稳,我特意买了独立供电的hub),后来逛淘宝的时候又给我推送了esp32的板子,我不信邪的买了一个~他妈的上来就好使,所以才有了......
  • grad_cam下的自定义模型获取热力图
    原文链接:https://blog.csdn.net/zxdd2018/article/details/1255053521.(多张图片)备注:gram_cam_1importosimportnumpyasnpimporttorchimportcv2importmatplotlib.pyplotaspltimporttorchvision.modelsasmodelsfromtorchvision.transformsimportCompose,N......
  • 【MV】物化视图测试
    物化视图作为Oracle性能调优的一种有效手段值得深入测试和了解,在充分了解和测试物化视图技术的基础上,可以将物化视图技术纳入到数据库架构设计过程中。本文对物化视图的创建以及物化视图的基本知识点进行描述。1.创建测试环境createtablespacesectbsdatafile'E:\oracle\product......
  • 【MV】物化视图查询重写
     所谓物化视图查询重写就是,如果初始化参数query_rewrite_enabled设置为TRUE,并且数据库运行在CBO优化模式下,当对基表进行查询时,Oracle会自动判断是否能利用这个基表的所有包含ENABLEQUERYREWRITE关键字的物化视图,如果可以且根据统计信息判断通过查询物化视图代价更小,则Oracle自......
  • Camstar : IFrame菜单挂一个外部网站的页面
     如果设置变量传参: 这个是页面定义了两个固定变量:VP上的不同VP共用一个class。还有传递当前登录用户的: ......