前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Flutter 绘制与数学】探索线分支

【Flutter 绘制与数学】探索线分支

作者头像
张风捷特烈
发布于 2022-05-09 05:32:59
发布于 2022-05-09 05:32:59
4170
举报

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。\n\n—\n\n##### 前情回顾:\n\n在上一篇 《Flutter 绘制番外篇 - 数学中的角度知识》 中,我们研究了两点连线的角度问题:\n\n

\n\n并探究了一下 线绕点旋转 的一些知识:\n\n

\n\n以及线上距起点,线长*分率 处点的坐标。据此,我们可以很容易获取线上的分割点坐标:\n\n

\n\n—-\n\n#### 一、线上点的定角引线\n\n我们下面来思考一个问题:\n\n- 已知 p0p1 坐标,q0在线上,且距 p0 的长度为percent*|p0p1|\n- q0,q1 线p0,p1 线夹角为 θ,且 |p0p1|len\n- 求 q1 点坐标。\n\n

\n\n其实线段的中垂线,就相当于上面 percent = 0.5θ = 90° 的情况。\n\n—\n\n##### 1. 思路\n\n思路很简单,根据点位信息,算就完事了。根据 p0p1 的倾角 β 和已知夹角 θ ,再结合 |q0q1| 的长度 ,q1 点的坐标应该不难计算。\n\n

