精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

手把手教你從0手寫一個力導向關系圖

開發 前端
力導向圖大家都不陌生,力導向圖缺少不了力,而在數據量很大的情況下初始化節點以及對節點進行拖動時會導致整個力導圖都在一直在動。

  下圖,是本次要講的項目動態實例:

 

前言

力導向圖大家都不陌生,力導向圖缺少不了力,而在數據量很大的情況下初始化節點以及對節點進行拖動時會導致整個力導圖都在一直在動,密集的情況會更加嚴重,并且本著可以對點更好,靈活的控制,滿足不同的需求,所以打算自己實現一個簡單的力導向圖,并在過程中對碰撞檢測進行一次探索。

內容包括

整體內容分為兩個部分

使用d3.js 開發力導向圖出現的問題

  1. 兩點之間多條邊的處理

  2. 點的框選

  3. 點的刪除

  4. 縮略圖

  5. 主圖的拖拽、縮放與縮略圖

自己實現一個簡單的拓撲圖

  1. 碰撞檢測

  2. 矩形與矩形的檢測

  3. 圓形與圓形

  4. 圓形與矩形

  5. 點的分配

  6. 碰撞后點的移動

  7. 拖動

一 使用d3.js 開發力導向圖出現的問題

兩點之間多條邊的處理

思路為 ,將兩點之間的線進行分組,中間,左右分別為三組,分好組后,當tick 進行渲染時,通過分組內容的數量,對分組內容改變path 的彎曲程度。

點的框選

拖拽中創建一個矩形框,拖拽后判斷中心點是否在矩形框中則為被框選中. 注: 位置需要與d3 縮放的scale 配合計算

刪除

點的刪除實際上 就是把 相關點與線全部刪除, 并且清空畫布后, 重新用刪除后的數據重新繪制。

縮略圖

縮略圖目前的邏輯是主圖的最大倍數作為背景,主圖的寬高作為縮略圖視野(藍框)的寬高。因為縮略圖的dom 的寬高是css 定死的,viewbox 是實際寬高,所以給定主圖(正常)的寬高 會自動縮放。在拖拽主圖的點與相應操作時,對縮略圖的點也進行相應的變動,實際上就是在縮略圖中又畫了一遍主圖的內容 

  1. /** 
  2.       * @params 
  3.       * width 縮略圖寬度 
  4.       * height 縮略圖高度 
  5.       * mainWidth 主圖的寬度 
  6.       * mainHeight 主圖的高度 
  7.       * zoomMax 最大縮放比例 
  8.       *  
  9.       */ 
  10.       thumbSvg.attr('width', width) 
  11.          .attr('height', height).attr('viewBox', () => { 
  12.           // 縮略圖的寬高為 主圖的 最大縮略比例 
  13.            w = mainWidth * zoomMax; 
  14.            h = mainHeight * zoomMax; 
  15.            // 設置偏移 讓背景圖移至中心,縮略圖與主圖的差/ 2 就是需要移動的距離 
  16.            x = -(w - mainWidth) / 2
  17.            y = -(h - mainHeight) / 2
  18.            return `${x} ${y} ${w} ${h}`; 
  19.          }); 
  20.        dragThumb.attr('width', mainWidth) 
  21.          .attr('height', mainHeight); 

主圖的拖拽、縮放與縮略圖

調用主圖的縮放時(zoom) 會得到縮放以及拖拽信息,縮略圖使用拖拽的信息,因為viewbox 的原因,拖拽信息會自動縮放。但是需要注意主圖的縮放會對translate 進行變化 所以需要自己去處理 縮放過程中產生的位移

