国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

n階貝塞爾曲線(bezier)javascript 實現(xiàn)解析

Labradors / 2167人閱讀

摘要:最近學(xué)習(xí),看到曲線,所以補充了下知識,另外相關(guān)的數(shù)學(xué)定律都忘光了需要了解的前期需要了解相關(guān)的知識,可以看下維基百科什么是貝塞爾曲線什么是線性插值繪制本身只提供了二次和三次的繪制函數(shù),如果更高階級的怎么辦呢要對起進行降階拆分。

最近學(xué)習(xí)canvas,看到bezier曲線,所以補充了下知識,另外相關(guān)的數(shù)學(xué)定律都忘光了~

需要了解的

前期需要了解相關(guān)的知識,可以看下維基百科

什么是貝塞爾曲線?

什么是線性插值?

繪制

canvas本身只提供了二次和三次的繪制函數(shù),如果更高階級的怎么辦呢~要對起進行降階拆分。

網(wǎng)上有個很牛掰的案例 bezier curve

我們來看下這個案例的js,這個demo并沒有像我們的方程式寫的那樣來進行計算,但是它用了遞歸的操作,遞歸調(diào)用draw方法,來實現(xiàn)層層的繪制

var input = document.getElementsByTagName("input")[0]
var span = document.getElementsByTagName("span")[0]
var div = document.getElementsByTagName("div")[0]
var ctx1 = document.getElementsByTagName("canvas")[0].getContext("2d")
var ctx2 = document.getElementsByTagName("canvas")[1].getContext("2d")
var ctx3 = document.getElementsByTagName("canvas")[2].getContext("2d")

var points = [], colors = [], running = true, steps = 200, interval = 16, num

ctx1.font = "16px consolas"
ctx1.fillStyle = ctx1.strokeStyle = "hsl(0, 0%, 50%)"
ctx1.lineWidth = ctx2.lineWidth = 2
ctx3.strokeStyle = "hsl(0, 90%, 70%)"

function count() {
  num = parseInt(input.value)
  span.innerHTML = num
}

function toggle() {
  input.disabled = running = !running
}

function draw(per, arr, color) {
  var ary = []
  var node

  ctx2.strokeStyle = ctx2.fillStyle = colors[color]

  node = arr.reduce(function(previous, current, index) {
    // 從第二個元素開始,第二個點,這時候index為1,計算得到p點,index為1的時候,p點為bezier開始點到第一個控制點的插值
    // 第三個元素的時候,第三個點,index為2,計算得到p點,index為2的時候,p點為第一個控制點向第二個控制點移動的插值
    var p = {x: arr[index - 1].x + (arr[index].x - arr[index - 1].x) * per, y: arr[index - 1].y + (arr[index].y - arr[index - 1].y) * per}

    if(index > 1) {
      // 當(dāng)達到第二個控制點的時候,獲取從開始點到第一個控制點的p,進行l(wèi)ine
      ctx2.beginPath()
      ctx2.moveTo(previous.x, previous.y)
      ctx2.lineTo(p.x, p.y)
      ctx2.stroke()
      ctx2.closePath()
    }
    // 繪制當(dāng)前的插值點
    ctx2.beginPath()
    ctx2.arc(p.x, p.y, 3, 0, Math.PI * 2, true)
    ctx2.fill()
    ctx2.closePath()
    // 將坐標(biāo)點push到新的坐標(biāo)數(shù)組中
    ary.push(p)
    return p
  })

  if(ary.length > 1) {
    // 將插值作為新的開始點和控制點進行繪制,就這樣遞歸下去
    draw(per, ary, color + 1)
  } else {
    // 如果插值的數(shù)組只有1個值,繪制的就是bezier曲線上的點,從起點一點一點連到結(jié)束點
    ctx3.lineTo(node.x, node.y)
    ctx3.stroke()
  }
}

var drawAsync = eval(Wind.compile("async", function () {
  toggle()
  ctx3.beginPath()
  ctx3.moveTo(points[0].x, points[0].y)
  for(var i = 0; i <= steps; i++) {
    draw(i / steps, points, 0)
    $await(Wind.Async.sleep(interval))
    ctx2.clearRect(0, 0, 800, 600)
  }
  ctx3.closePath()
  points = []
  toggle()
}))

