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

server/2024/9/24 3:34:49/

绘制步骤

交互绘制圆形为例:

  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.ppmy.cn/server/10394.html

相关文章

使用阿里云试用Elasticsearch学习:sentence-transformers 包使用

环境&#xff1a;centos8&#xff0c;windows坑太多。 一、检查linux环境openssl哪个版本&#xff08;如果是OpenSSL 1.1.1k 直接跳过&#xff09; [roothecs-334217 python39]# openssl version OpenSSL 1.0.2k-fips 26 Jan 2017原因后续会出麻烦&#xff0c;遇到这种情况最…

华为OD机试真题-幼儿园篮球游戏-2023年OD统一考试(C卷D卷)

题目描述: 幼儿园里有一个放倒的圆桶,它是一个 线性结构,允许在桶的右边将篮球放入,可以在桶的左边和右边将篮球取出。每个篮球有单独的编号,老师可以连续放入一个或多个篮球,小朋友可以在桶左边或右边将篮球取出,当桶只有一个篮球的情况下,必须从左边取出。 如老师按顺…

【目标检测】Yolov7 的 ELAN 和 E-ELAN 模块演进(涉及到分组卷积,cardinality,梯度路径)

感觉从 YOLOv6 开始&#xff0c;YOLOv6 系列感觉优化点都着重于推理速度上面&#xff0c;YOLOv6 的 RepBlock 重参数化&#xff0c;给我的感觉就是算子融合进行加速。而 YOLOv7&#xff0c;为了在各种架构的边缘设备上获得极致的推理速度。 YOLOv7 的工作&#xff1a; 新的 b…

【QT】QtConcurrent的使用介绍,与std::thread的区别

QtConcurrent 模块是 Qt 框架中用于简化并发编程的一部分。它提供了一系列高级API&#xff0c;使得开发者能够更容易地编写多线程代码&#xff0c;从而利用多核处理器的能力。这个模块主要围绕使用线程池来执行函数调用、运行算法或者处理数据集。QtConcurrent 的核心优势是它的…

MAC 终端命令

Command Shift . 显示隐藏文件夹 环境变量路径 ~/.zshrc ~/.bash_profile 每次打开都需要 source 安装Homebrew xcode安装 xcode-select --install brew安装 /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)” 检查是否…

喜讯 | “泰迪杯”数据挖掘挑战赛再次进入计算机类竞赛指数榜单

4月15日&#xff0c;第61届中国高等教育博览会在福州召开。在教师教学发展与创新人才培养论坛上&#xff0c;浙江大学何钦铭教授代表《全国普通高校大学生计算机类竞赛指数》专家工作组发布了最新一年的竞赛指数。据悉&#xff0c;今年的竞赛项目清单包含了28项赛事&#xff0c…

路由过滤器GatewayFilter

Spring Cloud (p2hp.com) spring的官方地址 可以在里边看相关文档。 GatewayFilter是网关中提供的一种过滤器&#xff0c;可以对进入网关的请求和微服务返回的响应做处理&#xff1a; 过滤器工厂&#xff1a;spring提供了31种不同的路由过滤器工厂 对所有的路由都生效的配置&…

python创建sqlite,并使用flask-sqlalchemy连接

python创建sqlite&#xff0c;并使用flask-sqlalchemy连接 在 PyCharm 中&#xff0c;你可以使用 SQLite 数据库来存储数据。以下是在 PyCharm 中使用 SQLite 数据库并通过 Flask-SQLAlchemy 连接它的步骤&#xff1a; 1. 在 PyCharm 中创建 SQLite 数据库 打开 PyCharm&…