编写一款2D CAD/CAM软件(十六)交互绘制图形

绘制步骤

以交互绘制圆形为例:

  1. 点击鼠标左键,确定圆心位置;
  2. 抬起鼠标,移动鼠标,半径随鼠标位置变化;
  3. 点击左键确定半径,完成圆的绘制。

绘制结果

Code

/// j-operator-create-circle.h#pragma once#include "j-operator.h"
#include "j-geometry/j-geometry-circle.h"namespace JNSOperator {enum class JCreateCircleStep {eCreateCircleStepInit = 0,eCreateCircleStepFirstDown,eCreateCircleStepFirstRelease,eCreateCircleStepSecondDown,eCreateCircleStepSecondRelease};class JOperatorCreateCircle : public JOperator {public:JOperatorCreateCircle(JOperatorManager *manager);virtual ~JOperatorCreateCircle();unsigned GetClassId() const override {return ID_OP_CREATE_CIRCLE;}bool IsOpDrawCircle() const override {return true;}void LButtonDown(const JNSGeometry::JGeoPoint &point) override;void LButtonUp(const JNSGeometry::JGeoPoint &point) override;void MouseMove(const JNSGeometry::JGeoPoint &point) override;void RButtonUp(const JNSGeometry::JGeoPoint &point) override;void BeforeOperate() override;void Reset() override;void EndOperate(JResult aResult) override;const JNSGeometry::JGeoCircle &GetAssistCircle();void SetCenterAndRadius(const JNSGeometry::JGeoPoint &center, double radius);JCreateCircleStep GetStatus();private:JNSGeometry::JGeoCircle assist_circle_;JCreateCircleStep step_ = JCreateCircleStep::eCreateCircleStepInit;};
}
/// j-operator-create-circle.cpp#include "j-operator/j-operator-create-circle.h"
#include "j-operator/j-operator-manager.h"
#include "j-document/j-document.h"namespace JNSOperator {JOperatorCreateCircle::JOperatorCreateCircle(JOperatorManager *manager): JOperator(manager) {Reset();}JOperatorCreateCircle::~JOperatorCreateCircle() {}void JOperatorCreateCircle::LButtonDown(const JNSGeometry::JGeoPoint &point) {if (step_ == JCreateCircleStep::eCreateCircleStepInit) {assist_circle_.SetCenter(point);step_ = JCreateCircleStep::eCreateCircleStepFirstDown;} else if (step_ == JCreateCircleStep::eCreateCircleStepInit ||step_ == JCreateCircleStep::eCreateCircleStepFirstDown ||step_ == JCreateCircleStep::eCreateCircleStepFirstRelease) {double radius = point.DistanceTo(assist_circle_.GetCenter());assist_circle_.SetRadius(radius);step_ = JCreateCircleStep::eCreateCircleStepSecondDown;}}void JOperatorCreateCircle::LButtonUp(const JNSGeometry::JGeoPoint &point) {if (step_ == JCreateCircleStep::eCreateCircleStepFirstDown) {assist_circle_.SetCenter(point);step_ = JCreateCircleStep::eCreateCircleStepFirstRelease;} else if (step_ == JCreateCircleStep::eCreateCircleStepSecondDown) {double radius = point.DistanceTo(assist_circle_.GetCenter());assist_circle_.SetRadius(radius);step_ = JCreateCircleStep::eCreateCircleStepSecondRelease;EndOperate(JResult::eOk);}}void JOperatorCreateCircle::MouseMove(const JNSGeometry::JGeoPoint &point) {if (step_ == JCreateCircleStep::eCreateCircleStepInit ||step_ == JCreateCircleStep::eCreateCircleStepFirstDown) {assist_circle_.SetCenter(point);} else if (step_ == JCreateCircleStep::eCreateCircleStepFirstRelease ||step_ == JCreateCircleStep::eCreateCircleStepSecondDown) {double radius = point.DistanceTo(assist_circle_.GetCenter());assist_circle_.SetRadius(radius);}}void JOperatorCreateCircle::RButtonUp(const JNSGeometry::JGeoPoint &point) {}void JOperatorCreateCircle::BeforeOperate() {}void JOperatorCreateCircle::Reset() {JNSGeometry::JGeoPoint center;center.InitInvalid();assist_circle_.SetCenter(center);assist_circle_.SetRadius(0.0);step_ = JCreateCircleStep::eCreateCircleStepInit;}void JOperatorCreateCircle::EndOperate(JResult aResult) {if (aResult == JResult::eOk) {if (!assist_circle_.GetCenter().IsValid()) {return;}auto circle = new JNSGeometry::JGeoCircle();circle->SetCenter(assist_circle_.GetCenter());circle->SetRadius(assist_circle_.GetRadius());op_manager_->GetDocument()->AddGeo(circle);} else {}Reset();op_manager_->BackToNormal();}const JNSGeometry::JGeoCircle &JOperatorCreateCircle::GetAssistCircle() {return assist_circle_;}void JOperatorCreateCircle::SetCenterAndRadius(const JNSGeometry::JGeoPoint &center, double radius) {assist_circle_.SetCenter(center);assist_circle_.SetRadius(radius);}JCreateCircleStep JOperatorCreateCircle::GetStatus() {return step_;}
}
/// j-view.cppvoid JView::DrawOperator(JNSOperator::JOperatorCreateCircle *op) {auto circle = op->GetAssistCircle();auto center = circle.GetCenter();DrawPoint(static_cast<JNSGeometry::JGeoPoint *>(&center));DrawCircle(static_cast<JNSGeometry::JGeoCircle *>(&circle));}