因為縮放會造成 主圖的 translate 發生變化 與手動拖拽造成的translate 會有差 所以 要扣除縮放造成的偏移

  1. /** 
  2.   * @params 
  3.   *  innerZoomInfo 縮略圖的縮放信息 
  4.   *  mainTransform 主圖的縮放信息 
  5.   *  mainWidth,mainHeight 主圖的寬高 
  6.   */ 
  7.      const { 
  8.        innerZoomInfo, mainWidth, mainHeight, 
  9.      } = this
  10.      // 如果傳入的 縮放值與之前記錄的縮放值不一致 則認為發生了縮放 記錄發生縮放后偏移值 
  11.      if (!innerZoomInfo || innerZoomInfo.k !== mainTransform.k) { 
  12.        this.moveDiff = { 
  13.          x: (mainWidth - innerZoomInfo.k * mainWidth) / 2//縮放產生的 位移 
  14.          y: (mainHeight - innerZoomInfo.k * mainHeight) / 2
  15.        }; 
  16.      } 
  17.      const { x: diffX, y: diffY } = this.moveDiff; 
  18.      const { x, y, k } = mainTransform; // 主圖偏移以及縮放數據 
  19.      this.dragThumb 
  20.        .attr('width', mainWidth / k) 
  21.        .attr('height', mainHeight / k) 
  22.        .attr('transform', () => setTransform({ 
  23.          x: -((x - diffX) / k), // 這個地方應該不能直接 除 k 這里的x,y 應該是放大后的x,y應該減去縮放的差值 再 除K 
  24.          y: -((y - diffY) / k), 
  25.        })); 

自己實現一個簡單的拓撲圖

碰撞檢測

矩形與矩形的檢測

矩形與矩形的碰撞是最好檢測的

通過上面的圖基本就涵蓋了規則矩形相交的情況 圖可以得知 A:紅色矩形 B:綠色矩形 上下是通過Y,左右是通過X

  1. A.x < B.x + B.width && 
  2. A.x + A.width > B.x && 
  3. A.y < B.y + B.h && 
  4. A.h + A.y > B.y 

但是如果內部是一個圓形的話,那么如果 紫色的區域則會被判定為碰撞則 則準確性有一定的偏差,需要有圓形的檢測

圓形與圓形

圓形與圓形的邏輯也比較簡單,就是兩點之間的距離小于兩點半徑之和 則為碰撞 

  1. var a = dot2.x-dot1.x; 
  2.        var b = dot2.y-dot1.y; 
  3.        return Math.sqrt(a*a+b*b) < a.radius + b.radius; 

圓形與矩形

首先來看 矩形與圓形相交是什么樣,從圖所知矩形與圓形相交,表現為圓點距離矩形最近的點小于圓點半徑 則為相交 那么如何得到圓點距離矩形最近的點

從下圖就知道了 圓點的延伸是圓點邊的一點。crashX = 如果 圓點位于矩形 左側 矩形(rect).x; 右側 = rect.x + rect.w 上下 圓點(circle).x

crashY = 如果 圓點位于矩形 左右 circle.y; 上 rect.y 上下 rect.y + h

那么兩點有了,可以得出兩點之間的距離套用圓與圓的公式 

  1. var a = crash.x-dot1.x; 
  2.       var b = crash.y-dot1.y; 
  3.       return Math.sqrt(a*a+b*b) < a.radius; 

上面就是基本的碰撞邏輯,更復雜的邏輯可以看下面參考文章 [1]

點的分配

點的位置的分配 就是確定中心點后,將關系最多的點作為中心點,其關系點向四周分散,沒有關系的同級點,則向中心點四周進行分散,其關系點以確定后位置的點的坐標向周圍分散。

根據三角形的正玄、余弦來得值;假設一個圓的圓心坐標是(a,b),半徑為r,角度為d 則圓上每個點的坐標可以通過下面的公式得到

  1. /* 
  2. * @params 
  3. * d 角度 
  4. * r 半徑長度 
  5. */ 
  6. X = a + Math.cos(((Math.PI * 2) / 360) * d) * r; 
  7. Y = b + Math.sin(((Math.PI * 2) / 360) * d) * r; 