\n\n现在在 Line 类中定义 branch 方法,返回一个 Line 对象,意为:通过已知 line 对象引发新分支 。其中入参有, 分支起点在线上的分度 percent、新分支线长度 len 、新分支与线的夹角 rad 。\n\ndart\nLine branch({\n required double rad,\n required double percent,\n required double len,\n}) {\n // TODO 返回分支线\n}\n\n\n—\n\n##### 2. 代码实现\n\n如下,是这里要实现的效果。代码实现也很简单,根据角度算出 dxdy ,然后有 q0 坐标减一下即可。\n\n

\n\ndart\nLine branch({\n required double rad,\n required double percent,\n required double len,\n}) {\n Offset q0 = this.percent(percent);\n double dx = len * cos(this.rad + rad );\n double dy = len * sin(this.rad + rad );\n Offset q1 = Offset(q0.dx-dx, q0.dy-dy) ;\n return Line(start: q0, end: q1);\n}\n\n\n—\n\n如下,当 percent = 0.5θ = 90° 时,就表示从 p0p1 引出一条支线,且为 p0p1 的中垂线:\n\n

\n\n—\n\n##### 3. 操作演示\n\n代码详见 【02/03】,下面通过三个 Slider 分别控制 长度角度分度 。这个,我们就实现了:在线上 任意一点 、以任意角度 、引出 任意长度 的支线效果。\n\n

\n\n—\n\n简单说一下实现:先定义一个 Config 类,用于存储配置信息:\n\ndart\n---->[GeometryPainter]---\nclass Config {\n final double len;\n final double angle;\n final double percent;\n Config({\n required this.len,\n required this.angle,\n required this.percent,\n });\n}\n\n\n—\n\n在画板构造中传入 ValueNotifier<Config> 可监听对象,这样在外界对 config 的改变,就可以触发画板的重绘。最后只要在 Slider 的回调中更新 config 对应的值即可:\n\ndart\n---->[GeometryPainter]----\nclass GeometryPainter extends CustomPainter {\n final ValueNotifier<Config> config;\n \n GeometryPainter({required this.config}) : super(repaint: config);\n\n\n—\n\n这时,实用主义派估计已经满脑问号 : 这有什么用? 。通过线上点引出分支,就实现了一种 “绑定关系” ,而且此时这里并没有使用 Canvas 的任何变换,所有点坐标都是 “绝对坐标”,这样对于手势的校验是比较方便的。\n\n

\n\n—\n\n#### 二、你眼中的线又何须是线\n\n##### 1. 树形结构\n\n其实上面的空心圆只是绘制的示意,它可以是任意图形,如果把分支移到尾点,那么在起始点绘制红黑小球又会怎么样呢?如下所示:有没有回想起曾经被红黑树支配的恐惧。 \n\n

\n\n感兴趣的可以自己研究一下这个红黑树的绘制,以后可能会单独进行探索。最好是结合操作性,可视化地展示红黑树工作的流程。另外并不一定要局限于二叉树,也延伸为多子树,这个在下次研究数据结构的时候再说吧。\n\n—\n\n##### 2.分支\n\n知道两点的坐标,我们并非只能绘制直线,比如分支线可以通过 二次贝塞尔曲线 形成弧线:\n\n

\n\n这样结合动画和长度,就可以实现收展节点的效果。注意哦,曲线终点的小黑点,也可以是任意的图案;而且每个末点也可以进行分支、其实这样结合点的选中,可以实现树形的折叠。感觉挺有趣的,有待后续研究。源码详见 【02/06】\n\n

\n\n—\n\n本篇从对 线分支 的研究,搞出了些花里胡哨的东西。这是在之前未曾预料到的。三年前,研究过 二叉树 的绘制,结果虽然绘制出来了,但并不是很满意,这里发现了一个新的思路。可谓是: 有心栽花花不开,无心插柳柳成荫 。那本篇就到这里,关于绘制和数学的稀奇古怪研究,以后继续 ~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
React创建组件的三种方式及其区别
虽然有三种方式可以定义react的组件,那么这三种定义组件方式有什么不同呢?或者说为什么会出现对应的定义方式呢?下面就简单介绍一下。
前朝楚水
2018/07/26
2K0
(转) 谈一谈创建React Component的几种方式
原文地址:http://www.cnblogs.com/Unknw/p/6431375.html
mafeifan
2018/09/10
5150
React Object实现React对象
如果不使用ES6语法,可以直接使用 React.createClass 来实现相同的功能:
随风溜达的向日葵
2018/08/07
8470
小结React(一):组件的生命周期及执行顺序
本文作为React总结系列的第一篇文章,会总结组件的生命周期及执行顺序,涉及内容比较基础。在后面的系列文章中则会总结React Hooks等内容。
前端林子
2019/04/13
4.9K0
小结React(一):组件的生命周期及执行顺序
小结React(二):组件知多少
React 16.8中正式发布了React Hooks,主要是想解决如何复用一个有状态的组件的问题。实际上React Hooks就是一系列特殊的函数,可以让本来无状态的函数组件变成有状态的,在组件内部hook组件的状态state和lifecycle。不过在正式总结React Hooks前,有必要搞清楚一些比较基本的问题,例如:什么是组件,什么是有状态组件和无状态组件,它们各自有什么特点,如何创建组件。本文根据这一思路将梳理关于React组件的基本内容,具体包括:
前端林子
2019/04/20
2.7K0
小结React(二):组件知多少
React组件详解
众所周知,组件作为React的核心内容,是View的重要组成部分,每一个View页面都由一个或多个组件构成,可以说组件是React应用程序的基石。在React的组件构成中,按照状态来分可以分为有状态组件和无状态组件。 所谓无状态组件,就是没有状态控制的组件,只做纯静态展示的作用,无状态组件是最基本的组件形式,它由属性props和渲染函数render构成。由于不涉及到状态的更新,所以这种组件的复用性也最强。 有状态组件是在无状态组件的基础上增加了组件内部状态管理,有状态组件通常会带有生命周期lifecycle,用以在不同的时刻触发状态的更新,有状态组件被大量用在业务逻辑开发中。
xiangzhihong
2022/11/30
1.6K0
React Native之React速学教程(下)
React Native之React速学教程(下) 本文出自《React Native学习笔记》系列文章。 React Native是基于React的,在开发React Native过程中少不了的需要用到React方面的知识。虽然官方也有相应的Document,但篇幅比较多,学起来比较枯燥。 通过《React Native之React速学教程》你可以对React有更系统和更深入的认识。为了方便大家学习,我将《React Native之React速学教程》分为上、中、下三篇,大家可以根据需要进行阅读学习。 概
CrazyCodeBoy
2018/05/07
2.8K0
【react】关于react框架使用的一些细节要点的思考
( _(:3 」∠)_给云友们提个建议,无论是API文档还是书籍,一定要多看几遍!特别是隔一段时间后,会有意想不到的收获的) 这篇文章主要是写关于学习react中的一些自己的思考: 1.setStat
啦啦啦321
2018/01/03
2K0
【react】关于react框架使用的一些细节要点的思考
React 代码共享最佳实践方式
任何一个项目发展到一定复杂性的时候,必然会面临逻辑复用的问题。在React中实现逻辑复用通常有以下几种方式:Mixin、高阶组件(HOC)、修饰器(decorator)、Render Props、Hook。本文主要就以上几种方式的优缺点作分析,帮助开发者针对业务场景作出更适合的方式。
winty
2021/05/18
3.1K0
React 开发要知道的 34 个技巧
原理:子组件里面利用 props 获取父组件方法直接调用,从而改变父组件的值 注意: 此方法和 props 大同小异,都是 props 的应用,所以在源码中没有举例
前端老王
2020/09/23
1.5K0
2023前端二面必会react面试题合集_2023-02-28
React.createClass和extends Component的bai区别主要在于:
用户10358021
2023/02/28
1.6K0
React.js实战之React 生命周期1 组件的生命周期
ReactJS 的核心思想是组件化,即按功能封装成一个一个的组件,各个组件维护自己的状态和 UI,当状态发生变化时,会自定重新渲染整个组件,多个组件一起协作共同构成了 ReactJS 应用。 为了能够
JavaEdge
2018/06/06
1.6K0
React 开发必须知道的 34 个技巧【近1W字】
React 是前端三大框架之一,在面试和开发中也是一项技能; 本文从实际开发中总结了 React 开发的一些技巧技巧,适合 React 初学或者有一定项目经验的同学; 万字长文,建议收藏。 序列文章:Vue 开发必须知道的 36 个技巧【近1W字】
火狼1
2019/11/13
3.6K0
react 创建组件以及组件通信
关于React.createClass方法与class App extends Component方法的区别
念念不忘
2019/03/29
9680
前端模块化开发--React框架(一): 入门和面向组件编程
React中文官网 一、简介 1、特点 1)Declarative(声明式编码) 2)Component-Based(组件化编码) 3)Learn Once, Write Anywhere(支持客户端与服务器渲染) 4)高效 5)单向数据流 2、React高效的原因 1)虚拟(virtual)DOM, 不总是直接操作DOM 2)DOM Diff算法, 最小化页面重绘 3、相关的js核心库 1)react.js: React的核心库 2)react-dom.js: 提供操作DOM的react扩展库 3)bab
MiChong
2020/09/24
2.2K0
前端模块化开发--React框架(一): 入门和面向组件编程
React的无状态和有状态组件
众所周知,React是一个专注于View层的前端框架,组件也】是React核心理念之一,一个完整的应用将由一个个独立的组件拼装而成,组件也是React最基础的一部分,学习React就需要先学习组件。
xiangzhihong
2022/11/30
1.6K0
react面试题合集
Redux 的基本思想是整个应用的 state 保持在一个单一的 store 中。store 就是一个简单的 javascript 对象,而改变应用 state 的唯一方式是在应用中触发 actions,然后为这些 actions 编写 reducers 来修改 state。整个 state 转化是在 reducers 中完成,并且不应该有任何副作用。
beifeng1996
2022/12/12
6630
React.js 实战之深入理解组件sublime 插件安装组件间通信
sublime 插件安装 用Package Control安装 按下Ctrl+Shift+P调出命令面板 输入install 调出 Install Package 选项并回车,然后在列表中选中要安
JavaEdge
2018/06/06
1.1K0
前端必会react面试题合集2
(2)如果已经创建了 Create React App 项目,需要将 typescript 引入到已有项目中
beifeng1996
2023/01/04
2.3K0
React基础
React起源于FaceBook的内部项目,用来架设Instagram的网站,并于2013年5月开源。
小二丶
2023/11/28
1.4K1
相关推荐
React创建组件的三种方式及其区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档