校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > canvas里面如何基于隨機點繪制一個多邊形的方法

canvas里面如何基于隨機點繪制一個多邊形的方法

熱門標簽:黃島區地圖標注 電銷機器人電話用什么卡 成都智能外呼系統平臺 鎮江智能外呼系統有效果嗎 云南大理400電話申請官方 南寧點撥外呼系統哪家公司做的好 四川點撥外呼系統 當涂高德地圖標注 江蘇智能電銷機器人哪家好

起因

今天在學習《HTML5+Javascript動畫基礎》這本書的時候,在第八章的第三節講到如何用三個彈簧連接三個點來做拉伸運動。

在做完例子之后,就想到如果是四個點,五個點,怎么樣。

就改寫了一下代碼,把點的數目變量化。最終的效果是能實現各個點最終的拉伸運動到平衡,可是點之間的連線不是很好看,有些是交叉的。

于是就想著能不能優化這一塊。

旋轉連線

前面例子里面的點,都是隨機位置,所以連線不可控。所以想先從這塊著手。

先以某一個點為參照點,獲得其他點相對于這個點的角度。

然后按照角度從小到大的去連接這些點,這樣就能畫出一個正常的多邊形了。

大致實現代碼如下:

let balls = [];
let ballNum = 6;
let firstBall = null;
while(ballNum--) {
  let ball = new Ball(20, parseColor(Math.random() * 0xffffff))
  ball.x = Math.random() * width;
  ball.y = Math.random() * height;
  balls.push(ball)

  if (!firstBall) {
    firstBall = ball
    ball.angle = 0
  } else {
    const dx = ball.x - firstBall.x,
          dy = ball.y - firstBall.y;

    ball.angle = Math.atan2(dy, dx);
  }
}

// 嘗試讓球連線是一個正多邊形
balls = balls.sort((ballA, ballB) => {
  return ballA.angle - ballB.angle
})

這樣在最后繪制連線的時候,遍歷數組就能按照角度從小到大來繪制了。

效果如下:

這樣是能極大的減少交叉線的情況,可還是無法完全避免。

接下來,想嘗試優化這個方案,比如angle用Math.abs來取正,或者每一個點都找夾角最小的點來連線。可是結果都不行,無法避免交叉線。

基于中心點旋轉

后面又想到一個思路,如果能確定多邊形的中心點,那么分別計算所有點相對于中心點的夾角,就能以順時針或者逆時針來連接這些點。

可是在網上找了半天,所有點算法里面,都是要求有一系列按某個時針順序排列的點。

可是如果我有這些點,就已經能繪制多邊形了。只好放棄

X軸兩極點分割

無奈之下只好找Google,然后就發現了知乎上的一個答案挺好的: 如何將平面上無序的一組點連成一個簡單多邊形?

具體算法描述,大家看那個答案就好,我就不贅述了。

不過在連接上鏈和下鏈的時候,其實只要保證上鏈是X軸降序連接,下鏈是X軸升序連接即可(以逆時針方向繪制)。至于X軸相同的點,不管是優先Y軸大的還是小的都可以。

實現的時候,是嚴格按照答案里面的算法實現的。

在判斷一個點是屬于上鏈還是下鏈的時候,一開始想的是基于兩點確定直線的函數方程,再引入點的坐標來計算。不過后面想到,所有的點都以最左邊的極點來計算斜角,然后根據角度大小來劃分,視覺上更好理解。

大致代碼如下:

let balls = [];
let tempBalls = [];
let ballNum = 6;
let isDragingBall = false;

while(ballNum--) {
  let ball = new Ball(10, parseColor(Math.random() * 0xffffff))
  ball.x = Math.random() * width;
  ball.y = Math.random() * height;
  tempBalls.push(ball)
}

// 讓點按X軸升序排序
tempBalls = tempBalls.sort((ballA, ballB) => {
  return ballA.x - ballB.x
})

// 找X軸左右極點
let firstBall = tempBalls[0],
    lastBall = tempBalls[tempBalls.length -1];
let smallXBalls = tempBalls.filter(ball => ball.x === firstBall.x),
    bigXBalls = tempBalls.filter(ball => ball.x === lastBall.x)

// 處理左右極點有多個的情況
if (smallXBalls.length > 1) {
  smallXBalls.sort((ballA, ballB) => {
    return ballB.y - ballA.y
  })
}
if (bigXBalls.length > 1) {
  bigXBalls.sort((ballA, ballB) => {
    return ballB.y - ballA.y
  })
}