角度可以通過 關系邊進行得到. d = 360/關系邊的數量,確定第一圈點的角度。拿到角度后 ,維持一個所有點坐標的對象,再結合圓形與圓形碰撞檢測,我們就可以遍歷 獲取所有點的坐標了

  1. /* 
  2. * @params 
  3. * dotsLocations 所有點的坐標信息 
  4. */ 
  5. initNodes() { 
  6.     const { x: centerX, y: centerY } = this.center; 
  7.     const { distance } = this
  8.     const getDeg = (all, now) => 360 / (all - (now || 0)); 
  9.     // 把中心點分配給線最多的點 
  10.     const centerdot = this.dots[0]; 
  11.     centerdot.x = centerX; 
  12.     centerdot.y = centerY; 
  13.     this.dotsLocations[centerdot.id] = { x: centerX, y: centerY }; 
  14.     this.dots.forEach((dot) => { 
  15.       const { x: outx, y: outy } = dot; 
  16.       if (!outx && !outy) { 
  17.        // 兄弟點 (無關系的點) 默認以中心店的10度進行遍歷 
  18.         dot = this.getLocation(dot, centerX, centerY,10, distance).dot; 
  19.       } 
  20.       const { x: cx, y: cy } = dot; 
  21.       const dotsLength = dot.relationDots.length; 
  22.       let { distance: innerDistance } = this
  23.       // 獲取剩余點的角度 
  24.       let addDeg = getDeg(dotsLength); 
  25.       dot.relationDots.forEach((relationId, index) => { 
  26.         let relationDot = this.findDot(relationId); 
  27.         if (!relationDot.x && !relationDot.y) { 
  28.           const { 
  29.             dot: resultDot, 
  30.             isPlus, 
  31.             outerR, 
  32.           } = this.getLocation(relationDot, cx, cy, addDeg, innerDistance); 
  33.           if (isPlus) { 
  34.            // 如果第一圈遍歷完畢,則開始以 半徑 * 2 為第二圈開始遍歷 
  35.             innerDistance = outerR; 
  36.             addDeg = getDeg(dotsLength, index); 
  37.             addDeg += randomNumber(59);  //防止第一圈與第二圈的點所生成的角度一致 造成鏈接的線重疊在一起 
  38.           } 
  39.           relationDot = resultDot; 
  40.         } 
  41.       }); 
  42.     }); 
  43.   } 
  44.  
  45.    

 

  1. // 分配位置 
  2.   getLocation(dot, cx, cy, addDeg, distance) { 
  3.   // 由第一張圖 得知 -90度為最上面  從最上面開始循環 
  4.     let outerDeg = -90
  5.     let outerR = distance; 
  6.     const { distance: addDistance } = this
  7.     let firsted; // 用于分布完后一周 
  8.     while (Object.keys(this.checkDotLocation(dot)).length !== 0) { 
  9.       outerDeg += addDeg; 
  10.       if (outerDeg > 360) { 
  11.       // 轉完一圈 隨機生成第二圈的角度再開始對當前點進行定位 
  12.         addDeg = randomNumber(1035); 
  13.         outerDeg = addDeg; 
  14.         if (firsted) { 
  15.           outerR += addDistance; 
  16.         } 
  17.         firsted = true
  18.       } 
  19.       const innerLocation = getDegXy(cx, cy, outerDeg, outerR); 
  20.       dot = Object.assign(dot, innerLocation); 
  21.     } 
  22.     this.dotsLocations[dot.id] = { x: dot.x, y: dot.y }; 
  23.     return { 
  24.       dot, 
  25.       isPlus: firsted, 
  26.       outerR, 
  27.     }; 
  28.   } 


  1.  // 碰撞檢測 
  2.   checkDotLocation(circleA) { 
  3.     let repeat = false
  4.     if (!circleA.x || !circleA.y) return true
  5.     const { forceCollide } = this
  6.     console.log(this.dotsLocations) 
  7.     Object.keys(this.dotsLocations).forEach((key) => { 
  8.       if (key === circleA.id) { 
  9.         return
  10.       } 
  11.       const circleB = this.dotsLocations[key]; 
  12.       let isRepeat = Math.sqrt(Math.pow(circleA.x - circleB.x, 2) + Math.pow(circleA.y - circleB.y, 2)) < forceCollide * 2
  13.       if(isRepeat)repeat = true
  14.     }); 
  15.     return repeat; 
  16.   } 

生成時間與D3 的差不多

碰撞后點的移動 (力?)

