Shape对象和轮廓填充ShapeGeometry

本文是Three.js电子书的7.7节

轮廓生成 轮廓填充ShapeGeometry shape 基类-子类 算法:根据轮廓的顶点使用三角面Face3自动填充中间区域 Shape对象 Shape对象作为元素构成的数组 第一个参数 shape继承基类Path的轮廓绘制方法 外轮廓 数组:元素是Path对象 .holes属性 内部轮廓 绘制二维形状 可视化解析地图数据 外部导入顶点 Curve——>CurvePath——>Path——>Shape Curve——>CurvePath——>ShapePath 从前到后,依次前面是后面基类 Shape Path ShapePath CurvePath Curve

填充顶点构成的轮廓

通过下面代码定义了6个顶点坐标,也可以说是5个,最后一个和第一个是重合的,构成一个五边形区域。然后使用这一组二维顶点坐标作为Shape的参数构成一个五边形轮廓。把五边形轮廓Shape作为ShapeGeometry的参数,可以根据轮廓坐标计算出一系列三角形面填充轮廓,形成一个平面几何体。

var points = [new THREE.Vector2(-50, -50),new THREE.Vector2(-60, 0),new THREE.Vector2(0, 50),new THREE.Vector2(60, 0),new THREE.Vector2(50, -50),new THREE.Vector2(-50, -50),
]
// 通过顶点定义轮廓
var shape = new THREE.Shape(points);
// shape可以理解为一个需要填充轮廓
// 所谓填充:ShapeGeometry算法利用顶点计算出三角面face3数据填充轮廓
var geometry = new THREE.ShapeGeometry(shape, 25);

调用Shape圆弧方法.absarc()绘制一个圆形轮廓,然后通过ShapeGeometry可以把该圆形轮廓填充为一个圆形平面几何体。

你可以尝试更改ShapeGeometry的参数2,参数2表示细分数,然后网格材质设置为wireframe: true查看圆形区域填充三角形的数量变化。

// 通过shpae基类path的方法绘制轮廓(本质也是生成顶点)
var shape = new THREE.Shape();
shape.absarc(0,0,100,0,2*Math.PI);//圆弧轮廓
console.log(shape.getPoints(15));//查看shape顶点数据
var geometry = new THREE.ShapeGeometry(shape, 25);

下面代码是通过shpae绘制了一个矩形区域,更多相关的轮廓绘制方法可以查看Shape文档。

// 通过shpae基类path的方法绘制轮廓(本质也是生成顶点)
var shape = new THREE.Shape();
// 四条直线绘制一个矩形轮廓
shape.moveTo(0,0);//起点
shape.lineTo(0,100);//第2点
shape.lineTo(100,100);//第3点
shape.lineTo(100,0);//第4点
shape.lineTo(0,0);//第5点

shape外轮廓和内轮廓

shape可以用来绘制外轮廓,也可以用来绘制内轮廓,ShapeGeometry会使用三角形自动填充shape内轮廓和外轮廓中间的中部。

下面给出了几个通过shape绘制的轮廓图案。

// 圆弧与直线连接
var shape = new THREE.Shape(); //Shape对象
var R = 50;
// 绘制一个半径为R、圆心坐标(0, 0)的半圆弧
shape.absarc(0, 0, R, 0, Math.PI);
//从圆弧的一个端点(-R, 0)到(-R, -200)绘制一条直线
shape.lineTo(-R, -200);
// 绘制一个半径为R、圆心坐标(0, -200)的半圆弧
shape.absarc(0, -200, R, Math.PI, 2 * Math.PI);
//从圆弧的一个端点(R, -200)到(-R, -200)绘制一条直线
shape.lineTo(R, 0);
var geometry = new THREE.ShapeGeometry(shape, 30);

