最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

autojs繪畫實(shí)現(xiàn)六邊形示例詳解

 更新時間:2023年01月31日 09:29:17   作者:牙叔教程  
這篇文章主要為大家介紹了autojs繪畫實(shí)現(xiàn)六邊形示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

界面基礎(chǔ)代碼

"nodejs ui";
require("rhino").install();
const ui = require("ui");
class MainActivity extends ui.Activity {
  constructor() {
    super();
  }
  get layoutXmlFile() {
    return "layout.xml";
  }
  onContentViewSet() {}
}
ui.setMainActivity(MainActivity);

創(chuàng)建Hexagon類

class Hexagon {}

至于需要的屬性, 有需求的時候再寫

界面布局

<column>
	<canvas id="canvas" w="*" h="*">
	</canvas>
</column>

畫板事件

  onContentViewSet(view) {
    const canvasView = view.binding.canvas;
    canvasView.on("draw", (canvas) => {
      canvas.drawColor(canvasBgColor);
    });
  }

計(jì)算并繪制六邊形中心點(diǎn)

let canvasWidth = canvasView.getWidth();
let canvasHeight = canvasView.getHeight();
let centerX = canvasWidth / 2;
let centerY = canvasHeight / 2;
canvasView.on("draw", (canvas) => {
  canvas.drawColor(canvasBgColor);
  canvas.drawPoint(centerX, centerY, paint);
});

計(jì)算六邊形六個點(diǎn)的坐標(biāo)

這個方法應(yīng)該屬于六邊形這個類

  getSixPoints() {
    let points = [];
    let angle = 0;
    for (let i = 0; i < 6; i++) {
      let x = this.centerX + this.sideLength * Math.cos(angle);
      let y = this.centerY - this.sideLength * Math.sin(angle);
      points.push({ x, y });
      angle += Math.PI / 3;
    }
    return points;
  }

計(jì)算六邊形的path

這個也屬于六邊形的方法

  getPath() {
    const path = new Path();
    let points = this.getSixPoints();
    path.moveTo(points[0].x, points[0].y);
    for (let i = 1; i &lt; points.length; i++) {
      path.lineTo(points[i].x, points[i].y);
    }
    path.close();
    return path;
  }

繪制六邊形

let hexagon = new Hexagon(centerX, centerY, config.sideLength);
let hexagonPath = hexagon.getPath();
canvasView.on("draw", (canvas) =&gt; {
  canvas.drawColor(canvasBgColor);
  canvas.drawPoint(centerX, centerY, paint);
  canvas.drawPath(hexagonPath, paint);
});

繪制一排六邊形

要繪制一排, 那么六邊形左右兩邊需要是數(shù)直的, 把 getSixPoints 方法里的 sin 和 cos 對調(diào)一下即可

let x = this.centerX + this.sideLength * Math.sin(angle);
let y = this.centerY - this.sideLength * Math.cos(angle);

確定邊界條件

所有六邊形都要在畫板內(nèi), 我們畫左上角第一個六邊形;

計(jì)算中心點(diǎn)要考慮的條件

  • 畫筆的寬度
  • 六邊形邊長
let angle = Math.PI / 3;
let firstHexagonCenterX = config.sideLength * Math.sin(angle) + config.paintConfig.width;
let firstHexagonCenterY = config.sideLength + config.paintConfig.width;

考慮兩個相鄰的六邊形連接處

兩個挨著的豎邊, 應(yīng)該只需要畫一條, 那么來計(jì)算第二個六邊形的中心位置, 以第一個六邊形為參照物

let secondHexagonCenterX = firstHexagonCenterX + config.sideLength * Math.sin(angle) * 2;
let secondHexagonCenterY = firstHexagonCenterY;

繪制出的兩個六邊形

改了一下寬度, 方便觀察

限制一排六邊形最后一個的邊界

最后一個六邊形的最右側(cè)的邊, 不能超過畫板