碰撞后的邏輯呢 簡單的就是已拖動點為圓點,計算碰撞點與圓點的夾角,再通過角度與距離得出碰撞后被碰撞點的x,y的坐標

  1. changeLocation(data, x, y, eliminate) { 
  2.  // 先對原來的點進行賦值 
  3.     data.x = x; 
  4.     data.y = y; 
  5.     // 對點的坐標進行賦值,使之后的碰撞使用新值進行計算 
  6.     this.dotsLocations[data.id] = { x, y }; 
  7.     let crashDots = this.checkDotLocation(data); 
  8.     // 獲得所有被碰撞的點 
  9.     Object.keys(crashDots).forEach((crashId) => { 
  10.       if (eliminate === crashId) return// 碰撞后的碰撞防止 更改當前拖拽元素 
  11.       const crashDot = this.findDot(crashId); 
  12.       // 獲取被碰撞的x,y 值 
  13.       const { x: crashX, y: crashY } = crashDot; 
  14.       // 此處的角度是要移動的方向的角度 
  15.       let deg = getDeg(crashDot.x,crashDot.y,data.x,data.y); 
  16.       // - 180 的目的是為了 與上面的黑圖角度一致 
  17.       // 2是碰撞后  移動2個像素的半徑 
  18.       const {x:endX,y:endY} = getDegXy(crashDot.x, crashDot.y, deg - 1802); 
  19.       // 講被碰撞的點作為圓點 改變值 并進行碰撞點的碰撞的碰撞檢測(禁止套娃 ) 
  20.       this.changeLocation(crashDot, endX, endY, data.id); 
  21.     }); 
  22.   } 

