圖形編輯器基于Paper.js教程06:鼠標畫圓與橢圓

繪制橢圓與圓形:利用Paper.js進行交互式圖形設計

在Web應用中實現交互式圖形繪制功能,對于提高用戶體驗至關重要,尤其是在設計和藝術相關的應用中。Paper.js是一款強大的JavaScript庫,專門用于處理矢量圖形,它提供了一套簡潔的API來操作HTML5的Canvas元素。本文通過一個實際例子,探討如何使用Paper.js來實現橢圓和圓形的繪制。

在我們的示例中,用戶可以使用鼠標在畫布上繪制橢圓或圓形。首先,我們設置了Paper.js的工作環境并初始化了tool對象,這個對象將用來處理鼠標的相關事件。

演示效果

在這里插入圖片描述

初始化工具和事件處理

onMouseDown事件處理函數中,我們記錄鼠標按下時的位置作為橢圓的起始點,并初始化一個很小的橢圓。這個初始橢圓僅僅是為了在開始拖拽時有一個圖形的基礎,其大小幾乎為零。

tool.onMouseDown = function (event) {startPoint = event.point; // 記錄起始點toolShape = new paper.Path.Ellipse({point: [event.point.x - 1, event.point.y - 1],size: [1, 1],strokeColor,strokeScaling: false});
};
處理鼠標拖拽事件

onMouseDrag中,我們根據鼠標當前的位置與起始點計算出橢圓的最小外接矩形。通過計算鼠標按下點和當前點的最小和最大坐標值,我們能確定橢圓的邊界。

const currentPoint = event.point;
const topLeft = new paper.Point(Math.min(startPoint.x, currentPoint.x), Math.min(startPoint.y, currentPoint.y));
const bottomRight = new paper.Point(Math.max(startPoint.x, currentPoint.x), Math.max(startPoint.y, currentPoint.y));
const rect = new paper.Rectangle(topLeft, bottomRight);

如果用戶在拖拽時按下了Shift鍵,我們通過調整矩形的寬度和高度為相同的值,確保橢圓變為一個完美的圓形。

更新圖形

每次拖拽時,我們首先移除之前的橢圓,然后基于新計算出的矩形繪制一個新的橢圓。

toolShape.remove();
toolShape = new paper.Path.Ellipse({from: rect.topLeft,to: rect.bottomRight,strokeColor,strokeScaling: false
});

部分代碼

paper.setup('myCanvas');
const tool = new paper.Tool();
let toolShape = null;
let startPoint = null; // 記錄鼠標按下的起始點
let strokeColor = "red"tool.onMouseDown = function (event) {startPoint = event.point; // 記錄起始點// 初始化時創建一個很小的圓作為基礎形狀toolShape = new paper.Path.Ellipse({name: "fizzEllipse",point: [event.point.x - 1, event.point.y - 1], // 使其非常小size: [1, 1], // 很小的尺寸strokeColor,strokeScaling: false,data: {isLaserItem: true,},});
};tool.onMouseDrag = function (event) {// 根據鼠標按下的位置和當前位置計算橢圓的boundsconst currentPoint = event.point;const { x: startPx, y: startPy } = startPointconst topLeft = new paper.Point(Math.min(startPx, currentPoint.x),Math.min(startPy, currentPoint.y));const bottomRight = new paper.Point(Math.max(startPx, currentPoint.x),Math.max(startPy, currentPoint.y));const rect = new paper.Rectangle(topLeft, bottomRight);// 如果按下Shift鍵,保持寬高比為1:1,即繪制圓形if (event.modifiers.shift) {const maxSize = Math.max(rect.width, rect.height);rect.width = maxSize;rect.height = maxSize;// 重新定位以保持中心不變const center = rect.center;rect.center = center;}// 更新toolShape的形狀為新的矩形區域toolShape.remove(); // 移除舊的形狀toolShape = new paper.Path.Ellipse({from: rect.topLeft,to: rect.bottomRight,strokeColor,strokeScaling: false,data: {isLaserItem: true,},});
};
總結

