天天看點

js實作三次bezier曲線的拼接

要實作bezier曲線的拼接首先要實作bezier曲線的繪制。繪制有兩個方法:

  1. 利用bezier曲線的定義寫算法,生成bezier曲線。

有興趣的同學可以進去看看:

[一次二次三次bezier曲線的計算方式及demo示範] (https://blog.csdn.net/cdnight/article/details/48494533)

  1. 直接利用HTML5中的canvas标簽,路徑裡有個bezierCurveTo方法,利用這個方法,隻要輸入四個控制點的坐标就能生成一條bezier曲線,非常簡單,是以我這裡用的就是這個方法。

有興趣的同學可以進去看看:

[bezierCurveto方法的用法] (http://www.w3school.com.cn/tags/canvas_beziercurveto.asp)

繪制兩條曲線之後就可以判斷條件進行拼接了

代碼:

<!DOCTYPE html>
  <html> 
  <head>  
   <meta charset="UTF-8">  
    <title>bezier</title>   <style type="text/css">    /*hidden透明邊框*/    #hh{     width: 1500px;     height: 1500px;     border: 1px solid hidden;         }    #cout{     width: 800px;     height: 230px;     border: 1px solid hidden;     float: left;    }    .b{     width: 390px;     height: 190px;     border: 1px solid hidden;     float: left;    }     #bd{     width: 800px;     height: 25px;     border: 1px solid hidden;     position: absolute;     left: 0px;     top: 200px;              }    #huabu{     width: 1010px;     height:1010px;     border: 1px solid hidden;     float: left; /*    position: relative;     left: 5px;     top: 205px;*/       } /*   #c2{ /*    position: relative;     left: 410px;     top: 0px;*/     float: left;    } */   </style>
  
 </head>
<!--描出4個控制點-->
 <body> <div id="hh">
  <!--1、輸入資料-->
  <div id="cout">
   <div class="b">
   <h3>第一條bezier曲線</h3>
   起&nbsp;&nbsp;&nbsp;點:<input maxlength="4" value="0" id="x1" />,<input maxlength="4" value="0" id="y1" /> <br />
    第二點:<input maxlength="4" value="300" id="x2" />,<input maxlength="4" value="0" id="y2" /> <br /> 
    第三點:<input maxlength="4" value="0" id="x3" />,<input maxlength="4" value="300" id="y3" /> <br /> 
    終&nbsp;&nbsp;&nbsp;點:<input maxlength="4" value="300" id="x4" />,<input maxlength="4" value="300" id="y4" /> <br />
   
    <div align="center">
     <input type="button" id="btn"  value="路徑填充1" onclick="cs('x1','y1','x2','y2','x3','y3','x4','y4')" />
    </div>
   </div>
   
   <div class="b">
   <h3>第二條bezier曲線</h3>
   起&nbsp;&nbsp;&nbsp;點:<input maxlength="4" value="400" id="xx1" />,<input maxlength="4" value="400" id="yy1" /> <br />
    第二點:<input maxlength="4" value="700" id="xx2" />,<input maxlength="4" value="400" id="yy2" /> <br /> 
    第三點:<input maxlength="4" value="500" id="xx3" />,<input maxlength="4" value="300" id="yy3" /> <br /> 
    終&nbsp;&nbsp;&nbsp;點:<input maxlength="4" value="750" id="xx4" />,<input maxlength="4" value="800" id="yy4" /> <br />
   
    <div align="center">
     <input type="button" id="btnn"  value="路徑填充2" onclick="cs2('xx1','yy1','xx2','yy2','xx3','yy3','xx4','yy4')" />
    </div>
   </div> 
   <!--拼接按鈕-->
   <div id="bd" align="center" >  <input type="button" id="bb" value="拼接" 
    onclick="tran('xx1','yy1','xx2','yy2','xx3','yy3','xx4','yy4','x4','y4','x3','y3')"
    style="width: 125px;height: 25px;background-color: #00A3FF;color: white;border-radius: 8px;"/></div>
  </div>
  
  <!--2、定義兩塊畫布-->
  <div id="huabu">
   <div class="canvas" id="c1">
    <canvas id="myCanvas" width="1000" height="1000" style="border:1px solid darkslategray;">
   Your browser does not support the HTML5 canvas tag.</canvas>
   </div>
<!--   <div class="canvas" id="c2">
    <canvas id="myCanvass" width="400" height="400" style="border:1px solid dimgray;">
   Your browser does not support the HTML5 canvas tag.</canvas>
   </div>-->
  </div>
 </div>
  <script>
   function cs(x1, y1, x2, y2, x3, y3, x4, y4) {
    
    var x1 = document.getElementById(x1).value;
    var x2 = document.getElementById(x2).value;
    var x3 = document.getElementById(x3).value;
    var x4 = document.getElementById(x4).value;
    var y1 = document.getElementById(y1).value;
    var y2 = document.getElementById(y2).value;
    var y3 = document.getElementById(y3).value;
    var y4 = document.getElementById(y4).value;    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");
    
    //繪制四點
    ctx.beginPath();
    ctx.arc(x1,y1,2,0,2*Math.PI);
    ctx.fill();
    ctx.stroke();
    
    ctx.beginPath();
    ctx.arc(x2,y2,2,0,2*Math.PI);
    ctx.fill();
    ctx.stroke();
    
    ctx.beginPath();
    ctx.arc(x3,y3,2,0,2*Math.PI);
    ctx.fill();
    ctx.stroke();
    
    ctx.beginPath();
    ctx.arc(x4,y4,2,0,2*Math.PI);
    ctx.fill();
    ctx.stroke();
    
    
    
    
    ctx.beginPath();
    ctx.moveTo(x1, y1);
    ctx.bezierCurveTo(x2, y2, x3, y3, x4, y4);
    ctx.strokeStyle = "black";
    ctx.stroke();/*    ctx.beginPath();
    ctx.moveTo(300, 200);
    ctx.bezierCurveTo(10, 10, 320, 320, 400, 400);
    ctx.strokeStyle = "yellowgreen";
    ctx.stroke();*/   }
   
   /*xx1, yy1, xx2, yy2, xx3, yy3, xx4, yy4*/
   function cs2(xx1, yy1, xx2, yy2, xx3, yy3, xx4, yy4,x4,y4){
    var xx1 = document.getElementById(xx1).value;
    var xx2 = document.getElementById(xx2).value;
    var xx3 = document.getElementById(xx3).value;
    var xx4 = document.getElementById(xx4).value;
    var yy1 = document.getElementById(yy1).value;
    var yy2 = document.getElementById(yy2).value;
    var yy3 = document.getElementById(yy3).value;
    var yy4 = document.getElementById(yy4).value;    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");
    
    //繪制四個點 
    ctx.beginPath();
    ctx.arc(xx1,xx1,2,0,2*Math.PI);
    ctx.strokeStyle="red";
    ctx.fill();
    ctx.stroke();
    
    ctx.beginPath();
    ctx.arc(xx2,yy2,2,0,2*Math.PI);
    ctx.fill();
    ctx.stroke();
    
    ctx.beginPath();
    ctx.arc(xx3,yy3,2,0,2*Math.PI);
    ctx.fill();
    ctx.stroke();
    
    ctx.beginPath();
    ctx.arc(xx4,yy4,2,0,2*Math.PI);
    ctx.fill();
    ctx.stroke();
    
    
    ctx.beginPath();
    ctx.moveTo(xx1, yy1);
    ctx.bezierCurveTo(xx2, yy2, xx3, yy3, xx4, yy4);
    ctx.strokeStyle = "yellowgreen";
    ctx.lineWidth="2";    
    ctx.stroke();
    
    
   }
   
   //拼接   按鈕id="bb" 函數:tran
   function tran(xx1, yy1, xx2, yy2, xx3, yy3, xx4, yy4,x4,y4,x3,y3){
   
    //alert('hello')
    
    var x3 = document.getElementById(x3).value;
    var y3 = document.getElementById(y3).value;
    var x4 = document.getElementById(x4).value;
    var y4 = document.getElementById(y4).value;
        
    var xx1 = document.getElementById(xx1).value;
    var xx2 = document.getElementById(xx2).value;
    var xx3 = document.getElementById(xx3).value;
    var xx4 = document.getElementById(xx4).value;
    var yy1 = document.getElementById(yy1).value;
    var yy2 = document.getElementById(yy2).value;
    var yy3 = document.getElementById(yy3).value;
    var yy4 = document.getElementById(yy4).value;    var x=x4-xx1;
    var y=y4-yy1;
    var a=(y3-y4)/(x3-x4);
    var b=(yy1-yy2)/(xx1-xx2);
     if(a!=b){alert("拼接條件不滿足,不能進行拼接")}
    else{
    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");
    ctx.beginPath();
    ctx.moveTo(xx1, yy1);
    ctx.bezierCurveTo(xx2, yy2, xx3, yy3, xx4, yy4);
    ctx.strokeStyle = "hidden";
    ctx.stroke();
    
    ctx.beginPath();
    ctx.translate(x,y);
    ctx.moveTo(xx1, yy1);
    ctx.bezierCurveTo(xx2, yy2, xx3, yy3, xx4, yy4);
    ctx.lineWidth="2";
    ctx.strokeStyle = "yellowgreen";
    ctx.stroke(); 
 
   }}
  </script> </body></html>
           

第一篇部落格,這是一個課程設計題目,本來想到網上找的,無奈網上實在沒找到,後面隻好自己做,後面做的過程發現還蠻有趣的,特别是剛剛做完的那一瞬間,我感覺自己無所不能。許多地方也還有待完善 ,時間關系,就先這樣了。

good night 2018.12.31 0:41 天氣:大雪