獲取夾角角度

  1. function getDeg(x1,y1,x2,y2){ 
  2.   //中心點 
  3.   let cx = x1; 
  4.   let cy = y1; 
  5.  
  6.   //2個點之間的角度獲取 
  7.   let c1 = Math.atan2(y1 - cy, x1 - cx) * 180 / (Math.PI); 
  8.   let c2 = Math.atan2(y2 - cy, x2 - cx) * 180 / (Math.PI); 
  9.   let angle; 
  10.   c1 = c1 <= -90 ? (360 + c1) : c1; 
  11.   c2 = c2 <= -90 ? (360 + c2) : c2; 
  12.  
  13.   //夾角獲取 
  14.   angle = Math.floor(c2 - c1); 
  15.   angle = angle < 0 ? angle + 360 : angle; 
  16.   return angle; 

到此實現一個簡單的拓撲圖就搞定了。使用我們自己的force 代替 d3.js 的效果,后期想要什么效果就可以自己再加了 如 拖動主點相關點動,其他關聯點不動的需求。tick方法需要自己手動去調用了

  1. let force = new Force({ 
  2.           x: svgW / 2
  3.           y: svgH / 2
  4.           distance: 200
  5.           forceCollide:30
  6.         }); 
  7.         force.nodes(dot); 
  8.         force.initLines(line); 

拖動

這邊的tick 是當 點的xy 發生變化的時候 自己去重新構建點和線。再實際項目中每一次拖動就會構建,會比較卡,可以丟到requestAnimationFrame 去調用 

  1. dotDoms.on("mousedown", function (d) { 
  2.         dragDom = { 
  3.           data: d, 
  4.           dom: this
  5.         }; 
  6.       }); 
  7.       d3.select("svg").on("mousemove", function (d) { 
  8.         if (!dragDom) return
  9.         const { offsetX: x, offsetY: y } = d3.event; 
  10.         if (x < -1 || y < -1 || x >= svgH - 10 || y >= svgH - 10) { 
  11.           //邊界 
  12.           dragDom = null
  13.           return
  14.         } 
  15.         force.changeLocation(dragDom.data, x, y); 
  16.         tick(); 
  17.       }); 
  18.       d3.select("svg").on("mouseup", function (d) { 
  19.         dragDom = null
  20.       }); 

小結

本章主要講述了使用d3 對力導向圖進行開發過程中,出現的問題。以及以碰撞為基礎開發的簡單的力導向圖

 

 

責任編輯:張燕妮 來源: code秘密花園
相關推薦

2021-06-22 10:43:03

Webpack loader plugin

2019-10-29 15:46:07

區塊鏈區塊鏈技術

2019-08-26 09:25:23

RedisJavaLinux

2022-05-18 08:51:44

調用模板后端并行

2021-12-10 18:19:55

指標體系設計

2023-10-16 22:03:36

日志包多線程日志包

2023-03-27 08:28:57

spring代碼,starter

2023-11-28 07:36:41

Shell腳本部署

2022-08-25 14:41:51

集群搭建

2022-06-28 15:29:56

Python編程語言計時器

2017-07-19 13:27:44

前端Javascript模板引擎

2014-01-22 09:19:57

JavaScript引擎

2021-07-14 09:00:00

JavaFX開發應用

2011-05-03 15:59:00

黑盒打印機

2011-01-10 14:41:26

2025-05-07 00:31:30

2022-08-26 08:01:38

DashWebJavaScrip

2022-09-22 12:38:46

antd form組件代碼

2016-11-01 09:46:04

2018-05-16 13:50:30

Python網絡爬蟲Scrapy
點贊
收藏

51CTO技術棧公眾號

老**午夜毛片一区二区三区| 一区二区三区视频免费视频观看网站| 久久精品人人做| 91精品久久久久久久久久久| 国产免费久久久久| 国产精品白丝av嫩草影院| 黑人巨大精品欧美一区二区一视频 | 亚洲熟妇无码一区二区三区导航| 欧美少妇另类| 国产精品99久久久久久有的能看| 国内精品伊人久久| www.日本高清视频| 国产一区福利| 欧美日韩aaaaaa| 日本不卡在线观看视频| 黄色精品在线观看| 91麻豆国产精品久久| 91在线直播亚洲| 色老头一区二区| 亚洲国产电影| 久久人人爽亚洲精品天堂| 特级西西人体wwwww| 日本高清不卡一区二区三区视频 | 波多野结衣一区二区三区在线| 你懂的网址国产 欧美| 亚洲情综合五月天| 丰满岳乱妇一区二区| 色成人综合网| 在线精品亚洲一区二区不卡| 91成人在线观看喷潮教学| 超碰在线观看免费| 国产精品久久久久三级| 热舞福利精品大尺度视频| xxxx国产精品| 国产一区二区三区黄视频 | 久草在线免费福利资源| 大白屁股一区二区视频| 91免费精品国偷自产在线| 成年人av网站| 免费看黄裸体一级大秀欧美| 国外成人在线播放| 久久久久无码精品国产| 亚洲国产精品日韩专区av有中文| 一区二区三区黄色| 谁有免费的黄色网址| 日韩深夜影院| 亚洲精品v天堂中文字幕| 色婷婷成人在线| 岛国一区二区| 欧美日韩一级黄| 日日干夜夜操s8| 欧洲美女精品免费观看视频 | 欧美在线一级va免费观看| 精品在线视频免费| 亚洲精品资源| 91精品国产成人| 800av免费在线观看| 亚洲欧美成人综合| 欧美制服第一页| av一级在线观看| 美日韩一区二区| 国产人妖伪娘一区91| 在线观看免费中文字幕| 久久99久久99精品免视看婷婷| 国产欧美精品日韩| 国产裸体永久免费无遮挡| 国产麻豆精品视频| av蓝导航精品导航| 午夜成人鲁丝片午夜精品| 久久一区二区三区国产精品| 欧美性天天影院| av电影在线观看网址| 亚洲欧洲国产日韩| 国产精品三级一区二区| 国产精品yjizz视频网| 精品久久久久久久久久久久 | 免费在线黄色影片| 欧美男女视频| 欧美精品久久天天躁| 在线免费观看av网| 伊人久久影院| 国产手机视频精品| 又色又爽的视频| 午夜激情一区| 青青精品视频播放| 一级欧美一级日韩| 高清av一区二区| 欧美亚洲一级二级| 黄色网在线播放| 亚洲成在人线在线播放| 久久九九国产视频| 亚洲精品v亚洲精品v日韩精品| 亚洲国产欧美日韩精品| 亚洲精品自拍视频在线观看| 国产一区二区三区自拍| 国产极品jizzhd欧美| jlzzjlzz亚洲女人18| 久久久精品国产免大香伊| 综合视频免费看| 看黄在线观看| 欧美日韩电影一区| chinese麻豆新拍video| 国产国产精品| 日本在线观看天堂男亚洲 | 一区视频免费观看| 午夜在线a亚洲v天堂网2018| 亚洲一区二区三区四区视频| 视频一区二区三区在线看免费看| 亚洲视频小说图片| 男人透女人免费视频| av不卡一区二区| 色999日韩欧美国产| 日韩精品视频免费看| 狠狠久久亚洲欧美| 日本10禁啪啪无遮挡免费一区二区 | 少妇高潮喷水在线观看| 日本午夜精品久久久久| 亚洲精品视频免费在线观看| 欧美黄色一区二区三区| 免费观看日韩电影| 欧美1o一11sex性hdhd| 日韩影视在线| 欧美一级专区免费大片| 日本精品久久久久中文| 欧美中文日韩| 国产一区二区三区色淫影院| 尤物视频在线看| 欧美日韩大陆在线| 精品人体无码一区二区三区| 香蕉av777xxx色综合一区| 粉嫩精品一区二区三区在线观看| 欧美jizzhd69巨大| 欧美日韩一区二区三区四区五区| 国产肉体xxxx裸体784大胆| 好看的av在线不卡观看| 91夜夜揉人人捏人人添红杏| 男人影院在线观看| 欧美三级三级三级爽爽爽| 精品少妇一区二区三区免费观| 激情综合亚洲| 99在线看视频| 黄网av在线| 欧美成人三级电影在线| 免费又黄又爽又色的视频| 国产中文字幕精品| 黄色网址在线免费看| av一级久久| 久久精品视频播放| 国产又爽又黄免费软件| 中文字幕一区二区日韩精品绯色| 亚洲一区日韩精品| 日韩免费一区| 成人信息集中地欧美| 免费大片在线观看www| 777久久久精品| www.毛片com| 国产成人免费网站| 日本欧美视频在线观看| 久久精品色综合| 欧美一区二区三区精品电影| 麻豆av电影在线观看| 日本道免费精品一区二区三区| a级片在线观看| 久久福利资源站| 欧美a级黄色大片| 粉嫩av一区二区| 青青久久aⅴ北条麻妃| 97电影在线| 欧美精三区欧美精三区| 九九热国产在线| www.视频一区| www.日本xxxx| 中文在线日韩| 精品综合久久| a屁视频一区二区三区四区| 久久久极品av| 日韩一级免费视频| 91久久精品一区二区| 青青青在线免费观看| 91麻豆.com| 可以看污的网站| 在线 亚洲欧美在线综合一区| 久久久久se| 色999韩欧美国产综合俺来也| 九色91av视频| 青青操视频在线| 欧美嫩在线观看| 久久久久久久黄色片| 国产精品国产三级国产aⅴ入口| 久草免费资源站| 久久裸体视频| 特级西西444| 欧美伦理在线视频| 国产a一区二区| 国产一区二区三区影视| 久久久久久久久国产精品| 蜜桃免费在线| 精品国产一区二区亚洲人成毛片| 无码人妻av一区二区三区波多野 | 亚洲男人天堂2023| 国产成年妇视频| 在线观看日韩高清av| 精品无码久久久久久久| 国产精品私人影院| 国产69视频在线观看| 老汉av免费一区二区三区| 欧美 日韩 亚洲 一区| 7777久久香蕉成人影院| 日韩av不卡在线播放| 国产精品jk白丝蜜臀av小说| 成人精品aaaa网站| 国产成人精品亚洲日本在线观看| 欧美高清电影在线看| a√在线中文网新版址在线| 亚洲国产一区二区三区四区| 精品区在线观看| 欧美日韩一区精品| 国产suv精品一区二区33| 午夜精品一区二区三区免费视频| 国产一二三区精品| 国产精品青草久久| 精品无人区无码乱码毛片国产| 处破女av一区二区| 18深夜在线观看免费视频| 捆绑调教一区二区三区| 日本www.色| 久久精品30| 日韩欧美国产免费| 亚洲国产影院| 99在线观看视频免费| 亚洲精品在线观看91| 亚洲日本japanese丝袜| 欧美日韩国产高清电影| 日本在线成人一区二区| 久久99高清| 久久久久久九九九九| 噜噜噜狠狠夜夜躁精品仙踪林| 成人性色av| 亚洲天堂av资源在线观看| 91精品天堂| 日韩一区二区三区在线看| 成人精品一区二区三区电影免费 | 九九视频免费看| 亚洲啪啪综合av一区二区三区| 婷婷国产成人精品视频| 国产精品久久久久久久久免费樱桃 | 动漫av在线免费观看| 国产成人精品免费网站| 9191在线视频| 成人精品小蝌蚪| 性农村xxxxx小树林| 粉嫩av一区二区三区| 亚洲一级Av无码毛片久久精品| 东方欧美亚洲色图在线| 成人区人妻精品一区二| 91香蕉国产在线观看软件| www.久久国产| 欧美国产综合色视频| 在线视频这里只有精品| 亚洲欧美日韩综合aⅴ视频| 99自拍视频在线| 夜夜精品浪潮av一区二区三区| 久久网免费视频| 欧美日韩亚洲高清| 91porny九色| 69堂成人精品免费视频| 亚洲成人av综合| 亚洲男女性事视频| 性开放的欧美大片| 欧美日本亚洲视频| 精品众筹模特私拍视频| 91国产视频在线播放| 精品网站在线| 99久久精品久久久久久ai换脸| 日韩av字幕| 一本色道久久综合亚洲精品婷婷 | 国产欧美一区视频| 99鲁鲁精品一区二区三区| 亚洲综合在线免费观看| 国产 日韩 欧美 在线| 欧美日韩一区二区三区四区五区| 国产成人麻豆精品午夜在线| 亚洲国产私拍精品国模在线观看| 黄色av免费在线观看| 久久伊人精品天天| √天堂8资源中文在线| 国产精品久久久久久久app| 精品一区二区三区免费看| 裸模一区二区三区免费| 婷婷综合在线| 欧美在线观看www| 久草热8精品视频在线观看| 插我舔内射18免费视频| 国产精品久久久一本精品| 国产无码精品视频| 欧美日韩一卡二卡| 日韩精品系列| 欧美人与性动交| 欧美爱爱视频| 蜜桃视频在线观看91| 午夜精品久久久久99热蜜桃导演 | 国产乱子伦一区二区三区国色天香| 精品国产一区在线| 最新国产成人在线观看| 免费黄色网址在线| 日韩欧美国产综合一区 | 国产精品主播一区二区| 亚洲免费一级电影| 精精国产xxxx视频在线中文版| 国产精品电影在线观看| 国产一区二区三区亚洲| 永久免费网站视频在线观看| 日本91福利区| 97超碰在线资源| 亚洲va韩国va欧美va| 99久久99久久久精品棕色圆| 国产一区二区成人| 国产在线88av| 国产66精品久久久久999小说| 三上亚洲一区二区| 欧美综合在线观看视频| 91天堂素人约啪| 国产性猛交普通话对白| 91精品国产91久久久久久一区二区 | 亚洲性生活网站| 91蜜桃在线免费视频| 国产精选第一页| 日韩久久精品一区| 超碰人人在线| 成人免费在线网址| 清纯唯美综合亚洲| 欧美精品第三页| 久久综合一区二区| 国产专区第一页| 日韩精品极品在线观看播放免费视频| 国产白丝在线观看| 成人综合av网| 国一区二区在线观看| 久久久久亚洲av无码网站| 亚洲精品欧美在线| 国产极品999| 欧美日本黄视频| 波多野结衣欧美| 僵尸世界大战2 在线播放| 丁香激情综合国产| 久久精品国产亚洲av香蕉| 精品久久久久久久人人人人传媒 | 午夜精品视频一区| 香港一级纯黄大片| 9.1国产丝袜在线观看| 日本妇女一区| 北条麻妃视频在线| 国产欧美精品在线观看| 伊人网av在线| 超碰精品一区二区三区乱码| 国产精品久久久久久久久久辛辛 | 亚洲ww精品| 97精品国产97久久久久久粉红| 国产高清在线精品| 国产香蕉在线视频| 亚洲男人天堂手机在线| 欧洲精品一区二区三区| 亚洲午夜久久久影院伊人| 精品亚洲成a人在线观看| 九九热国产在线| 日韩精品视频在线免费观看| 免费成人动漫| 制服诱惑一区| 大尺度一区二区| 国产精品免费无遮挡无码永久视频| 色系列之999| 免费精品一区| 久久国产成人精品国产成人亚洲| 国产拍揄自揄精品视频麻豆| 国产喷水福利在线视频| 国内精品免费午夜毛片| 精品一区二区三区在线| 亚洲三级在线视频| 天天操天天色综合| 中文日本在线观看| 超碰97网站| 青青青爽久久午夜综合久久午夜| 久久高清内射无套| 日韩电影免费观看中文字幕| 久久精品国产福利| 分分操这里只有精品| 国产欧美一区二区精品秋霞影院 | 成人国产精品免费网站| 激情视频网站在线观看| 久久伊人免费视频| 国产在视频线精品视频www666| 日本精品一区在线| 精品久久久久久久久久久| 国产黄大片在线观看画质优化| 国产亚洲情侣一区二区无| 毛片av一区二区| 日本午夜视频在线观看| 久久亚洲成人精品| 国产欧美日韩一区二区三区四区| 久久无码人妻一区二区三区|