通過這個簡單的示例,我們展示了如何使用Paper.js來處理復雜的圖形繪制需求。這種方式不僅允許用戶靈活地繪制橢圓,還能通過簡單的修改(如按下Shift鍵)快速地切換到圓形繪制模式。這種靈活性和易用性使得Paper.js成為處理在線圖形設計的理想選擇,無論是用于藝術創作、游戲設計還是任何需要圖形繪制的應用。通過優化這些基本操作,開發者可以創建出更加豐富和互動的Web應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/39169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39169.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能語音門鎖:置入NV170D語音芯片ic 打造便捷生活新體驗

一、智能門鎖語音芯片開發背景 隨著科技的飛速發展,傳統門鎖的局限性日益凸顯,無法滿足現代人對高效、安全生活的需求。在這樣的時代背景下,智能門鎖應運而生,它不僅繼承了傳統門鎖的基本功能,更通過融入先進的科技元素…

商標的近似分辯,商標起名稱時注意!

曾有過網友發來商標名稱,普推知商標老楊說有近似,然后網友起過新名稱還是存有近似,或者加字,后面加的通用詞,與先有商標名稱也是近似。 “良信健康”這個名稱健康是行業通用詞,加成健康后變成四個字&#x…

出現 images and labels...0 found, xx missing, 0 empty, 0 corrupt 解決方法

目錄 1. 問題所示2. 原理分析3. 解決方法1. 問題所示 訓練VOC的數據的時候出現如下問題: val: Scanning /home/l228/huoyanhao/yolov5/datasets/VOC/images/VOCdevkit/VOC2007/2007_val images and labels...0 found, 2510 missing, 0 empty, 0 corrupt: 100%|███████…

HTTP協議深入

1.了解web和網絡基礎 有客戶端和服務端雙方參與交互 客戶端發送請求:request 服務端根據請求給出響應:response 請求通過URL來指定要獲取都得資源 響應內容可以是HTML網頁,或者用json表示的數據或者其他二進制文件內容 Web使用一種名為HTTP的協議作為規范&…

jEasyUI 添加分頁組件

jEasyUI 添加分頁組件 jEasyUI(jQuery EasyUI)是一個基于jQuery的用戶界面插件集合,它為用戶提供了一系列的UI組件,如菜單、窗口、數據網格等,以簡化Web頁面的開發。分頁組件是jEasyUI中的一個重要部分,它允許用戶在處理大量數據時,將數據分頁顯示,提高用戶體驗和數據…

AI與大模型工程師證書研修班報名啦!

人工智能大模型是指擁有超大規模參數(通常在十億個以上)、超強計算資源的機器學習模型,能夠處理海量數據,完成各種復雜任務,如自然語言處理、圖像識別等。計算機硬件性能不斷提升,深度學習算法快速優化&…

ESP32CAM物聯網教學03

ESP32CAM物聯網教學03 物聯網小車 小智突發奇想:要是我在點燈物聯APP中多增加幾個按鈕,控制小車的行駛方向,不就可以做成遙控小車了嗎? 點燈物聯控制小車的行駛方向 我們可以重新編輯點燈物聯APP中的設備控件界面,如…

自定義控件之動畫篇(六)——聯合動畫的代碼及xml實現

在Android中,聯合動畫(即組合多種類型的動畫)可以通過編寫Java/Kotlin代碼或XML資源文件來實現。這里我們將分別展示如何通過這兩種方式來實現一個簡單的自定義控件動畫,該動畫將包含平移和縮放效果。 1. XML 資源文件實現 首先…

AI學習指南機器學習篇-梯度提升樹模型應用與Python實踐

AI學習指南機器學習篇-梯度提升樹模型應用與Python實踐 機器學習領域中的梯度提升樹(Gradient Boosting Tree)模型是一種非常強大且廣泛應用的模型,它在各種數據類型和問題類型上都表現出色。在本篇博客中,我們將介紹如何使用Pyt…

開關電源中強制連續FCCM模式與輕載高效PSM,PFM模式優缺點對比筆記