firstBall = smallXBalls[0]
lastBall = bigXBalls[0]

// 獲得極點連線的角度
let splitLineAngle = Math.atan2(lastBall.y - firstBall.y, lastBall.x - firstBall.x);
let upperBalls = [],
    lowerBalls = [];

// 所有其他點跟firstBall計算角度
// 大于splitLineAngle的都是下鏈
// 其他是上鏈
tempBalls.forEach(ball => {
  if (ball === firstBall || ball === lastBall) {
    return false
  }
  let angle = Math.atan2(ball.y - firstBall.y, ball.x - firstBall.x);
  if (angle > splitLineAngle) {
    lowerBalls.push(ball)
  } else {
    upperBalls.push(ball)
  }
})

// 處理X軸相同情況的排序
lowerBalls = lowerBalls.sort((ballA, ballB) => {
  if (ballA.x !== ballB.x) {
    return ballA.x - ballB.x
  }
  return ballB.y - ballA.y
})

upperBalls = upperBalls.sort((ballA, ballB) => {
  if (ballA.x !== ballB.x) {
    return ballB.x - ballA.x
  }
  return ballB.y - ballB.x
})

// 逆時針連接所有的點
balls = [firstBall].concat(lowerBalls, [lastBall], upperBalls)

balls = balls.map((ball, i) => {
  ball.text = i + 1;
  return ball
})

最終返回的balls,就是按逆時針排序的多邊形的點了。

效果如下:

各個球的內部狀態如下:

 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:十堰 酒泉 佳木斯 廣西 淮安 南京 咸寧 西寧