以此为模板,可以将绘制其它基本图元的功能补齐。

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

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

相关文章

Facebook的区块链应用深度分析

去中心化身份验证的意义 在当今数字化社会中&#xff0c;身份验证的重要性不言而喻。对于Facebook这样的大型社交媒体平台来说&#xff0c;确保用户的身份真实性和数据的安全性是至关重要的。传统的中心化身份验证方式存在一定的安全风险和可信性问题&#xff0c;而去中心化身…

verilog中赋值运算符(=和<=)的用法

目录 原理 RTL 图 运算符优先级 原理 “”阻塞赋值&#xff0c;”<”非阻塞赋值。阻塞赋值为执行完一条赋值语句&#xff0c;再执行下一条&#xff0c;可理解为顺序执行&#xff0c;而且赋值是立即执行&#xff1b;非阻塞赋值可理解为并行执行&#xff0c;不考虑顺序&am…

Qt绘制边框有阴影兼容性问题

在Qt开发过程中&#xff0c;有时候我们要显示一个有阴影的对话框&#xff0c;这时一般采用自定义实现&#xff0c;然而最近在开发时软件时&#xff0c;Win11上显示正常&#xff0c;Win10或其他Win11电脑显示不正常&#xff0c;存在兼容性问题吗&#xff1f; 下面是具体的源码 …

【PhpStorm的环境配置与应用的简单介绍】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Hive架构原理

Hive Hive 的架构是设计用于在大数据环境下进行数据仓库操作和分析的系统。它建立在 Hadoop 生态系统之上&#xff0c;利用 Hadoop 的存储&#xff08;HDFS&#xff09;和计算&#xff08;MapReduce、Tez、Spark 等&#xff09;能力。 1. 元数据存储&#xff08;Metastore&am…

Flutter开发之--初识Flutter

文章目录 概述Flutter整体架构嵌入层引擎层框架层 跑通demo尝鲜Flutter项目的目录介绍Flutter demo项目的运行 总结 概述 Flutter 是由Google公司研发的一种跨端开发技术&#xff0c;在2018年正式推出。Flutter自带Skia图形绘制引擎&#xff0c;采用自绘制的方式&#xff0c;不…

【Hadoop3.3.6】数据块副本放置策略及解析EditLog和FsImage

目录 一、摘要二、正文2.1 环境说明2.2 网络拓扑2.3 Hadoop副本放置策略介绍2.4 解析EditLog和Fsimage镜像文件三、小结一、摘要 通过解析存储于NameNode节点上的日志文件EditLog和镜像文件(元数据)Fsimage来反向验证HDFS的数据块副本存放策略,其目的是希望加深对Hadoop的数…

Tensorflow AutoGraph 的作用和功能

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ TensorFlow AutoGraph 是 TensorFlow 中的一个重要特性&#xff0c;它允许开发者使用普通的 Python 语法编写高效的 TensorFlow 图&#xff08;graph&#xff09;。这意味着开发者可以利用 Python 的易…

