编写一款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.hqwc.cn/news/640536.html

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

相关文章

自定义表单系统开源是否好用?

在竞争激烈的社会中&#xff0c;拥有够灵活、易维护、可视化界面等优势特点的低代码技术平台获得了很多中小型企业的认可与信赖。在提升企业竞争力、办公效率和规避信息孤岛等方面具有重要的应用价值和作用。流程信息为客户提供低代码技术平台、自定义表单系统开源&#xff0c;…

Android驱动开发之如何编译和更换内核

编译内核可以使用图形化的界面配置,也可以直接使用脚本。在X86_64模拟器环境下,不用交叉编译,而交叉编译工具很容易出现兼容问题,一般也只能使用芯片厂商提供的工具,而不是GNU提供的工具。 android内核开发流程以及架构变化了很多,详情请看 内核官网 内核版本选择 由…

去雾笔记-Pixel Shuffle,逆Pixel Shuffle,棋盘效应,转置卷积

文章目录 1.Pixel Shuffle2.Inverse Pixel Shuffle3.棋盘效应4.转置卷积5.宽激活块6.PSPNet7.反射填充层&#xff08;Reflective Padding Layer&#xff09;8.tanh层 1.Pixel Shuffle Pixel Shuffle是一种用于图像超分辨率的技术&#xff0c;它通过重新排列图像的像素来增加图…

Windows 安全中心:页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问,并且你尝试访问的项目不可用。有关详细信息,请与 IT 支持人员联系。

问题 1&#xff1a;Windows 安全中心提示&#xff1a;【页面不可用 你的 IT 管理员已限制对此应用的某些区域的访问&#xff0c;并且你尝试访问的项目不可用。有关详细信息&#xff0c;请与 IT 支持人员联系。】 修复 Microsoft.SecHealthUI 方法 1&#xff1a;命令自动重装安…

Hive架构原理

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

Linux(centos)服务器10秒快速配置Java环境

查看是否已安装Java java -version 查看yum能下载的Java版本 yum -y list java*这里选择安装Java 11 yum install -y java-11-openjdk.x86_64查看是否安装成功并配置到环境里 java -version结束

linux系统安全与应用【下】

目录 1.开关机安全控制 1.1GRUB限制 2.终端登录安全控制 2.1 限制root只在安全终端登录 2.2 禁止普通用户登录 3.弱口令检测 3.1 Joth the Ripper&#xff08;JR&#xff09; 4.网络端口扫描 4.1 nmap命令 1.开关机安全控制 1.1GRUB限制 通常情况下在系统开机进入GRU…

在Mac M1笔记本上跑大语言模型llama3的4个步骤?(install、pull、run、ask)

要点 Ollama一个功能强大的本地大语言模型LLM运行工具&#xff0c;支持很多模型&#xff0c;并且操作极其简单快速回忆步骤&#xff1a; 下载ollama工具&#xff1a;https://ollama.com/download 下载模型&#xff1a;ollama pull llama3 #根据libs列表直接指定名字 运行模型…

uni-app app和h5的通信

uni-app一套代码同时打包安卓、iOS、h5,有一些需要app与h5的交互通信,目前做到了这块的业务,记录如下&#xff1a; 1.去declould官网,找到uni_webview.js下载链接,将uni_webview.js文件下载到本地&#xff0c;修改uni_webview.js内部配置,将uni修改为webUni,修改好的文件已放到…

搭建知识库-DataWhale笔记

词向量及向量知识库介绍 词向量 词向量定义 在机器学习和自然语言处理&#xff08;NLP&#xff09;中&#xff0c;词向量&#xff08;Embeddings&#xff09;是一种将非结构化数据&#xff0c;如单词、句子或者整个文档&#xff0c;转化为实数向量的技术。这些实数向量可以被…

LLM学习笔记-3

温度缩放 概念 1&#xff09;在机器学习中&#xff0c;"温度缩放"通常指的是一种技术&#xff0c;用于调整神经网络输出的概率分布。这个技术通常在 softmax 函数的输出上进行操作。 2&#xff09;在 softmax 函数中&#xff0c;神经网络会输出一个概率分布&#x…

Spark-机器学习(4)回归学习之逻辑回归

在之前的文章中&#xff0c;我们来学习我们回归中的线性回归&#xff0c;了解了它的算法&#xff0c;知道了它的用法&#xff0c;并带来了简单案例。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请…