div.addEventListener("click", function(e) {
  if(running) {
    return
  }

  var point = {x: e.pageX - div.offsetLeft, y: e.pageY - div.offsetTop}

  if(points.length == 0) {
    ctx1.clearRect(0, 0, 800, 600)
    ctx2.clearRect(0, 0, 800, 600)
    ctx3.clearRect(0, 0, 800, 600)
  } else {
    ctx1.beginPath()
    ctx1.moveTo(point.x, point.y)
    ctx1.lineTo(points[points.length - 1].x, points[points.length - 1].y)
    ctx1.stroke()
    ctx1.closePath()
  }

  ctx1.beginPath()
  ctx1.fillText("[" + point.x + ", " + point.y + "]", 15, 25 * (points.length + 1))
  ctx1.arc(point.x, point.y, 4, 0, Math.PI * 2, true)
  ctx1.fill()
  ctx1.closePath()

  points.push(point)

  if(points.length == num) {
    drawAsync().start()
  }
}, false)

input.addEventListener("change", count, false)

window.addEventListener("load", function() {
  for(var i = 0; i < parseInt(input.max); i++) {
    colors[i] = "hsl(" + 60*(i + 1) + ", 60%, 60%)"
  }
  count()
  toggle()
}, false)
總結(jié)

讓我自己寫還真寫不出來。。。對array.reduce的用法真的爐火純青了

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22174.html

相關(guān)文章

  • n塞爾曲線bezierjavascript 實現(xiàn)解析

    摘要:最近學(xué)習(xí),看到曲線,所以補充了下知識,另外相關(guān)的數(shù)學(xué)定律都忘光了需要了解的前期需要了解相關(guān)的知識,可以看下維基百科什么是貝塞爾曲線什么是線性插值繪制本身只提供了二次和三次的繪制函數(shù),如果更高階級的怎么辦呢要對起進行降階拆分。 最近學(xué)習(xí)canvas,看到bezier曲線,所以補充了下知識,另外相關(guān)的數(shù)學(xué)定律都忘光了~ 需要了解的 前期需要了解相關(guān)的知識,可以看下維基百科 什么是貝塞爾曲...

    EastWoodYang 評論0 收藏0
  • 如何理解并應(yīng)用塞爾曲線

    摘要:動畫曲線的應(yīng)用了解了如何用貝塞爾曲線來指定動畫曲線后,很多動畫涉及到速度方面的效果就可以實現(xiàn)了,例如小車加速剎車,彈簧動畫等速度軌跡都可以根據(jù)自己的需要來進行定制。 貝塞爾曲線又叫貝茲曲線,在大學(xué)高數(shù)中一度讓我非常頭疼。前陣子練手寫動畫的時候,發(fā)現(xiàn)貝塞爾曲線可以應(yīng)用于軌跡的繪制以及定義動畫曲線。 本文就來探究一下,貝塞爾曲線到底是個什么樣的存在。 貝塞爾曲線原理 貝塞爾曲線由n個點來決...

    余學(xué)文 評論0 收藏0
  • 塞爾曲線算法之JS獲取點

    摘要:什么是貝塞爾曲線貝塞爾曲線,又稱貝茲曲線或貝濟埃曲線,是應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線。這個是三階貝塞爾曲線,同理,綠點有個,點與點之間都是按百分比運動,最終得到一個小黑點。同理,還有四階貝塞爾。我們看看中階貝塞爾曲線上獲取點的效果的地址 什么是貝塞爾曲線? 貝塞爾曲線(Bézier curve),又稱貝茲曲線或貝濟埃曲線,是應(yīng)用于二維圖形應(yīng)用程序的數(shù)學(xué)曲線。 showImg(htt...

    SQC 評論0 收藏0
  • 【前端優(yōu)化】動畫幾種實現(xiàn)方式總結(jié)和性能分析

    摘要:備注沒整理格式,抱歉動畫實現(xiàn)的幾種方式性能排序?qū)崿F(xiàn)方式自身調(diào)用調(diào)用的定時器值推薦最小使用的原因即每秒幀為什么倒計時動畫一定要用而避免使用兩者區(qū)別及引發(fā)的線程討論線程討論為什么單線程是的一大特性。 備注:沒整理格式,抱歉 動畫實現(xiàn)的幾種方式:性能排序js < requestAnimationFrame 3->4->2. 那么在來看你這段代碼。 var t = true; window...

    IamDLY 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<