let hexagonPaths = [];
let count = 1;
while (1) {
  let nextHexagonCenterX = firstHexagonCenterX + config.sideLength * Math.sin(angle) * 2 * count;
  if (nextHexagonCenterX + config.sideLength * Math.sin(angle) + config.paintConfig.width > canvasWidth) {
    break;
  }
  let nextHexagonCenterY = firstHexagonCenterY;
  let nextHexagon = new Hexagon(nextHexagonCenterX, nextHexagonCenterY, config.sideLength);
  let nextHexagonPath = nextHexagon.getPath();
  hexagonPaths.push(nextHexagonPath);
  count++;
}
for (let i = 0; i < hexagonPaths.length; i++) {
  canvas.drawPath(hexagonPaths[i], paint);
}

畫第二排六邊形

計(jì)算第二排第一個六邊形的中心點(diǎn)

let nextRowFirstHexagonCenterX = firstHexagonCenterX + config.sideLength * Math.sin(angle);
let nextRowFirstHexagonCenterY = firstHexagonCenterY + config.sideLength * Math.cos(angle) + config.sideLength;
let nextRowFirstHexagon = new Hexagon(nextRowFirstHexagonCenterX, nextRowFirstHexagonCenterY, config.sideLength);
let nextRowFirstHexagonPath = nextRowFirstHexagon.getPath();

與第一排同理, 畫第二排

繪制多排六邊形

很明顯, 我們要使用循環(huán), 橫著要循環(huán), 豎著也要循環(huán), 那么這個循環(huán)怎么寫呢?

我們一組一組的計(jì)算六邊形中心點(diǎn), 一組有兩排六邊形:

  • 第一排5個
  • 第二排4個

下一組, 往下移動 3 個邊長,

因?yàn)榈谝唤M, 我們已經(jīng)檢查過畫板右側(cè),

所以, 接下來的計(jì)算, 只需要考慮畫板底部, 不需要判斷畫板右側(cè)了;

我們改變的只有縱坐標(biāo)

先畫一組

let firstRow = [];
let secondRow = [];
let firstGroup = [firstRow, secondRow];
let firstRowCount = 0;
while (1) {
  let centerX = firstHexagonCenterX + firstRowCount * config.sideLength * 2 * Math.sin(angle);
  if (centerX > canvasWidth - config.sideLength * Math.sin(angle) - config.paintConfig.width) {
    break;
  }
  let centerY = firstHexagonCenterY;
  firstRow.push(new Hexagon(centerX, centerY, config.sideLength));
  firstRowCount++;
}
/* -------------------------------------------------------------------------- */
let secondRowCount = 0;
while (1) {
  let centerX = firstHexagonCenterX + secondRowCount * config.sideLength * 2 * Math.sin(angle) + config.sideLength * Math.sin(angle);
  if (centerX > canvasWidth - config.sideLength * Math.sin(angle) - config.paintConfig.width) {
    break;
  }
  let centerY = firstHexagonCenterY + config.sideLength + config.sideLength * Math.cos(angle);
  secondRow.push(new Hexagon(centerX, centerY, config.sideLength));
  secondRowCount++;
}
hexagons = firstGroup.flat();
let hexagonPaths = hexagons.map((hexagon) => hexagon.getPath());
/* -------------------------------------------------------------------------- */
canvasView.on("draw", (canvas) => {
  canvas.drawColor(canvasBgColor);
  for (let i = 0; i < hexagonPaths.length; i++) {
    canvas.drawPath(hexagonPaths[i], paint);
  }
});

這是一個二維數(shù)組, 我們用flat抹平成一維數(shù)組

一組一組的計(jì)算坐標(biāo)

y坐標(biāo)依次增長3個邊長即可

先計(jì)算第一排, 再計(jì)算第二排

let row = 1;
while (1) {
  let nextGroupFirstRow = [];
  let nextGroupSecondRow = [];
  let nextGroup = [nextGroupFirstRow, nextGroupSecondRow];
  let firstGroupFirstRow = firstGroup[0];
  let firstGroupFirstHexagon = firstGroupFirstRow[0];
  if (firstGroupFirstHexagon.centerY + config.sideLength * 3 * row > canvasHeight) {
    break;
  }
  nextGroupFirstRow = firstGroupFirstRow.map((hexagon) => {
    let centerX = hexagon.centerX;
    let centerY = hexagon.centerY + config.sideLength * 3 * row;
    nextGroupFirstRow.push(new Hexagon(centerX, centerY, config.sideLength));
  });
  let firstGroupSecondRow = firstGroup[1];
  let firstGroupSecondHexagon = firstGroupSecondRow[0];
  if (firstGroupSecondHexagon.centerY + config.sideLength * 3 * row > canvasHeight) {
    break;
  }
  nextGroupSecondRow = firstGroupSecondRow.map((hexagon) => {
    let centerX = hexagon.centerX;
    let centerY = hexagon.centerY + config.sideLength * 3 * row;
    nextGroupSecondRow.push(new Hexagon(centerX, centerY, config.sideLength));
  });
  groups.push(nextGroup);
  row++;
}
hexagons = groups.flat(2);
let hexagonPaths = hexagons.map((hexagon) => hexagon.getPath());

