BS版图形系统 - 画线

ggplot2图形语法核心:图层叠加、标度控制与出版级图表构建 ggplot2不是绘图函数,而是基于图形语法(Grammar of Graphics)的声明式可视化系统。其核心原理在于将图表解构为数据、映射、几何、统计、标度、坐标系和主题七层可组合单元,通过图层叠加(+)实现惰性编译与逻辑解耦。这种设计赋予图表极强的可复用性、可维护性与出版适应性——支持自动分面、智能误差线渲染、色盲友好标度(如viridis)、多设备中文导出(cairo_pdf/showtext)等关键能力。广泛应用于生物信息学热图、临床试验趋势图、经济学面板可视化等需高解释性与审稿鲁棒性的科研场景。 阅读详情

BS版图形系统 - 画线


一晃两个月过去了,儿子也考了个喜欢的大学,重新,又稳定了下来。
我也重操旧业,编点小程序。时不时发个小博客,自娱自乐一下。
今天处理图元 - 线。
话不多说,直接上代码。

export class TLine extends TTwoPointMeta {
    beginArrow: TArrow = new TArrow;
    endArrow: TArrow = new TArrow;
    Initial() {
        this.setClassType(CbwClassType.Line);
        super.Initial();
    }

    RefreshConnectPoints() {
        this.newDefaultConnectPoint(1);
        let r = this.boundRect;
        this.SetConnectPoint(0, r.xCenter, r.yCenter);
    }
    containBrush(): boolean { return false; }
    doDraw(ctx: CanvasRenderingContext2D) {
        if (!this.LastPoint.IsValid) return;
        if (this.ApplyPen(ctx) != 0) {
            ctx.moveTo(this.toCanvasX(this.points[0].x), this.toCanvasY(this.points[0].y));
            ctx.lineTo(this.toCanvasX(this.points[1].x), this.toCanvasY(this.points[1].y));
            ctx.stroke();
            ctx.fillStyle = this.LineColor.toString();
            let theta = this.points[0].thetaToPoint(this.points[1]);
            this.beginArrow.doDraw(ctx, new TPoint(this.toCanvasX(this.points[0].x), this.toCanvasY(this.points[0].y)), 180 + theta, this.paintBox!.Ratio);
            this.endArrow.doDraw(ctx, new TPoint(this.toCanvasX(this.points[1].x), this.toCanvasY(this.points[1].y)), theta, this.paintBox!.Ratio);
        }
    }

    doPaintForSelect(ctx: CanvasRenderingContext2D, idx: number) {
        ctx.moveTo(this.toCanvasX(this.points[0].x), this.toCanvasY(this.points[0].y));
        ctx.lineTo(this.toCanvasX(this.points[1].x), this.toCanvasY(this.points[1].y));
        ctx.stroke();
        let theta = this.points[0].thetaToPoint(this.points[1]);
        this.beginArrow.doDraw(ctx, new TPoint(this.toCanvasX(this.points[0].x), this.toCanvasY(this.points[0].y)), 180 + theta, this.paintBox!.Ratio);
        this.endArrow.doDraw(ctx, new TPoint(this.toCanvasX(this.points[1].x), this.toCanvasY(this.points[1].y)), theta, this.paintBox!.Ratio);
    }

    get Length(): number {
        let result = this.points[0].DistanceTo(this.points[1]);
        result = Math.floor(result * 100 + 0.5);
        result = result / 100;
        return result;
    }
    set Length(value: number) {
        let theta = this.points[0].thetaToPoint(this.points[1]);
        this.points[1].x = this.points[0].x + value * Math.cos(theta);
        this.points[1].y = this.points[0].y + value * Math.sin(theta);
        this.updateBorder();
    }

    SaveToXmlNode(parentXmlNode: CbwXmlNode): CbwXmlNode {
        let thisNode = super.SaveToXmlNode(parentXmlNode);
        new TEnum(NArrow, NArrow.None).SaveToXmlNode(thisNode, "beginType", this.beginArrow.type);
        if (this.beginArrow.length != 20) thisNode.AddAttribute("beginLength", this.beginArrow.length.toString());
        if (this.beginArrow.theta != 30) thisNode.AddAttribute("beginTheta", this.beginArrow.theta.toString());
        new TEnum(NArrow, NArrow.None).SaveToXmlNode(thisNode, "endType", this.endArrow.type);
        if (this.endArrow.length != 20) thisNode.AddAttribute("endLength", this.endArrow.length.toString());
        if (this.endArrow.theta != 30) thisNode.AddAttribute("endTheta", this.endArrow.theta.toString());
        return thisNode;
    }

