fabic.js Quadratic Curve /可控制的曲线

需要绘制一条可控制的贝塞尔曲线,发现fabic官网中一个demo有点类似。感兴趣的可以移步官网查看demo。

官网的demo是对于html 而言的,放在vue中需要变换一下,具体代码如下:

<template><div class="dashboard-container" @contextmenu.prevent><canvas id="editorCanvas" ref="canvas" style="margin-top: 10px;" /></div>
</template><script>
import { mapGetters } from 'vuex'
// import fabric from 'fabric'
let canvas = ''
export default {name: 'Dashboard',computed: {...mapGetters(['name'])},data () {return {width: window.innerWidth,height: window.innerHeight,activeEl: {}// 获取当前点击元素}},mounted () {const self = this// canvas = new fabric.StaticCanvas('editorCanvas', {//静态画布,不可以修改canvas = new fabric.Canvas('editorCanvas', {width: self.width,height: self.height,backgroundColor: '#ffffff'})var line = new fabric.Path('M 65 0 Q 100, 100, 200, 0', { fill: '', stroke: 'black', objectCaching: false })line.path[0][1] = 100line.path[0][2] = 100line.path[1][1] = 200line.path[1][2] = 200line.path[1][3] = 300line.path[1][4] = 100line.selectable = falsecanvas.add(line)var p1 = self.makeCurvePoint(200, 200, null, line, null)p1.name = 'p1'canvas.add(p1)var p0 = self.makeCurveCircle(100, 100, line, p1, null)p0.name = 'p0'canvas.add(p0)var p2 = self.makeCurveCircle(300, 100, null, p1, line)p2.name = 'p2'canvas.add(p2)canvas.on('object:selected', function (opt) {self.onObjectSelected(opt)})canvas.on('object:moving', function (opt) {self.onObjectMoving(opt)})canvas.on('selection:cleared', function (opt) {self.onSelectionCleared(opt)// canvas.on({//   'object:selected': this.onObjectSelected(e),//   'object:moving': this.onObjectMoving(e),//   'selection:cleared': this.onSelectionCleared(e)})},methods: {makeCurveCircle (left, top, line1, line2, line3) {var c = new fabric.Circle({left: left,top: top,strokeWidth: 5,radius: 12,fill: '#fff',stroke: '#666',originX: 'center',originY: 'center'})c.hasBorders = c.hasControls = falsec.line1 = line1c.line2 = line2c.line3 = line3return c},makeCurvePoint (left, top, line1, line2, line3) {var c = new fabric.Circle({left: left,top: top,strokeWidth: 8,originX: 'center',originY: 'center',radius: 14,fill: '#fff',stroke: '#666'})c.hasBorders = c.hasControls = falsec.line1 = line1c.line2 = line2c.line3 = line3return c},onObjectSelected (e) {// console.log(e.target)var activeObject = e.targetif (activeObject.name == 'p0' || activeObject.name == 'p2') {activeObject.line2.animate('opacity', '1', {duration: 200,onChange: canvas.renderAll.bind(canvas)})activeObject.line2.selectable = true}},onSelectionCleared (e) {var activeObject = e.targetif (activeObject.name == 'p0' || activeObject.name == 'p2') {activeObject.line2.animate('opacity', '0', {duration: 200,onChange: canvas.renderAll.bind(canvas)})activeObject.line2.selectable = false} else if (activeObject.name == 'p1') {activeObject.animate('opacity', '0', {duration: 200,onChange: canvas.renderAll.bind(canvas)})activeObject.selectable = false}},onObjectMoving (e) {if (e.target.name == 'p0' || e.target.name == 'p2') {var p = e.targetif (p.line1) {p.line1.path[0][1] = p.leftp.line1.path[0][2] = p.top} else if (p.line3) {p.line3.path[1][3] = p.leftp.line3.path[1][4] = p.top}} else if (e.target.name == 'p1') {var p = e.targetif (p.line2) {p.line2.path[1][1] = p.leftp.line2.path[1][2] = p.top}} else if (e.target.name == 'p0' || e.target.name == 'p2') {var p = e.targetp.line1 && p.line1.set({ 'x2': p.left, 'y2': p.top })p.line2 && p.line2.set({ 'x1': p.left, 'y1': p.top })p.line3 && p.line3.set({ 'x1': p.left, 'y1': p.top })p.line4 && p.line4.set({ 'x1': p.left, 'y1': p.top })}}}
}
</script><style lang="scss" scoped>
</style>

效果如图:

核心:定义 line时,设置path数组值。变换时修改path数组中的值。直接=

但是我需要绘制三阶贝塞尔曲线,即要两个控制点。这时候就需要变形一下。

const line = new fabric.Path(`M ${item1.left} ${item1.top} C ${item1.left} ${item2.top}, ${item2.left} ${item1.top}, ${item2.left}, ${item2.top}`, {
....../* 起点 */line.path[0][1] = item1.leftline.path[0][2] = item1.top/* 控制点1 */line.path[1][1] = item1.leftline.path[1][2] = item2.top/* 控制点1 */line.path[1][3] = item2.leftline.path[1][4] = item1.top/* 结束点 */line.path[1][5] = item2.leftline.path[1][6] = item2.top

修改直接进行重新赋值。

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

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

相关文章

个人所思所想录

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

在VMware虚拟机中固定CentOS系统ip(使用桥接模式)

目录 一、前置说明二、前置准备2.1、切换虚拟机网络为桥接模式2.2、查看本机网络信息 三、配置CentOS系统IP3.1、进入系统输入ip addr 查看本机网络配置名称3.2、查看网络配置目录&#xff0c;网络配置文件名称3.3、修改网络配置文件 ifcfg-ens33 固定IP3.4、重启网络 一、前置…

linux下解决tomcat错误问题

错误一&#xff1a; Linux下Tomcat启动报错&#xff1a;Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 原因&#xff1a;可能是Linux环境变了&#xff0c;需要在catalina.sh文件里指定JDK路径 解决方式&#xff1a; 在/bin/catalina.sh配置文件中加…

Vue语法

目录 事件处理器 是什么 案列 表单的综合案列 定义 常用功能 组件通信 定义 父传子 ​编辑 子传父 事件处理器 是什么 事件处理器是一种函数&#xff0c;用于响应和处理事件的触发。在编程中&#xff0c;当特定事件发生时&#xff0c;可以通过事件处理器来执行相应的…

八大排序(一)冒泡排序,选择排序,插入排序,希尔排序

一、冒泡排序 冒泡排序的原理是&#xff1a;从左到右&#xff0c;相邻元素进行比较。每次比较一轮&#xff0c;就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。 以从小到大排序为例&#xff0c;第一轮比较后&#xff0c;所有数中最大的那个数就会浮…

go语言初学(备忘)

1、安装 2 路径配置 C:\Program Files\Go\bin 3新建一个工程 4、下载VSCode 并安装插件 创建一个调试文件 在main目录下新建一个test.go脚本 package main import "fmt" func main() { fmt.Println("Hi 1111") fmt.Println("testasdf") } 断点…

免费获取独立ChatGPT账户!!

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域&#xff1a;1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。2、数据可视化…

算法、数据结构、计算机系统、数据库MYSQL、概率论、数学实验MATLAB、数学建模、马原、英语、杂项、QT项目

算法 冒号表达式 &#xff08;condition&#xff09;&#xff1f;x&#xff1a;y 可以三个条件 以此类推 &#xff08;condition1&#xff09;&#xff1f;x&#xff1a;&#xff08;condition2&#xff09;&#xff1f;y&#xff1a;z 判断三角形最简单的办法 bool canFormTr…

stm32---定时器输入捕获

一、输入捕获介绍 在定时器中断实验章节中我们介绍了通用定时器具有多种功能&#xff0c;输入捕获就是其中一种。 STM32F1除了基本定时器TIM6和TIM7&#xff0c;其他定时器都具有输入捕获功能 。输入捕获可以对输入的信号的上升沿&#xff0c;下降沿或者双边沿进行捕获&#xf…

基于Python flask 的某招聘网站爬虫,招聘岗位可视化系统

招聘信息可视化系统 一、介绍 原文地址 今天为大家带来的是Python基于Flask的招聘信息爬取&#xff0c;招聘岗位分析、招聘可视化系统。 此系统是一个实时分析招聘信息的系统&#xff0c;应用Python爬虫、Flask框架、Echarts、VUE等技术实现。 本项目利用 Python 从某招聘网…

【SpringBoot】生成二维码、在图片中嵌入二维码

背景 说明&#xff1a;本文章是介绍&#xff0c;在一张背景图片中嵌入生成的二维码和中文文字。 用处&#xff1a;比如活动分享二维码的时候&#xff0c;提供一张背景图&#xff0c;然后在背景图中嵌入二维码等。 注意&#xff1a;二维码和文字的位置需要你自行调整。 一、依赖…

两种风格的纯CSS3加载动画

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>加载动画</title><style>.loader {w…

已解决 TypeError: Fetch argument None has invalid type <class ‘NoneType‘>

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

深入学习 Redis Cluster - 基于 Docker、DockerCompose 搭建 Redis 集群,处理故障、扩容方案

目录 一、基于 Docker、DockerCompose 搭建 Redis 集群 1.1、前言 1.2、编写 shell 脚本 1.3、执行 shell 脚本&#xff0c;创建集群配置文件 1.4、编写 docker-compose.yml 文件 1.5、启动容器 1.6、构建集群 1.7、使用集群 1.8、如果集群中&#xff0c;有节点挂了&am…

24.Xaml ListView控件-----显示数据

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

Python灰帽编程——网页信息爬取

文章目录 网页信息爬取1. 相关模块1.1 requests 模块1.1.1 模块中的请求方法1.1.2 请求方法中的参数1.1.3 响应对象中属性 1.2 RE 模块1.2.1 匹配单个字符1.2.2 匹配一组字符1.2.3 其他元字符1.2.4 核心函数 2. 网页信息爬取2.1 获取网页HTML 源代码2.2 提取图片地址2.3 下载图…

服务器端应用的安装

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

机器学习第九课--随机森林

一.什么是集成模型 对于几乎所有的分类问题(图像识别除外&#xff0c;因为对于图像识别问题&#xff0c;目前深度学习是标配)&#xff0c;集成模型很多时候是我们的首选。比如构建一个评分卡系统&#xff0c;业界的标配是GBDT或者XGBoost等集成模型&#xff0c;主要因为它的效…

Windows/Linux(命令、安装包和源码安装)平台各个版本QT详细安装教程

前言 本文章主要介绍了Windows/Linux平台下&#xff0c;QT4&#xff0c;QT5&#xff0c;QT6的安装步骤。为什么要把QT版本分开介绍呢&#xff0c;因为这三个版本&#xff0c;安装步骤都不一样。Windows平台&#xff0c;QT4的Qt Creator&#xff0c;QT库和编译器是分开的&#…