環(huán)境

設(shè)備: 小米11pro

Android版本: 12

Autojs版本: 9.3.11

名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文檔, autojs文檔, 最后才是群里問問 ---

部分內(nèi)容來自網(wǎng)絡(luò) 本教程僅用于學(xué)習(xí), 禁止用于其他用途

以上就是autojs畫六邊形實(shí)現(xiàn)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于autojs繪畫實(shí)現(xiàn)六邊形的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 跨域設(shè)置Cookie失效問題解決方案原理分析

    跨域設(shè)置Cookie失效問題解決方案原理分析

    這篇文章主要為大家介紹了跨域設(shè)置Cookie失效問題解決方案原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 前端對接WebSocket與心跳重連實(shí)現(xiàn)

    前端對接WebSocket與心跳重連實(shí)現(xiàn)

    這篇文章主要為大家介紹了前端對接WebSocket與心跳重連實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • wasm+js實(shí)現(xiàn)文件獲取md5示例詳解

    wasm+js實(shí)現(xiàn)文件獲取md5示例詳解

    這篇文章主要為大家介紹了wasm+js實(shí)現(xiàn)md5文件獲取示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 二維碼條形碼生成的JavaScript腳本庫

    二維碼條形碼生成的JavaScript腳本庫

    這篇文章主要為大家介紹了二維碼條形碼生成的JavaScript腳本庫實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 無UI?組件Headless框架邏輯原理用法示例詳解

    無UI?組件Headless框架邏輯原理用法示例詳解

    這篇文章主要為大家介紹了無UI?組件Headless框架邏輯原理用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • echart實(shí)現(xiàn)大屏動效示例詳解

    echart實(shí)現(xiàn)大屏動效示例詳解

    這篇文章主要為大家介紹了echart實(shí)現(xiàn)大屏動效示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Google 地圖疊加層實(shí)例講解

    Google 地圖疊加層實(shí)例講解

    本文主要介紹Google 地圖疊加層,這里幫大家整理了Google地圖疊加層一些實(shí)用代碼并詳細(xì)介紹了相關(guān)知識,有需要的小伙伴可以參考下
    2016-08-08
  • 微信小程序 首頁制作簡單實(shí)例

    微信小程序 首頁制作簡單實(shí)例

    這篇文章主要介紹了微信小程序 首頁制作簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 微信小程序 生命周期函數(shù)詳解

    微信小程序 生命周期函數(shù)詳解

    這篇文章主要介紹了微信小程序 生命周期函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 微信小程序 轉(zhuǎn)發(fā)功能的實(shí)現(xiàn)

    微信小程序 轉(zhuǎn)發(fā)功能的實(shí)現(xiàn)

    這篇文章主要介紹了微信小程序 轉(zhuǎn)發(fā)功能的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)現(xiàn)方法及實(shí)例幫助大家學(xué)習(xí)理解,需要的朋友可以參考下
    2017-08-08

最新評論

抚宁县| 象山县| 旌德县| 浮梁县| 汾阳市| 桂平市| 义马市| 临潭县| 江阴市| 普定县| 青冈县| 仁化县| 宁陕县| 开鲁县| 邹城市| 古浪县| 隆林| 莱州市| 乐安县| 大连市| 黎川县| 江都市| 上犹县| 鄱阳县| 沁源县| 历史| 红安县| 余江县| 雅安市| 仙居县| 庄河市| 武鸣县| 哈密市| 民勤县| 铁岭县| 南漳县| 双鸭山市| 金寨县| 蛟河市| 临夏市| 石门县|