// 一个外轮廓圆弧嵌套三个内圆弧轮廓
var shape = new THREE.Shape(); //Shape对象
//外轮廓
shape.arc(0, 0, 100, 0, 2 * Math.PI);
// 内轮廓1
var path1 = new THREE.Path();
path1.arc(0, 0, 40, 0, 2 * Math.PI);
// 内轮廓2
var path2 = new THREE.Path();
path2.arc(80, 0, 10, 0, 2 * Math.PI);
// 内轮廓3
var path3 = new THREE.Path();
path3.arc(-80, 0, 10, 0, 2 * Math.PI);
//三个内轮廓分别插入到holes属性中
shape.holes.push(path1, path2, path3);

// 矩形嵌套矩形或圆弧
var shape=new THREE.Shape();//Shape对象
//外轮廓
shape.moveTo(0,0);//起点
shape.lineTo(0,100);//第2点
shape.lineTo(100,100);//第3点
shape.lineTo(100,0);//第4点
shape.lineTo(0,0);//第5点//内轮廓
var path=new THREE.Path();//path对象
// path.arc(50,50,40,0,2*Math.PI);//圆弧
path.moveTo(20,20);//起点
path.lineTo(20,80);//第2点
path.lineTo(80,80);//第3点
path.lineTo(80,20);//第4点
path.lineTo(20,20);//第5点
shape.holes.push(path);//设置内轮廓

多个轮廓同时填充

// 轮廓对象1var shape=new THREE.Shape();shape.arc(-50,0,30,0,2*Math.PI);// 轮廓对象2var shape2=new THREE.Shape();shape2.arc(50,0,30,0,2*Math.PI);// 轮廓对象3var shape3=new THREE.Shape();shape3.arc(0,50,30,0,2*Math.PI);
// 多个shape作为元素组成数组,每一个shpae可以理解为一个要填充的轮廓
var geometry = new THREE.ShapeGeometry([shape,shape2,shape3], 30);

实例:根据河南边界坐标填充轮廓

// 河南边界轮廓坐标
let arr = [[110.3906, 34.585],[110.8301, 34.6289],
...
...
...[110.6543, 34.1455],[110.4785, 34.2334],[110.3906, 34.585]
]
var points = [];
// 转化为Vector2构成的顶点数组
arr.forEach(elem => {points.push(new THREE.Vector2(elem[0],elem[1]))
});
// 样条曲线生成更多的点
var SplineCurve = new THREE.SplineCurve(points)
var shape = new THREE.Shape(SplineCurve.getPoints(300));
// var shape = new THREE.Shape(points);
var geometry = new THREE.ShapeGeometry(shape);
geometry.center();//几何体居中
geometry.scale(30,30,30);//几何体缩放
var material = new THREE.MeshPhongMaterial({color: 0x0000ff,side: THREE.DoubleSide //两面可见
}); //材质对象
var mesh = new THREE.Mesh(geometry, material); //网格模型对象