    LoadFromXmlNode(thisNode: CbwXmlNode): CbwXmlNode {
        super.LoadFromXmlNode(thisNode);
        this.beginArrow.type = new TEnum(NArrow, NArrow.None).LoadFromXmlNode(thisNode, "beginType");
        this.beginArrow.length = thisNode.IntAttributeValueByName("beginLength", "20");
        this.beginArrow.theta = thisNode.IntAttributeValueByName("beginTheta", "30");
        this.endArrow.type = new TEnum(NArrow, NArrow.None).LoadFromXmlNode(thisNode, "endType");
        this.endArrow.length = thisNode.IntAttributeValueByName("endLength", "20");
        this.endArrow.theta = thisNode.IntAttributeValueByName("endTheta", "30");
        return thisNode;
    }

    DrawHint(ctx: CanvasRenderingContext2D) {
        if (this.currentPointIndex > 0) {
            let rect = new Rect().From(this.points[0], this.points[1]);
            DrGraph.TCanvas.DrawHint_Length(ctx, this.toCanvasPoint(this.points[1].add(-5, 5)), this.toCanvasPoint(this.points[0].add(-5, 5)), rect.dialogLength);
            DrGraph.TCanvas.DrawHint_Angle(ctx, this.toCanvasPoint(this.points[1]), this.toCanvasPoint(this.points[0]))
        }
    }
}

这种代码都烂大街的,好象也没什么解释的必要,毕竟我也是从网上借鉴过来的。
在这里插入图片描述
拿走不谢。

一个BS架构软件的原型设计 一个BS 架构软件的 原型设计 项目调研与原型设计之间,最好有个UE调研,先出几个主要的UE界面,再出原型,不然后期的修改会增大! 答复:你所说的UE调研,其实已经包含在需求调研中了,当然也体现在原型上了,这个过程没有独立做,肯定不会做到很完善,但是项目管理与产品设计是有区别的,比如: 产品设计,除注重产品功能外,还有很如用户体验、市场、竞争对手等等情况; 项目管理,项目没有绝对完美,只有项目经理去引导客户的需求,直到验收并拿到验收款,讲究的是项目的实施成本、利润空间等。 所以,两者过程都会涉及到产品的设计等,但目标是不同的 立即下载

相关推荐

分支界定法(branch and bound)与背包问题的代码实现

分支界定法(branch and bound)与背包问题的代码实现 LastEditTime: - 2021.2.3 不卖茶的吴龙茗茶 分支界定法是一种在整数规划中常用的算法,其主要思想为将大问题分割成小问题进行求解。分支界定法是围绕着一个二叉树进行的,以背包问题为例: 假设小明有一个背包,其总的容积为30,小明有三件东西可以带,三件东西的体积分别为:10,15,20。求问小明如何能够在背包中装下更大体积的物品? .

小吴同学的小屋 1885

一文看懂架构图怎么画

什么是架构图?维基百科、百度百科其实都没有关于它的直接定义。架构图=架构+图这样问题就转化成,什么是架构,以及什么是图?架构,又名软件架构,是有关软件整体结构与组件的抽象描述,于指导型软件系统各个方面的设计。

了解➔熟悉➔掌握➔精通 4313

Simulink+Simscape多体仿真:六自由度Stewart平台动力学建模全流程

本文详细介绍了使用Simulink和Simscape Multibody进行六自由度Stewart平台动力学建模的全流程,涵盖从CAD模型导入、运动学逆解计算到实时控制系统的设计。通过MATLAB/Simulink与Simscape的协同工作,实现高保真度的并联机器人仿真,适用于飞行模拟器、精密加工等高精度领域。

r2s3t4的博客 486

B/S 三层架构 简单思维导图

B/S三层架构的浅见,如有问题,望指正

m0_46357237的博客 5698

Unity游戏Mono注入实战:从反编译到功能扩展

本文详细介绍了Unity游戏Mono注入的完整实战流程,从使用dnSpy反编译游戏核心逻辑,到编写自定义C#功能DLL,再到利用SharpMonoInjector进行动态注入。文章深入讲解了如何通过Harmony库拦截修改游戏方法,并介绍了使用MelonLoader框架和UnityExplorer进行高级模组开发与调试,最终通过一个游戏对象透视(ESP)案例演示了功能扩展的实现。