文章目錄 前言一、連續FCCM模式優點:缺點: 二,輕載高效PSM,PFM優點:缺點: 總結 前言 今天我們來學習下開關電源中,強制連續FCCM模式與輕載高效PSM,PFM模式優缺點對比 一、連續FCCM模式 優點: …

mac中如何恢復因為破解腳本導致的IDEA無法啟動的問題

問題 為了在mac中安裝免費的2024版idea,導致下載了一個腳本,使用這個腳本后,但是發現idea還沒有破解,相反導致idea無法啟動,每次點擊,都會彈出“cannot start IDE…” 問題排查 在訪達中點擊mac的應用程…

docker -run hello-world超時

主要原因就是嘗試拉取庫的時候沒有從阿里云鏡像里拉&#xff0c;所以設置一下就好了 這里使用的是ubuntu系統&#xff08;命令行下逐行敲就行了&#xff09; sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": [&quo…

什么是生成式人工智能

什么是生成式人工智能 生成式人工智能生成式人工智能的特點生成式人工智能的工作原理生成式人工智能的類型生成式人工智能面臨的挑戰數據要求訓練復雜性控制輸出道德問題監管障礙 生成式人工智能 生成式人工智能是指旨在生成書面文本、音頻、圖像或視頻形式的新內容的人工智能…

Adobe Acrobat添加時間戳服務器

文章目錄 前言一、Adobe Acrobat添加時間戳服務器1.打開Adobe Acrobat軟件2.點擊【菜單】→ 【首選項】3.點擊【安全性】→【更多】4.點擊【新建】5.輸入【名稱】→【服務器URL】 前言 一、Adobe Acrobat添加時間戳服務器 1.打開Adobe Acrobat軟件 2.點擊【菜單】→ 【首選項…

模擬退火算法1——簡介

模擬退火算法來源于固體退火原理&#xff0c;將固體加溫至充分高&#xff0c;再讓其徐徐冷卻&#xff0c;加溫時&#xff0c;固體內部粒子隨溫升變為無序狀&#xff0c;內能增大&#xff0c;而徐徐冷卻時粒子漸趨有序&#xff0c;在每個溫度都達到平衡態&#xff0c;最后在常溫…

[C++][設計模式][訪問器]詳細講解

目錄 1.動機2.模式定義3.要點總結4.代碼感受1.代碼一2.代碼二 1.動機 在軟件構件過程中&#xff0c;由于需求的變化&#xff0c;某些類層次結構中常常需要增加新的行為(方法)&#xff0c;如果直接在基類中做這樣的更改&#xff0c; 將會給子類帶來很繁重的變更負擔&#xff0c…

加密基本知識:密鑰、簽名、證書

一、密碼(clpher) 是一種用于加密或者解密的算法 密碼學中的密碼&#xff08;cipher&#xff09;和我們日常生活中所說的密碼不太一樣&#xff0c;計算機術語『密碼 cipher』是一種用于加密或者解密的算法&#xff0c;而我們日常所使用的『密碼 password』是一種口令&#xff…

數據恢復篇:5 款最佳 Mac 數據恢復軟件

說到保護我們的數字生活&#xff0c;數據恢復軟件的重要性怎么強調都不為過。無論您是意外刪除了假期照片的普通用戶&#xff0c;還是面臨硬盤損壞的專業人士&#xff0c;隨之而來的恐慌都是普遍存在的。幸運的是&#xff0c;數據恢復工具可以緩解這些壓力。在Mac用戶可用的眾多…

搜維爾科技:使用Manus VR手套和ART光學追蹤功能實現虛擬場景工業仿真操作

&#xff1a;使用Manus VR手套和ART光學追蹤功能實現虛擬場景工業仿真操作 搜維爾科技&#xff1a;使用Manus VR手套和ART光學追蹤功能實現虛擬場景工業仿真操作

Android C++系列:JNI中的線程操作

Java中創建線程三種方式: 繼承Thread類創建線程類;通過Runnable接口創建線程類;通過Callable和Future創建線程。Native 中支持的線程標準是 POSIX 線程,它定義了一套創建和操作線程的 API 。 我們可以在 Native 代碼中使用 POSIX 線程,就相當于使用一個庫一樣,首先需要包…