Shape对象和轮廓填充ShapeGeometry相关推荐

  1. Python-基于OpenCV的轮廓填充 泛洪算法 孔洞填充

    左为原图 右为填充后 针对轮廓填充,我们先要提取图像中的轮廓,在对里面的进行颜色填充,这个我自己也有点分不清楚,他和阈值分割进行填充有什么区别,要是有大佬知道,分享一下,将感激不尽!轮廓填充的方法常用 ...

  2. 枚举如何设置空白_2019-07-04 用VBA设置word中shape对象相对位置

    在excelhome上看到一个提问 Excel 请教:用代码插入文本框,不随文字移动.-ExcelVBA程序开发-ExcelHome技术论坛 -​club.excelhome.net 本以为可以通过录 ...

  3. OpenCV图象孔洞内轮廓填充

    图像内轮廓填充通常称为孔洞填充,主要用于目标提取.不带任何条件的内轮廓填充,在目标密度很大时,可能导致错误填充.一种典型情况,当多个目标粘连,并 且形成环状时,简单的内轮廓填充会将环状内部背景部分误认 ...

  4. VSTO Shapes对象、ShapeRange对象和Shape对象的关系

    先附上官方文档网址: Office Visual Basic for Applications (VBA) 参考 | Microsoft Learn 前言 我正在学习制作PPT插件,在PPT中,形状是 ...

  5. coreldraw梯形校正_CorelDRAW中如何改变用形状识别所绘制对象的轮廓

    原标题:CorelDRAW中如何改变用形状识别所绘制对象的轮廓 CorelDRAW的智能绘图工具能将手绘笔触识别转换成基本形状或平滑的曲线.它能自动识别多种形状,如椭圆,矩形,菱形,箭头,梯形等,并能 ...

  6. matlab 图像 轮廓 填充颜色,基于Matlab的图形轮廓提取及填充

    计算机工程应用技术 本栏目责任编辑: 贾薇薇 电脑知识与技术 基于 Matlab 的图形轮廓提取及填充 井艾斌,柳青,孟祥增 (山东师范大学, 山东 济南 250014) 摘要: 提取图形的形状特征是 ...

  7. 基于OpencV的轮廓填充算法在3D打印机中的应用

    在这之前,我们需要了解一下SLC文件的格式,只有对格式有一点了解,我们才能做接下来的工作,首先SLC文件中是通过描述各层中的多段线来描述整个模型的,多段线之间两两相连.对单个轮廓来说,最后一点必须等于 ...

  8. 2 获取对象 IDbDataAdapter 用于填充 DataSet 和更新数据源

    //oracle版 new OracleDataAdapter();//SqlServer版 new SqlDataAdapter();//OleDb版 new OleDbDataAdapter(); ...

  9. Cadence Allegro PCB 铺铜(覆铜)Shape呈格点状填充而不是完整全铜显示问题–Allegro技巧...

    http://www.mr-wu.cn/cadence-allegro-pcb-shape-display-problem-disable-opengl-mode/ 转载于:https://www.c ...

最新文章

  1. 前端面试官,我为什么讨厌你。
  2. 程序员的爱情 第六章
  3. 苹果手机换了屏显示无服务器,苹果将​​为存在显示问题的iPhone 11提供免费更换...
  4. Ian Thiel:靠这 3 点,实现 30 倍增长,从不盈利到营收 5.5 亿
  5. [JOI2012春季合宿]Rotate (链表)
  6. Golden Gate 与 Oracle DataGuard的区别
  7. SAP CRM中间件队列CSAPR_HIERR3MATCLASS
  8. Android官方开发文档Training系列课程中文版:线程执行操作之定义线程执行代码
  9. POJ 3186 Treats for the Cows dp
  10. Cisco 3550配置DHCP中继代理
  11. 算法: 删除链表中的数据Remove Linked List Elements
  12. python爬取付费音乐包_python爬虫如何下载QQ音乐付费歌曲2020最新版
  13. python中除法运算定律_数学有哪几种简便运算方法?(除了加、乘法交换、结合律,减、除法的性质)...
  14. 关于野火mini led的学习
  15. 齐齐哈尔市全国计算机等级考试,2019年3月黑龙江省齐齐哈尔市计算机等级考试注意事项...
  16. adb无线连接不上 解决办法
  17. 老大说不要在项目中使用存储过程
  18. python中,除法运算后取整数的几种情况
  19. 本科计算机科学与技术毕业论文题目,(计算机科学与技术本科毕业论文选题.doc...
  20. aprilgrid 坐标位置分析

热门文章

  1. 除了 P站,还有这些 站 ~~
  2. 微信小程序云函数调用成功result返回null
  3. SIM7600连接阿里云
  4. 计算机本科毕业要求,计算机本科毕业论文要求.doc
  5. Hadoop:Browse Directory Couldn‘t upload the file
  6. 【无标题】灵遁者沉思:每个人都有“第三只眼睛”
  7. 有些疑问,阿里云到底是做啥子的呢?
  8. 3脚送话器内部电路图_教你看电路图(全)(20个经典实例)..
  9. 反催收下沉社区,打通丰巢取件码
  10. csgo机器人队友_csgo打人机去掉己方人机 | 手游网游页游攻略大全