weixin_29018335的博客 458

每天10分钟,混剪视频Agent产出50条爆款,单月变现6位数(喂饭级教程)

混剪视频是指将多个视频片段、图片或音频素材进行剪辑组合,创造出新的视频内容。随着Coze上线联动剪映功能,混剪视频制作正在进入自动化时代,为创作者带来巨大便利。高效自动化处理:AI可以自动完成琐碎的剪辑工作,让创作者省下大量时间专注于项目策划和创意。批量素材产出:特别适用于抖音、小红书和视频号等平台上的养生、科普、心理、疗愈等垂直领域,可以自动化批量生产图片和视频素材。引流获客:通过优质内容吸引目标受众知识变现:通过教学传授技术工具变现:将搭建好的工作流作为产品销售。

汤师爷的博客 864

软件体系结构—B/S和C/S架构

在进行软件开发时,通常会在两种基本架构中进行选择,即C/S架构和B/S架构。1.C/S结构C/S架构是客户端/服务器端交互模式,是Client/Server的简称。它是早期常用的一种软件架构,这种架构的软件需要在用户的电脑上安装客户端程序,下面通过一张图来了解C/S架构客户端与服务器的交互过程。如图1-1所示:图1-1 C/S架构图2.B/S结构B/S架构是浏览器/服务器交互模式,是Browser...

cdy的博客 2万+

看不懂分子动力学模拟的结果?一文读懂RMSD曲线

随后,将每一帧结构与初始模板进行叠合,计算对应原子的平均偏移量,即RMSD。总之,掌握 RMSD 的解读方法,就等于抓住了评估分子动力学模拟成败与质量的“总开关”。①在模拟初始阶段,RMSD会从0迅速上升,这是蛋白质从静态晶体或模型结构释放到溶液环境中并逐渐适应的正常过程。②经过一段时间后,曲线不再系统性上升或下降,而是围绕一个平均值,小幅度地上下波动,形成一个稳定的“平台”。这种情况下,RMSD 在初始快速上升后,并未进入平台,而是持续甚至加速上升,始终未见收敛。🔍 如何解读不同趋势的RMSD曲线。

weixin_46587777的博客 4891

006-BS架构

