<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
canvas{
position:absolute;
background: #fff;
}
div{
width:500px;
height:500px;
position: relative;
}
</style>
</head>
<body>
<div>
<canvas id="canvas" width="500" height="500"></canvas>
</div>
<script>
let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
const pos1 = [];
const pos2 = [];
init();//初始化畫布
function init(){//初始化畫布
ctx.font = "24px serif";
ctx.fillText('拉動(dòng)兩個(gè)控制點(diǎn)讲冠,改變曲線的形狀',50,50);
/* 曲線的兩個(gè)端點(diǎn) */
ctx.beginPath();
ctx.arc(300,300,10,0,Math.PI*2);
ctx.fill();
ctx.beginPath();
ctx.arc(100,100,10,0,Math.PI*2);
ctx.fill();
/* 控制點(diǎn)一 */
ctx.beginPath();
ctx.moveTo(100,100);
ctx.lineTo(200,100);
ctx.stroke();
ctx.beginPath();
let pos1x = 200;
let pos1y = 100;
ctx.arc(pos1x,pos1y,10,0,Math.PI*2);
ctx.fill();
pos1.push({pos1x,pos1y});
/* 控制點(diǎn)二 */
ctx.beginPath();
let pos2x = 200;
let pos2y = 300;
ctx.arc(200,300,10,0,Math.PI*2);
pos2.push({pos2x,pos2y});
ctx.fill();
ctx.beginPath();
ctx.moveTo(300,300);
ctx.lineTo(200,300);
ctx.stroke();
/* 曲線 */
ctx.beginPath();
ctx.moveTo(100,100);
ctx.bezierCurveTo(pos1[0].pos1x,pos1[0].pos1y,pos2[0].pos2x,pos2[0].pos2y,300,300);
ctx.stroke();
ctx.font='24px serif';
ctx.fillText('('+pos1[0].pos1x+','+pos1[0].pos1y+'),('+pos2[0].pos2x+','+pos2[0].pos2y+')',100,450);
}
/* 移動(dòng)控制點(diǎn) */
let div = document.querySelector('div');
div.onmousedown = function(ev){
/* console.log(ev.pageX,ev.pageY);
console.log(pos1[0].pos1x-5,pos1[0].pos1x+5);
console.log(pos1[0].pos1y-5,pos1[0].pos1y+5); */
if((ev.pageX>= pos1[0].pos1x-5 && ev.pageX<= pos1[0].pos1x+5) && (ev.pageY >= pos1[0].pos1y-5 && ev.pageY <= pos1[0].pos1y+5)){
document.onmousemove = function(ev){
pos1[0] = {pos1x:ev.pageX,pos1y:ev.pageY};
review();
}
document.onmouseup = function(ev){
document.onmousemove = null;
document.onmouseup = null;
}
}
if((ev.pageX>= pos2[0].pos2x-5 && ev.pageX<= pos2[0].pos2x+5) && (ev.pageY >= pos2[0].pos2y-5 && ev.pageY <= pos2[0].pos2y+5)){
document.onmousemove = function(ev){
pos2[0] = {pos2x:ev.pageX,pos2y:ev.pageY};
review();
}
document.onmouseup = function(ev){
document.onmousemove = null;
document.onmouseup = null;
}
}
}
/* 移動(dòng)后更新畫布 */
function review(){
ctx.clearRect(0,0,500,500);
ctx.font='24px serif';
ctx.fillText('拉動(dòng)兩個(gè)紅色的點(diǎn)倦踢,改變曲線的形狀',50,50);
ctx.moveTo(100,100);
ctx.bezierCurveTo(pos1[0].pos1x, pos1[0].pos1y, pos2[0].pos2x, pos2[0].pos2y, 300,300);
ctx.stroke();
ctx.beginPath();
ctx.arc(300,300,10,0,Math.PI*2);
ctx.fill();
ctx.beginPath();
ctx.arc(100,100,10,0,Math.PI*2);
ctx.fill();
ctx.beginPath();
ctx.moveTo(100,100);
ctx.lineTo(pos1[0].pos1x,pos1[0].pos1y);
ctx.stroke();
ctx.beginPath();
ctx.arc(pos1[0].pos1x,pos1[0].pos1y,10,0,Math.PI*2);
ctx.fill();
ctx.beginPath();
ctx.arc(pos2[0].pos2x,pos2[0].pos2y,10,0,Math.PI*2);
ctx.fill();
ctx.beginPath();
ctx.moveTo(300,300);
ctx.lineTo(pos2[0].pos2x,pos2[0].pos2y);
ctx.stroke();
ctx.font='24px serif';
ctx.fillText('('+pos1[0].pos1x+','+pos1[0].pos1y+'),('+pos2[0].pos2x+','+pos2[0].pos2y+')',100,450);
}
</script>
</body>
</html>
canvas繪制貝塞爾曲線
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門赎瑰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來王悍,“玉大人,你說我怎么就攤上這事餐曼⊙勾ⅲ” “怎么了鲜漩?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)集惋。 經(jīng)常有香客問我孕似,道長(zhǎng),這世上最難降的妖魔是什么刮刑? 我笑而不...
- 正文 為了忘掉前任喉祭,我火速辦了婚禮,結(jié)果婚禮上雷绢,老公的妹妹穿的比我還像新娘泛烙。我一直安慰自己,他們只是感情好翘紊,可當(dāng)我...
- 文/花漫 我一把揭開白布蔽氨。 她就那樣靜靜地躺著,像睡著了一般帆疟。 火紅的嫁衣襯著肌膚如雪鹉究。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼痘绎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了肖粮?” 一聲冷哼從身側(cè)響起孤页,我...
- 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涩馆,沒想到半個(gè)月后行施,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡魂那,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年蛾号,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涯雅。...
- 正文 年R本政府宣布,位于F島的核電站怒允,受9級(jí)特大地震影響埂软,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纫事,卻給世界環(huán)境...
- 文/蒙蒙 一勘畔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丽惶,春花似錦炫七、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至知纷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陵霉,已是汗流浹背琅轧。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像效床,于是被迫代替她去往敵國(guó)和親睹酌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- Canvas圖形繪制 <small>API參考</small> 開始創(chuàng)建路徑ctx.beginPath(),通過此...
- 拿到 UI 的第一時(shí)間就是哦買噶... 對(duì)著 UI 想了半天, 這曲線怎么畫, 圓心怎么找, 弧度怎么算.... ...
- 上一篇中我簡(jiǎn)單的介(粘)紹(貼)了一下貝塞爾曲線(Bezier)曲線的原理和公式,但是作為數(shù)學(xué)界排的上名號(hào)的渣渣,...
- 背景: 給一系列頂點(diǎn)沪猴,如果只是用直線將其中的各個(gè)點(diǎn)依次連接起來辐啄,最終形成一個(gè)折線圖,這種很容易實(shí)現(xiàn)运嗜。但是現(xiàn)實(shí)...
- 寫在最前 由于原生的Canvas最高只支持到三階貝塞爾曲線壶辜,那么我想添加多個(gè)控制點(diǎn)怎么辦呢?(即便大部分復(fù)雜曲線都...