整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          HTML5特效庫 canvas粒子噴射特效源碼

          HTML5特效庫 canvas粒子噴射特效源碼

          果圖

          各位朋友大家好,

          今天給大家帶來的是 canvas粒子噴射特效源碼!

          有想要文件版源碼的可以私聊小編哦!

          廢話不多說,上源碼

          JS:

          /*

          Copyright (c) 2014 dissimulate at codepen

          Permission is hereby granted, free of charge, to any person obtaining

          a copy of this software and associated documentation files (the "Software"),

          to deal in the Software without restriction, including without limitation

          the rights to use, copy, modify, merge, publish, distribute, sublicense,

          and/or sell copies of the Software, and to permit persons to whom the

          Software is furnished to do so, subject to the following conditions:

          The above copyright notice and this permission notice shall be included

          in all copies or substantial portions of the Software.

          THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS

          OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

          FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

          AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

          LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

          FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS

          IN THE SOFTWARE.

          */

          window.requestAnimFrame=

          window.requestAnimationFrame ||

          window.webkitRequestAnimationFrame ||

          window.mozRequestAnimationFrame ||

          window.oRequestAnimationFrame ||

          window.msRequestAnimationFrame ||

          function(callback) {

          window.setTimeout(callback, 1000 / 60);

          };

          var canvas=document.getElementById('c');

          var ctx=canvas.getContext('2d');

          canvas.width=window.innerWidth;

          canvas.height=window.innerHeight;

          var settings={

          'basic': {

          'emission_rate': 100,

          'min_life': 2,

          'life_range': 2,

          'min_angle': 75,

          'angle_range': 30,

          'min_speed': 80,

          'speed_range': 60,

          'min_size': 2,

          'size_range': 4,

          'start_colours': [

          [130, 196, 245, 0.8],

          [69, 152, 212, 0.8]

          ],

          'end_colours': [

          [130, 196, 245, 0],

          [69, 152, 212, 0]

          ],

          'gravity': {

          x: 0,

          y: 80

          }

          }

          };

          var Particle=function(x, y, angle, speed, life, size, start_colour, colour_step) {

          /* the particle's position */

          this.pos={

          x: x || 0,

          y: y || 0

          };

          /* set specified or default values */

          this.speed=speed || 5;

          this.life=life || 1;

          this.size=size || 2;

          this.lived=0;

          /* the particle's velocity */

          var radians=angle * Math.PI / 180;

          this.vel={

          x: Math.cos(radians) * speed,

          y: -Math.sin(radians) * speed

          };

          /* the particle's colour values */

          this.colour=start_colour;

          this.colour_step=colour_step;

          };

          var Emitter=function(x, y, settings) {

          /* the emitter's position */

          this.pos={

          x: x,

          y: y

          };

          /* set specified values */

          this.settings=settings;

          /* How often the emitter needs to create a particle in milliseconds */

          this.emission_delay=1000 / settings.emission_rate;

          /* we'll get to these later */

          this.last_update=0;

          this.last_emission=0;

          /* the emitter's particle objects */

          this.particles=[];

          };

          Emitter.prototype.update=function() {

          /* set the last_update variable to now if it's the first update */

          if (!this.last_update) {

          this.last_update=Date.now();

          return;

          }

          /* get the current time */

          var time=Date.now();

          /* work out the milliseconds since the last update */

          var dt=time - this.last_update;

          /* add them to the milliseconds since the last particle emission */

          this.last_emission +=dt;

          /* set last_update to now */

          this.last_update=time;

          /* check if we need to emit a new particle */

          if (this.last_emission > this.emission_delay) {

          /* find out how many particles we need to emit */

          var i=Math.floor(this.last_emission / this.emission_delay);

          /* subtract the appropriate amount of milliseconds from last_emission */

          this.last_emission -=i * this.emission_delay;

          while (i--) {

          /* calculate the particle's properties based on the emitter's settings */

          var start_colour=this.settings.start_colours[Math.floor(this.settings.start_colours.length * Math.random())];

          var end_colour=this.settings.end_colours[Math.floor(this.settings.end_colours.length * Math.random())];

          var life=this.settings.min_life + Math.random() * this.settings.life_range;

          var colour_step=[

          (end_colour[0] - start_colour[0]) / life, /* red */ (end_colour[1] - start_colour[1]) / life, /* green */ (end_colour[2] - start_colour[2]) / life, /* blue */ (end_colour[3] - start_colour[3]) / life /* alpha */

          ];

          this.particles.push(

          new Particle(

          0,

          0,

          this.settings.min_angle + Math.random() * this.settings.angle_range,

          this.settings.min_speed + Math.random() * this.settings.speed_range,

          life,

          this.settings.min_size + Math.random() * this.settings.size_range,

          start_colour.slice(),

          colour_step

          )

          );

          }

          }

          /* convert dt to seconds */

          dt /=1000;

          /* loop through the existing particles */

          var i=this.particles.length;

          while (i--) {

          var particle=this.particles[i];

          /* skip if the particle is dead */

          if (particle.dead) {

          /* remove the particle from the array */

          this.particles.splice(i, 1);

          continue;

          }

          /* add the seconds passed to the particle's life */

          particle.lived +=dt;

          /* check if the particle should be dead */

          if (particle.lived >=particle.life) {

          particle.dead=true;

          continue;

          }

          /* calculate the particle's new position based on the forces multiplied by seconds passed */

          particle.vel.x +=this.settings.gravity.x * dt;

          particle.vel.y +=this.settings.gravity.y * dt;

          particle.pos.x +=particle.vel.x * dt;

          particle.pos.y +=particle.vel.y * dt;

          /* draw the particle */

          particle.colour[0] +=particle.colour_step[0] * dt;

          particle.colour[1] +=particle.colour_step[1] * dt;

          particle.colour[2] +=particle.colour_step[2] * dt;

          particle.colour[3] +=particle.colour_step[3] * dt;

          ctx.fillStyle='rgba(' +

          Math.round(particle.colour[0]) + ',' +

          Math.round(particle.colour[1]) + ',' +

          Math.round(particle.colour[2]) + ',' +

          particle.colour[3] + ')';

          var x=this.pos.x + particle.pos.x;

          var y=this.pos.y + particle.pos.y;

          ctx.beginPath();

          ctx.arc(x, y, particle.size, 0, Math.PI * 2);

          ctx.fill();

          }

          };

          var emitter=new Emitter(canvas.width / 2, canvas.height / 2, settings.basic);

          function loop() {

          ctx.clearRect(0, 0, canvas.width, canvas.height);

          emitter.update();

          requestAnimFrame(loop);

          }

          loop();

          天學習了HTML5 Canvas粒子動畫,這效果真的挺好看的。是一款基于HTML5 Canvas的圖片粒子沙漏動畫,主要是將一張圖片打散成粒子,然后模擬沙漏將圖片粒子掉落下來。

          效果圖

          代碼:

          CSS:

          部分JavaScript代碼:

          . 引言

          粒子群優化算法(PSO)是一種進化計算技術(evolutionary computation),由Eberhart博士和kennedy博士發明。源于對鳥群捕食的行為研究。

          PSO同遺傳算法類似,是一種基于迭代的優化工具。系統初始化為一組隨機解,通過迭代搜尋最優值。但是并沒有遺傳算法用的交叉(crossover)以及變異(mutation)。而是粒子在解空間追隨最優的粒子進行搜索。詳細的步驟后面的章節介紹。

          同遺傳算法比較,PSO的優勢在于簡單容易實現并且沒有許多參數需要調整。目前已廣泛應用于函數優化,神經網絡訓練,模糊系統控制以及其他遺傳算法的應用領域。

          2.背景:人工生命

          "人工生命"是來研究具有某些生命基本特征的人工系統。人工生命包括兩方面的內容:

          1. 研究如何利用計算技術研究生物現象

          2. 研究如何利用生物技術研究計算問題

          我們現在關注的是第二部分的內容. 現在已經有很多源于生物現象的計算技巧. 例如, 人工神經網絡是簡化的大腦模型. 遺傳算法是模擬基因進化過程的。

          現在我們討論另一種生物系統- 社會系統. 更確切的是, 在由簡單個體組成的群落與環境以及個體之間的互動行為. 也可稱做"群智能"(swarm intelligence). 這些模擬系統利用局部信息從而可能產生不可預測的群體行為。

          例如floys 和 boids, 他們都用來模擬魚群和鳥群的運動規律, 主要用于計算機視覺和計算機輔助設計.

          在計算智能(computational intelligence)領域有兩種基于群智能的算法. 蟻群算法(ant colony optimization)和粒子群算法(particle swarm optimization). 前者是對螞蟻群落食物采集過程的模擬. 已經成功運用在很多離散優化問題上.

          粒子群優化算法(PSO) 也是起源對簡單社會系統的模擬. 最初設想是模擬鳥群覓食的過程. 但后來發現PSO是一種很好的優化工具.

          3.算法介紹

          如前所述,PSO模擬鳥群的捕食行為。設想這樣一個場景:一群鳥在隨機搜索食物。在這個區域里只有一塊食物。所有的鳥都不知道食物在那里。但是他們知道當前的位置離食物還有多遠。那么找到食物的最優策略是什么呢。最簡單有效的就是搜尋目前離食物最近的鳥的周圍區域。

          PSO從這種模型中得到啟示并用于解決優化問題。PSO中,每個優化問題的解都是搜索空間中的一只鳥。我們稱之為"粒子"。所有的例子都有一個由被優化的函數決定的適應值(fitness value),每個粒子還有一個速度決定他們飛翔的方向和距離。然后粒子們就追隨當前的最優粒子在解空間中搜索

          PSO 初始化為一群隨機粒子(隨機解)。然后通過疊代找到最優解。在每一次疊代中,粒子通過跟蹤兩個"極值"來更新自己。第一個就是粒子本身所找到的最優解。這個解叫做個體極值pBest. 另一個極值是整個種群目前找到的最優解。這個極值是全局極值gBest。另外也可以不用整個種群而只是用其中一部分最為粒子的鄰居,那么在所有鄰居中的極值就是局部極值。

          程序的偽代碼如下:

          在每一維粒子的速度都會被限制在一個最大速度Vmax,如果某一維更新后的速度超過用戶設定的Vmax,那么這一維的速度就被限定為Vmax

          4.遺傳算法和PSO的比較

          大多數演化計算技術都是用同樣的過程

          1. 種群隨機初始化

          2. 對種群內的每一個個體計算適應值(fitness value).適應值與最優解的距離直接有關

          3. 種群根據適應值進行復制

          4. 如果終止條件滿足的話,就停止,否則轉步驟2

          從以上步驟,我們可以看到PSO和GA有很多共同之處。兩者都隨機初始化種群,而且都使用適應值來評價系統,而且都根據適應值來進行一定的隨機搜索。兩個系統都不是保證一定找到最優解

          但是,PSO 沒有遺傳操作如交叉(crossover)和變異(mutation). 而是根據自己的速度來決定搜索。粒子還有一個重要的特點,就是有記憶。

          與遺傳算法比較, PSO 的信息共享機制是很不同的. 在遺傳算法中,染色體(chromosomes) 互相共享信息,所以整個種群的移動是比較均勻的向最優區域移動. 在PSO中, 只有gBest (or lBest) 給出信息給其他的粒子, 這是單向的信息流動. 整個搜索更新過程是跟隨當前最優解的過程. 與遺傳算法比較, 在大多數的情況下,所有的粒子可能更快的收斂于最優解

          5.人工神經網絡PSO

          人工神經網絡(ANN)是模擬大腦分析過程的簡單數學模型,反向轉播算法是最流行的神經網絡訓練算法。進來也有很多研究開始利用演化計算(evolutionary computation)技術來研究人工神經網絡的各個方面。

          演化計算可以用來研究神經網絡的三個方面:網絡連接權重,網絡結構(網絡拓撲結構,傳遞函數),網絡學習算法。

          不過大多數這方面的工作都集中在網絡連接權重,和網絡拓撲結構上。在GA中,網絡權重和/或拓撲結構一般編碼為染色體(Chromosome),適應函數(fitness function)的選擇一般根據研究目的確定。例如在分類問題中,錯誤分類的比率可以用來作為適應值。

          演化計算的優勢在于可以處理一些傳統方法不能處理的例子例如不可導的節點傳遞函數或者沒有梯度信息存在。但是缺點在于:在某些問題上性能并不是特別好。2. 網絡權重的編碼而且遺傳算子的選擇有時比較麻煩

          最近已經有一些利用PSO來代替反向傳播算法來訓練神經網絡的論文。研究表明PSO 是一種很有潛力的神經網絡算法。PSO速度比較快而且可以得到比較好的結果。而且還沒有遺傳算法碰到的問題

          這里用一個簡單的例子說明PSO訓練神經網絡的過程。這個例子使用分類問題的基準函數(Benchmark function)IRIS數據集。(Iris 是一種鳶尾屬植物) 在數據記錄中,每組數據包含Iris花的四種屬性:萼片長度,萼片寬度,花瓣長度,和花瓣寬度,三種不同的花各有50組數據. 這樣總共有150組數據或模式。

          我們用3層的神經網絡來做分類。現在有四個輸入和三個輸出。所以神經網絡的輸入層有4個節點,輸出層有3個節點我們也可以動態調節隱含層節點的數目,不過這里我們假定隱含層有6個節點。我們也可以訓練神經網絡中其他的參數。不過這里我們只是來確定網絡權重。粒子就表示神經網絡的一組權重,應該是4*6+6*3=42個參數。權重的范圍設定為[-100,100] (這只是一個例子,在實際情況中可能需要試驗調整).在完成編碼以后,我們需要確定適應函數。對于分類問題,我們把所有的數據送入神經網絡,網絡的權重有粒子的參數決定。然后記錄所有的錯誤分類的數目作為那個粒子的適應值。現在我們就利用PSO來訓練神經網絡來獲得盡可能低的錯誤分類數目。PSO本身并沒有很多的參數需要調整。所以在實驗中只需要調整隱含層的節點數目和權重的范圍以取得較好的分類效果。

          6. PSO的參數設置

          從上面的例子我們可以看到應用PSO解決優化問題的過程中有兩個重要的步驟: 問題解的編碼和適應度函數

          PSO的一個優勢就是采用實數編碼, 不需要像遺傳算法一樣是二進制編碼(或者采用針對實數的遺傳操作.例如對于問題 f(x)=x1^2 + x2^2+x3^2 求解, 粒子可以直接編碼為 (x1, x2, x3), 而適應度函數就是f(x). 接著我們就可以利用前面的過程去尋優.這個尋優過程是一個疊代過程, 中止條件一般為設置為達到最大循環數或者最小錯誤。

          PSO中并沒有許多需要調節的參數,下面列出了這些參數以及經驗設置

          粒子數: 一般取 20 – 40. 其實對于大部分的問題10個粒子已經足夠可以取得好的結果, 不過對于比較難的問題或者特定類別的問題, 粒子數可以取到100 或 200

          粒子的長度: 這是由優化問題決定, 就是問題解的長度

          粒子的范圍: 由優化問題決定,每一維可是設定不同的范圍

          Vmax: 最大速度,決定粒子在一個循環中最大的移動距離,通常設定為粒子的范圍寬度,例如上面的例子里,粒子 (x1, x2, x3) x1 屬于 [-10, 10], 那么 Vmax 的大小就是 20

          學習因子: c1 和 c2 通常等于 2. 不過在文獻中也有其他的取值. 但是一般 c1 等于 c2 并且范圍在0和4之間

          中止條件: 最大循環數以及最小錯誤要求. 例如, 在上面的神經網絡訓練例子中, 最小錯誤可以設定為1個錯誤分類, 最大循環設定為2000, 這個中止條件由具體的問題確定.

          全局PSO和局部PSO: 我們介紹了兩種版本的粒子群優化算法: 全局版和局部版. 前者速度快不過有時會陷入局部最優. 后者收斂速度慢一點不過很難陷入局部最優. 在實際應用中, 可以先用全局PSO找到大致的結果,再有局部PSO進行搜索.

          另外的一個參數是慣性權重, 由Shi 和Eberhart提出, 有興趣的可以參考他們1998年的論文(題目: A modified particle swarm optimizer)

          蟻群算法

          簡介:蟻群算法(ant colony optimization, ACO),又稱螞蟻算法,是一種用來在圖中尋找優化路徑的機率型技術。它由Marco Dorigo于1992年在他的博士論文中引入,其靈感來源于螞蟻在尋找食物過程中發現路徑的行為。

          事實上,每只螞蟻并不是像我們想象的需要知道整個世界的信息,他們其實只關心很小范圍內的眼前信息,而且根據這些局部信息利用幾條簡單的規則進行決策,這樣,在蟻群這個集體里,復雜性的行為就會凸現出來。這就是人工生命、復雜性科學解釋的規律!那么,這些簡單規則是什么呢?下面詳細說明:

          1、范圍:

          螞蟻觀察到的范圍是一個方格世界,螞蟻有一個參數為速度半徑(一般是3),那么它能觀察到的范圍就是3*3個方格世界,并且能移動的距離也在這個范圍之內。

          2、環境:

          螞蟻所在的環境是一個虛擬的世界,其中有障礙物,有別的螞蟻,還有信息素,信息素有兩種,一種是找到食物的螞蟻灑下的食物信息素,一種是找到窩的螞蟻灑下的窩的信息素。每個螞蟻都僅僅能感知它范圍內的環境信息。環境以一定的速率讓信息素消失。

          3、覓食規則:

          在每只螞蟻能感知的范圍內尋找是否有食物,如果有就直接過去。否則看是否有信息素,并且比較在能感知的范圍內哪一點的信息素最多,這樣,它就朝信息素多的地方走,并且每只螞蟻多會以小概率犯錯誤,從而并不是往信息素最多的點移動。螞蟻找窩的規則和上面一樣,只不過它對窩的信息素做出反應,而對食物信息素沒反應。

          4、移動規則:

          每只螞蟻都朝向信息素最多的方向移,并且,當周圍沒有信息素指引的時候,螞蟻會按照自己原來運動的方向慣性的運動下去,并且,在運動的方向有一個隨機的小的擾動。為了防止螞蟻原地轉圈,它會記住最近剛走過了哪些點,如果發現要走的下一點已經在最近走過了,它就會盡量避開。

          5、避障規則:

          如果螞蟻要移動的方向有障礙物擋住,它會隨機的選擇另一個方向,并且有信息素指引的話,它會按照覓食的規則行為。

          7、播撒信息素規則:

          每只螞蟻在剛找到食物或者窩的時候撒發的信息素最多,并隨著它走遠的距離,播撒的信息素越來越少。

          根據這幾條規則,螞蟻之間并沒有直接的關系,但是每只螞蟻都和環境發生交互,而通過信息素這個紐帶,實際上把各個螞蟻之間關聯起來了。比如,當一只螞蟻找到了食物,它并沒有直接告訴其它螞蟻這兒有食物,而是向環境播撒信息素,當其它的螞蟻經過它附近的時候,就會感覺到信息素的存在,進而根據信息素的指引找到了食物。

          引申:

          跟著螞蟻的蹤跡,你找到了什么?通過上面的原理敘述和實際操作,我們不難發現螞蟻之所以具有智能行為,完全歸功于它的簡單行為規則,而這些規則綜合起來具有下面兩個方面的特點:

          1、多樣性

          2、正反饋

          多樣性保證了螞蟻在覓食的時候不置走進死胡同而無限循環,正反饋機制則保證了相對優良的信息能夠被保存下來。我們可以把多樣性看成是一種創造能力,而正反饋是一種學習強化能力。正反饋的力量也可以比喻成權威的意見,而多樣性是打破權威體現的創造性,正是這兩點小心翼翼的巧妙結合才使得智能行為涌現出來了。

          引申來講,大自然的進化,社會的進步、人類的創新實際上都離不開這兩樣東西,多樣性保證了系統的創新能力,正反饋保證了優良特性能夠得到強化,兩者要恰到好處的結合。如果多樣性過剩,也就是系統過于活躍,這相當于螞蟻會過多的隨機運動,它就會陷入混沌狀態;而相反,多樣性不夠,正反饋機制過強,那么系統就好比一潭死水。這在蟻群中來講就表現為,螞蟻的行為過于僵硬,當環境變化了,螞蟻群仍然不能適當的調整。

          既然復雜性、智能行為是根據底層規則涌現的,既然底層規則具有多樣性和正反饋特點,那么也許你會問這些規則是哪里來的?多樣性和正反饋又是哪里來的?我本人的意見:規則來源于大自然的進化。而大自然的進化根據剛才講的也體現為多樣性和正反饋的巧妙結合。而這樣的巧妙結合又是為什么呢?為什么在你眼前呈現的世界是如此栩栩如生呢?答案在于環境造就了這一切,之所以你看到栩栩如生的世界,是因為那些不能夠適應環境的多樣性與正反饋的結合都已經死掉了,被環境淘汰了!

          參數說明:

          最大信息素:螞蟻在一開始擁有的信息素總量,越大表示程序在較長一段時間能夠存在信息素。信息素消減的速度:隨著時間的流逝,已經存在于世界上的信息素會消減,這個數值越大,那么消減的越快。

          錯誤概率表示這個螞蟻不往信息素最大的區域走的概率,越大則表示這個螞蟻越有創新性。

          速度半徑表示螞蟻一次能走的最大長度,也表示這個螞蟻的感知范圍。

          記憶能力表示螞蟻能記住多少個剛剛走過點的坐標,這個值避免了螞蟻在本地打轉,停滯不前。而這個值越大那么整個系統運行速度就慢,越小則螞蟻越容易原地轉圈。

          魚群優化算法

          在一片水域中,魚往往能自行或尾隨其他魚找到營養物質多的地方,因而魚生存數目最多的地方一般就是本水域中營養物質最多的地方,人工魚群算法就是根據這一特點,通過構造人工魚來模仿魚群的覓食!聚群及追尾行為,從而實現尋優,以下是魚的幾種典型行為:

          (1)覓食行為:一般情況下魚在水中隨機地自由游動,當發現食物時,則會向食物逐漸增多的方向快速游去。

          (2)聚群行為:魚在游動過程中為了保證自身的生存和躲避危害會自然地聚集成群,魚聚群時所遵守的規則有三條:分隔規則:盡量避免與臨近伙伴過于擁擠;對準規則:盡量與臨近伙伴的平均方向一致;內聚規則:盡量朝臨近伙伴的中心移動。

          (3)追尾行為:當魚群中的一條或幾條魚發現食物時,其臨近的伙伴會尾隨其快速到達食物點。

          特點:

          1)具有較快的收斂速度,可以用于解決有實時性要求的問題;

          2)對于一些精度要求不高的場合,可以用它快速的得到一個可行解;

          3)不需要問題的嚴格機理模型,甚至不需要問題的精確描述,這使得它的應用范圍得以延伸.

          停止條件

          1) 判斷連續多次所得的均方差小于語允許的誤差

          2)判斷某個區域的人工魚群的數目達到某個比率

          3)聯系多次所獲取的值均不能超過已尋找的極值。

          具體見原浙大博士李曉磊的博士論文-人工魚群算法。

          另外在nature上面2007年1一月有一篇關于人工魚行為的文章。


          主站蜘蛛池模板: 国产品无码一区二区三区在线蜜桃 | 亚洲熟妇成人精品一区| 精品无码中出一区二区| 在线电影一区二区三区| 亚洲熟妇无码一区二区三区| 久久国产免费一区二区三区| 亚洲一区精品中文字幕| 久久免费国产精品一区二区| 久久久久人妻一区精品色| 精品无码av一区二区三区| 91久久精品午夜一区二区| 无码人妻一区二区三区免费 | 狠狠色综合一区二区| 在线观看一区二区精品视频| 国产大秀视频一区二区三区| 无码精品前田一区二区| 国产丝袜无码一区二区三区视频| 色一情一乱一伦一区二区三区日本| 精品乱子伦一区二区三区| 亚洲视频在线观看一区| 国产伦精品一区二区三区免.费 | 久久久久人妻一区精品| 国产精品区一区二区三在线播放 | 精品国产一区二区三区www| 无码人妻精品一区二区蜜桃AV| 精品一区二区三区色花堂| 男插女高潮一区二区| 中文字幕无码一区二区免费| 亚洲一区欧洲一区| 久久精品视频一区二区三区| 精品亚洲福利一区二区| 一区二区三区观看免费中文视频在线播放| 亚洲熟妇无码一区二区三区导航 | 相泽亚洲一区中文字幕| 欧亚精品一区三区免费| 中文字幕在线一区二区在线 | 中文字幕亚洲一区| 福利一区国产原创多挂探花| 日韩精品午夜视频一区二区三区| 国产一区二区三区在线观看精品 | 国产精品va无码一区二区|