巨人網絡通訊聲明:本文標題《canvas里面如何基于隨機點繪制一個多邊形的方法》,本文關鍵詞  canvas,里面,如何,基于,隨機,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《canvas里面如何基于隨機點繪制一個多邊形的方法》相關的同類信息!
  • 本頁收集關于canvas里面如何基于隨機點繪制一個多邊形的方法的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产精品女同一区二区三区| 亚洲mv在线观看| 91精品国产aⅴ一区二区| 久久亚洲精华国产精华液| 亚洲午夜免费视频| 福利91精品一区二区三区| 精品国产乱码久久久久久浪潮| 日韩激情一区二区| 91精品福利在线| 香蕉成人伊视频在线观看| 在线观看亚洲精品视频| 一色屋精品亚洲香蕉网站| 国产精品白丝jk白祙喷水网站| 波多野洁衣一区| 亚洲欧美偷拍卡通变态| 在线观看av一区| 婷婷丁香激情综合| 日韩你懂的在线观看| 大白屁股一区二区视频| 亚洲一区二区三区自拍| 欧美最猛性xxxxx直播| 一区二区三区不卡视频| 日韩一区二区免费在线电影 | 日本韩国欧美在线| 午夜天堂影视香蕉久久| 中文字幕免费在线观看视频一区| www.欧美色图| 水野朝阳av一区二区三区| 日韩欧美综合一区| 国产激情91久久精品导航| 亚洲va中文字幕| 亚洲国产高清在线| 欧美影视一区在线| 国产精品综合二区| 亚洲免费成人av| 亚洲精品乱码久久久久久久久 | 美美哒免费高清在线观看视频一区二区| 亚洲成人一区二区| 九九在线精品视频| 国产91精品露脸国语对白| 国产一区欧美二区| 9l国产精品久久久久麻豆| 日本韩国视频一区二区| 精品国内二区三区| 亚洲精品伦理在线| 国产福利精品一区| 日本高清无吗v一区| 日韩一区二区麻豆国产| 国产精品久久久久久久久晋中 | 日日欢夜夜爽一区| 不卡视频在线观看| 欧美v亚洲v综合ⅴ国产v| 亚洲精品网站在线观看| 国精产品一区一区三区mba视频| 99久久夜色精品国产网站| 日韩免费一区二区| 日韩一区精品视频| 色噜噜狠狠一区二区三区果冻| 久久这里只精品最新地址| 婷婷久久综合九色综合绿巨人 | 极品销魂美女一区二区三区| 色天天综合久久久久综合片| 国产精品色在线| 免费不卡在线观看| 欧美少妇bbb| 樱花影视一区二区| 色94色欧美sute亚洲线路一ni| 亚洲精品在线免费播放| 国产精品18久久久久久久网站| 88在线观看91蜜桃国自产| 日日摸夜夜添夜夜添亚洲女人| 欧美日韩精品一区二区| 美女一区二区三区在线观看| 欧美一卡二卡在线观看| 国产伦精品一区二区三区在线观看| 欧美一区二区三区不卡| 国产综合色视频| 亚洲视频免费观看| 欧美日本一道本| 国产原创一区二区三区| 国产精品久久久久久久岛一牛影视| 91丝袜美女网| 免费成人在线观看视频| 欧美激情在线一区二区| 欧美自拍丝袜亚洲| 东方aⅴ免费观看久久av| 亚洲激情图片qvod| 日韩视频在线观看一区二区| 国产福利一区二区三区视频| 亚洲女性喷水在线观看一区| 日韩一区二区电影在线| 精品一二线国产| 亚洲精品v日韩精品| 久久这里只有精品视频网| 欧美在线影院一区二区| 丁香五精品蜜臀久久久久99网站| 奇米777欧美一区二区| 综合久久给合久久狠狠狠97色| 日韩精品一区二| 91精品国产高清一区二区三区| 91久久精品一区二区三区| 国产黄色精品网站| 国产一区二区三区久久悠悠色av| 日本成人超碰在线观看| 亚洲第一激情av| 亚洲免费观看高清| 成人免费在线播放视频| 国产精品国产三级国产普通话99 | 欧美国产精品专区| 精品国产三级电影在线观看| 91精品国产综合久久婷婷香蕉 | 亚洲日本电影在线| 欧美激情在线看| 国产精品传媒入口麻豆| 久久精品亚洲乱码伦伦中文| 欧美精品一区二区在线播放| 欧美一区二区成人6969| 99久久综合狠狠综合久久| 韩国女主播成人在线| 亚洲一区二区三区中文字幕| 日韩电影一区二区三区| 黄色小说综合网站| 91视频免费播放| 69久久99精品久久久久婷婷| 欧美精品久久天天躁| 欧美电影一区二区| 欧美色视频一区| 日韩免费电影一区| 日韩一级完整毛片| 日韩亚洲欧美中文三级| 国产日韩成人精品| 亚洲一区影音先锋| 国产自产2019最新不卡| 欧美日韩一卡二卡三卡| 日韩女优电影在线观看| 91精品国产91久久久久久最新毛片| 在线播放欧美女士性生活| 国产亚洲短视频| 青青国产91久久久久久| 韩国v欧美v亚洲v日本v| 精品视频一区二区三区免费| 中文字幕一区二区三区在线不卡| 精品一区二区精品| 久久综合色综合88| 久久超级碰视频| 欧美一级高清大全免费观看| 亚洲最大的成人av| 91黄色在线观看| 亚洲四区在线观看| 91麻豆免费看| 综合婷婷亚洲小说| 91国产成人在线| 一区二区三区欧美亚洲| 欧美在线高清视频| 亚洲超碰97人人做人人爱| 91成人在线免费观看| 一区二区三区在线观看动漫| 91污片在线观看| 亚洲高清中文字幕| 99久久99久久久精品齐齐| 日韩码欧中文字| 欧美体内she精视频| 五月婷婷另类国产| 91国产精品成人| 亚洲1区2区3区视频| 欧美日韩中文精品| 国模冰冰炮一区二区| 国产亚洲综合色| 欧美在线色视频| 亚洲综合色婷婷| 久久一区二区视频| 在线视频你懂得一区二区三区| 五月激情综合色| 久久久精品tv| 欧美性视频一区二区三区| 久久精品99久久久| 亚洲午夜在线电影| 久久综合丝袜日本网| 欧美一区二区免费视频| 老司机精品视频一区二区三区| 国产精品美女久久久久aⅴ | 色哟哟国产精品| 国产在线精品一区在线观看麻豆| 亚洲国产精品t66y| 国产日韩av一区二区| 337p亚洲精品色噜噜| 在线观看欧美精品| 国产成人精品一区二区三区网站观看| 一区二区三区免费在线观看| 国产三级欧美三级日产三级99| 9191成人精品久久| 欧美福利一区二区| 欧美日韩视频在线第一区| av毛片久久久久**hd| 99久久久免费精品国产一区二区 | 99在线视频精品| 色婷婷国产精品久久包臀| 在线观看成人小视频| 欧美性猛交xxxxxx富婆| 欧美少妇xxx|