1. 颜色由红色、绿色、蓝色混合而成。 2. 如今的计算机已经有处理数百万种颜色的能力。 3. 颜色值 3.1. 颜色由一个十六进制符号来定义, 这个符号由红色、绿色和蓝色的值组成(RGB)。 3.2. 每种颜色的最小值是0(十六进制:#00)。最大值是255(十六进制:#FF)。 3.3.这个表格给出了由三种颜色混合而成的具体效果 4. 颜色名 4.1. 大多数的浏览器都支持颜色名集合。 4.2. 仅仅有16种颜色名被W3C的html 4.0标准所支持。它们是: aqua, blac.

aihiao的专栏 2594

增距镜或中继镜选型

增距镜光路图

camerall 5247

高云FPGA系列教程(2):FPGA点灯工程创建、程序下载和固化

相比于国外FPGA厂商EDA开发环境,几个G到几十个G的大小,高云云源软件安装包也很小巧,界面也很简洁,综合速度非常快,是我没想到的,好像在使用单片机一样,点一下就编译完成了,以本文简单的LED示例工程为例,比特流文件几乎在几秒钟内生成;无论是下载比特流文件到RAM还是Flash中,速度都很快,而且只有一种fs程序文件格式,不用再进行bit/mcs转换;云源软件自带的编辑器也很好用,和Notepad++界面差不多,而且快捷键很方便,具有基本的自动补全功能。

whik1194的博客 5461

BS项目——架构能力

BS项目——架构能力 spring框架可谓各式各样,相信用springboot+mybatis-plus做过项目的人都了解过mybatis-plus自动生成代码,那么一键生成代码,增删改查数据库,项目所需接口自动生成还远吗?所以未来不想被无情淘汰,做项目的基本能力要掌握,架构一个项目,从画图开始😎 一、需求分析 真理:一切需求来自甲方 用例图,类图,时序图,思维导图 工具:visio,xmind visio功能了解一下,在数学建模中画流程图必备,这里主要说明作为UML工具如何使用 一、【快速使用图表】

m0_52712579的博客 2096

(11)(2.2.2) BLHeli32,AM32, and BLHeli_S ESCs(一)

Ardupilot官网关于《Peripheral Hardware》的翻译 —《(2.2.2) BLHeli32,AM32, and BLHeli_S ESCs》。

无人机开发(开源Ardupilot) 2231

画出B/S三层架构概念图,简述其基本工作机理。

转载于:https://www.cnblogs.com/zut-syp/p/10543672.html

weixin_30832405的博客 1175

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

阿里巴巴技术专家三画:如何画好架构图

技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享,以提高我们的专业能力。 本文作者阿里巴巴技术专家三画,分享了自己和团队在画好架构图方面的理念和经验,首发于阿里内部技术分享平台,阿里巴巴中间件授权转载,梓敬、鹏升和余乐对此文亦有贡献。 当我们想用一张或几张图来描述我...

勇往直前的专栏 1010

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

BS版图形系统 - Ribbon Gallery

BS版图形系统 - Ribbon Gallery先准备相应图标实现资源配置初步效果上下箭头按钮处理下一步工作 今天尝试做一个Ribbon Gallery效果 直接参考PPT效果 当然,感觉在网页里,占用空间少一些好,所以把各图标间距整小一点。 先准备相应图标 实现 export class TRibbonGallery extends TPanel { rightPanel: TPanel; btnUp: TButton; btnMid: TButton; btnDown

drgraph的博客 372

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

B/S架构和C/S架构

C/S架构简要介绍 在了解什么是B/S架构之前,我们有必要了解一下什么是C/S架构: C/S架构是第一种比较早的软件架构,主要用于局域网内。也叫 客户机/服务器模式。 它可以分为客户机和服务器两层: 第一层: 在客户机系统上结合了界面显示与业务逻辑; 第二层: 通过网络结合了数据库服务器。 简单的说就是第一层是用户表示层,第二层是数据库层。   这里需要补充的是,客户端不仅仅是一些简单的操作,...

YAYA776的博客 1691

JAVAWeb01-BS架构简述、HTML

BS架构、HTML

weixin_42482333的博客 6464

BS框架说明

架构,包含前端、后端、数据库三大组成部分。,还有很多高级的前端框架,如。)组成的系统的框架结构。

m0_62110645的博客 2346

计算机b s架构模式图,深入理解B/S架构

最近看招聘信息很多都要求理解B/S架构,自己面试时也被问到过这个问题,查找了一些资料,整理出这篇博客。一: B/S的概念B/S(Brower/Server,浏览器/服务器)模式又称B/S结构,是Web兴起后的一种网络结构模式。浏览器是客户端最主要的应用软件,客户机上只需要安装一个浏览器,浏览器通过Web Server(网站服务器)同数据库进行数据交互,浏览器负责界面显示逻辑和极少数的事务逻辑,主要...

weixin_27014595的博客 1万+

常见B/S系统架构设计

要点 一:前端架构     前端是通常是指用户的请求到达应用服务器之前经历的环节,一般不包括业务逻辑,不处理动态数据。     1.浏览器优化技术     并不是优化浏览器,而是通过优化响应页面,加快浏览器页面的加载和显示,常用的有页面缓存、合并HTTP减少请求次数、使用页面压缩等。     2.CDN   &n...

weixin_42408447的博客 6300

计算机毕业设计之jsp青岛黄海学院志愿者服务系统的设计与实现

青岛黄海学院志愿者服务系统分为三个部分,即管理员和用户、活动管理。该系统是根据用户的实际需求开发的,贴近生活。管理员拥有最大的权限,其次是用户,最后是活动管理。管理员点击活动报名管理,在活动报名管理页面对活动名称、活动类型、活动地点、报名时间、报名说明、管理账号、账号、姓名、手机、是否审核、审核回复等信息,可以查询或删除活动报名等操作。基于这种情况,我们需要这样一个界面简单大方、功能齐全的系统来解决用户问题,满足用户需求。活动管理、用户、志愿活动、活动报名、发起签到、签到信息、活动时长。

2401_85506100的博客 243

画图理解BS模式

XiaoZeng941101的博客 887

BSChartView画折线图,柱形图,圆饼图

BSChartView 一个支持画折线图,柱状图,圆饼图的工具 支持双Y轴显示,支持左右滑动,支持自定义样式。 效果 gitHub地址:https://github.com/FreeBaiShun/BSChartView pod集成 pod ‘BSChartView’ 用法 类似于tableView的使用 // // ViewController.m // // Created by ...

qq_17190231的博客 402
上一篇: BS版图形系统 - 中文录入
下一篇: BS版图形系统 - 矩形
DrGraph
博客等级 码龄14年 228粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值