【电机控制】滑模观测器PMSM无感控制波形图

【电机控制】滑模观测器PMSM无感控制波形图 文章目录 前言一、FOC控制1.三相电流2.Clark变换静止坐标系iαiβ3.park变换旋转坐标系idiq4.电流环PI控制输出UdUq5.UdUq 反park变换UαUβ 二、反电动势观测器BEMF1.静止坐标系iαiβ提取反电动势EaEb2.反电动势EaEb提取位置信息、…

物联网通信中NB-IoT、Cat.1、Cat.M该如何选择?

物联网通信中NB-IoT、Cat.1、Cat.M该如何选择? 参考链接:物联网通信中NB-IoT、Cat.1、Cat.M该如何选择?​​ 在我们准备设计用于大规模联网的物联网设备时,选择到适合的LTE IoT标准将是我们遇到的难点。这是我们一开始设计产品方案就需要解决的一个问题,其决定我们设备需…

前端框架技术调研

目前程序员使用前端框架最多的是哪一个&#xff1f;

3D MINS 多模态影像导航系统

3D MINS多模态影像导航系统&#xff08;Multimodal Image Navigation System&#xff09;是SunyaTech研发的建立在DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;图像基础之上的多模态影像导航系统&#xff0c;集二维影像PACS管理、三维影像层级…

vscode ssh远程连接服务器,一直正在下载vscode服务器的解决办法

前言 为方便描述&#xff0c;在本教程中&#xff0c;发起远程连接的叫“主机”&#xff0c;被远程连接的叫“服务器”。 正文 如果主机是首次用vscode远程连接服务器&#xff0c;会在服务器上自动下载vscode服务器&#xff0c;但有时候因为网络问题&#xff0c;会卡在&#xff…

STL Array、ForwardList源码剖析

STL Array、ForwardList源码剖析 参考文章: https://blog.csdn.net/weixin_45389639/article/details/121618243 array 源代码 template<typename _Tp,std::size_t _Nm> struct array {typedef _Tp value_type;typedef _Tp* pointer;typedef value_type* iterator;// Su…

【函数式接口使用✈️✈️】配合策略模式实现文件处理的案例

目录 &#x1f378;前言 &#x1f37b;一、功能描述 &#x1f37a;二、面向对象设计模式 &#x1f379;三、策略模式 &#x1f366;四、策略 VS 面向对象 &#x1f368;章末 &#x1f378;前言 小伙伴们大家好&#xff0c;上周初步了解了下函数式接口&#xff0c;Consume…

Azure AD统一认证及用户数据同步开发指导

本文主要目的为&#xff1a;指导开发者进行自有服务与Azure AD统一认证的集成&#xff0c;以及阐述云端用户数据同步的实现方案。本文除了会介绍必要的概念、原理、流程外&#xff0c;还会包含Azure门户设置说明&#xff0c;以及使用Fiddler进行全流程的实操验证&#xff0c;同…

HarmonyOS ArkUI实战开发-页面跳转(Router、Ability)

页面跳转可以分为页面内跳转和页面间跳转&#xff0c;页面内跳转是指所跳转的页面在同一个 Ability 内部&#xff0c;它们之间的跳转可以使用 Router 或者 Navigator 的方式&#xff1b;页面间跳转是指所跳转的页面属与不同的 Ability &#xff0c;这种跳转需要借助 featureAbi…

Java练习题

打印9*9乘法口诀表 解析&#xff1a;利用for循环解决 代码如图所示&#xff1a; public class Cc {public static void main(String[] args) {for (int i 1; i < 10; i){ //从1遍历到9 for(int j 1; j < i; j){ System.out.print(j "*" i "&…

Docker pull镜像名称 把本地镜像推送到远程详解

Docker pull镜像名称 把本地镜像推送到远程详解&#xff1a; Docker 镜像 仓库 容器介绍 以及镜像仓库详解 下载一个alpine的镜像演示&#xff0c;alpine是一个比较小的的linux镜像。 docker pull alpinedocker tag d4ff818577bc docker.io/itying/alpine:v1.0.1docker tag d4…