desmos和webgl绘制线条

目录

desmos绘制

webgl绘制

将线段坐标生成三角化坐标

处理斜接线段

 处理圆角

尖角 

 


先在desmos上面完成线条lineJoin绘制的,再将代码和公式转到js用webgl绘制.

desmos绘制

示例

desmos计角斜接角时,需要用到的一些函数。在desmos定义成公共函数,


这里填充线条的模式也是采用类似webgl中的三角形模式

webgl绘制

将线段坐标生成三角化坐标
 /*** @param {number} lineWidth* @param {"bevel" | "miter" | "round"} lineJoin* @param {"butt" | "round" | "square"} lineCap*/function generateLineVertices(positions, lineWidth, lineJoin = 'miter', lineCap = 'butt', miterLimit = 10) {const vertices = [];const halfWidth = lineWidth / 2;for (let i = 0; i < positions.length - 1; i++) {const p1 = positions[i];const p2 = positions[i + 1];// 计算线段法线const dx = p2[0] - p1[0];const dy = p2[1] - p1[1];const len = Math.sqrt(dx * dx + dy * dy);const nx = -dy / len;const ny = dx / len;// 计算顶点偏移const offsetX = nx * halfWidth;const offsetY = ny * halfWidth;// 两条边const left1 = [p1[0] - offsetX, p1[1] - offsetY]; const right1 = [p1[0] + offsetX, p1[1] + offsetY];const left2 = [p2[0] - offsetX, p2[1] - offsetY]; const right2 = [p2[0] + offsetX, p2[1] + offsetY];// 将带状三角形的顶点加入数组vertices.push(...left1, ...right1, ...left2, ...right2);// 处理线端样式if (i === 0) {generateCapVertices(p1,p2, halfWidth, vertices, true, lineCap); // 起点圆头} if (i === positions.length - 2) {generateCapVertices(p2,p1, halfWidth, vertices, false, lineCap); // 终点圆头}// 处理线段连接样式if (i < positions.length - 2) {const p3 = positions[i + 2];handleLineJoin(p2, p1, p3, lineWidth, lineJoin, miterLimit, vertices);}}return new Float32Array(vertices);}
处理斜接线段
  // 处理线段连接function handleLineJoin(current, prev, next, lineWidth, lineJoin, miterLimit, vertices) {// 根据 lineJoin 类型处理拐角连接if (lineJoin === 'miter') {handleMiterJoin(current, prev, next, lineWidth, vertices)} else if (lineJoin === 'bevel') {// handleBevelJoin(current, prev, next, lineWidth, vertices);} else if (lineJoin === 'round') {handleRoundJoin(current, prev, next, lineWidth, vertices);}}
 处理圆角
         // 处理圆角连接function handleRoundJoin(current, prev, next, lineWidth, vertices) {const normal1 = computeDirection(prev, current);const normal2 = computeDirection(next, current);const cos=computeDot(normal1,normal2)if(cos==1){return}const normal1_perpendicular=[-normal1[1],normal1[0]]const normal2_perpendicular=[-normal2[1],normal2[0]]let angle_1=Math.atan2(normal1_perpendicular[1],normal1_perpendicular[0])const halfWidth = lineWidth / 2;const steps = 10; const angleStep =Math.PI / steps; let startAngle = angle_1//-(Math.PI*0.5);let prevX,prevY;// 圆弧生成点for (let i = 0; i <= steps; i++) {const angle = startAngle + i * angleStep;const x = current[0] + Math.cos(angle) * halfWidth;const y = current[1] + Math.sin(angle) * halfWidth;if (i > 0) {vertices.push(current[0], current[1], prevX, prevY, x, y);}prevX = x;prevY = y;}}
尖角 
// 尖角 
function handleMiterJoin(current, prev, next, lineWidth, vertices) {const halfWidth = lineWidth / 2;const l1=subtract(prev,current)const l2=subtract(next,current)const d=computeCross(l1,l2)if(d===0){return}const l1_n=normalize(l1)const l2_n=normalize(l2)const lineAngle=computeDot(l1_n,l2_n)if(lineAngle==1){return}//const sign=const bisector=normalize(add(l1_n,l2_n))const ab_n=computeNormal(prev,current)const cos=computeDot(bisector,ab_n)if(cos===1){return}const miterLength=halfWidth/cos;const b1=add(current,multiplyScalar(bisector,miterLength))const b2=add(current,multiplyScalar(bisector,-miterLength))if(d<0){vertices.push(...b1)}else{vertices.push(...b2)}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/448070.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【全网最全】AI产品经理面试高频100题答案解析

详细的目录如下&#xff0c;需要的小伙伴可以详细看一下~ 第一章&#xff1a;机器学习和深度学习的关系 第二章&#xff1a;机器学习7大经典算法 算法一&#xff1a;K近邻算法【分类算法】 1.1 KNN 算法的实现原理 1.2 KNN应用场景举例&#xff1a;预测候选人能不能拿到 O…

心觉:激活潜意识财富密码:每天一练,财富自动来

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作200/1000天 为什么有些人总是轻而易举地吸引到财富 而你却努力多年仍然徘徊在财务的困境中&#xff1f; 你每天都在辛苦工作&…

LabVIEW离心泵监测系统

LabVIEW的离心泵监测系统在监测离心泵的运行状态&#xff0c;通过实时数据采集和故障预警&#xff0c;提高泵的运行效率和安全性。系统集成了多种传感器&#xff0c;利用Modbus RTU协议和RS485串口总线进行数据通信&#xff0c;通过LabVIEW软件平台实现数据处理和用户界面交互。…

使用 MongoDB 构建 AI:利用实时客户数据优化产品生命周期

在《使用 MongoDB 构建 AI》系列博文中&#xff0c;我们看到越来越多的企业正在利用 AI 技术优化产品研发和用户支持流程。例如&#xff0c;我们介绍了以下案例&#xff1a; Ventecon 的 AI 助手帮助产品经理生成和优化新产品规范 Cognigy 的对话式 AI 帮助企业使用任意语言&a…

Opencv:FisherFace算法实现人脸检测

目录 简介 实现步骤 1. 图像读取和预处理 2. 创建和训练识别器 3. 图像识别和结果展示 4、结果展示 总结 简介 在人工智能和计算机视觉领域&#xff0c;人脸识别是一项非常有趣且实用的技术。本文将向您介绍如何使用OpenCV库以及FisherFace算法实现人脸识别。我们将一步…

数据可视化-使用python制作词云图(附代码)

想象一下&#xff0c;当你写完一篇日记或者一篇文章后&#xff0c;想要知道里面哪些词语出现得最多。这时候&#xff0c;词云图就能派上用场了。它会统计出文章里每个词语出现的次数&#xff0c;然后把这些词语以不同大小的字体展示出来&#xff0c;出现次数越多的词语&#xf…

【MATLAB代码】基于RSSI原理的蓝牙定位程序(N个锚点、三维空间),源代码可直接复制

文章目录 介绍主要功能技术细节适用场景程序结构运行截图源代码详细教程:基于RSSI的蓝牙定位程序1. 准备工作2. 代码结构2.1 清理工作环境2.2 定义参数2.3 生成锚点坐标2.4 定义信号强度与距离的关系2.5 模拟未知点的位置2.6 定位函数2.7 绘图2.8 输出结果2.9 定义定位函数3. …

SSL---SSL certificate problem

0 Preface/Foreword 0.1 SSL certificate problem 开发过程中&#xff0c;gitlab-runner连接gitlab时候出现SSL 证书问题。 场景&#xff1a;公司的gitlab runner服务器引入了SSL证书&#xff0c;每年都会主动更新一次。当前的gitlab-runner运行在PC机器上&#xff0c;但是g…

某乎接口zse96解析(附带可直接运行js)

某乎接口zse96解析 下面是作者呕心沥血,观看各路大神和某乎js拼接在一起的js,附带浏览器环境,可以直接运行示例接口多请求几次发现,出来zse96在变化之外,其余的基本不变,那么源码中直接搜索x-zse-96,得出下面2个函数 var tE = eo(te, tp.body, {xUDId: tv,zse93: tT,xApp…

IO编程--拷贝文件、文件总行数输出、时间打印

一、使用fread和fwrite完成两个文件的拷贝&#xff0c;要求源文件和目标文件由外界输入 代码如下: #include <myhead.h> int main(int argc, const char *argv[]) {//判断是否输入两个文件名if(argc!3){fprintf(stderr,"文件个数错误");return -1;}//以读形式打…

【去哪儿-注册安全分析报告-缺少轨迹的滑动条】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

Linux系统——lvm逻辑卷

Linux系统——lvm逻辑卷 一、lvm逻辑卷1、lvm操作流程2、操作指令 二、逻辑卷操作1、创建逻辑卷1.1 /dev/cloud/openstack 5G xfs /cloud/openstack1.2 /dev/cloud/docker 10G ext4 /cloud/docker 2、逻辑卷扩容2.1 扩容流程2.2 需求一&#xff1a;扩容ext4文件系统的逻辑卷2.3…

4款高效电脑录屏软件推荐:高清、不卡顿、无水印

在当今这个数字化时代&#xff0c;屏幕录制技术已经成为教育工作者、游戏玩家以及各类数字内容创作者不可或缺的工具。一款高效、稳定的录屏软件不仅能够帮你轻松捕捉屏幕上的精彩瞬间&#xff0c;还能提升你的内容创作效率。今天&#xff0c;我们就为大家推荐5款高清、不卡顿、…

斯坦福大学提出电影剧本可视化工具ScriptViz:能够根据剧本中的文本和对话自动检索相关的电影画面,帮助剧作家更好地构思和调整剧情

title:斯坦福大学提出电影剧本可视化工具ScriptViz&#xff1a;能够根据剧本中的文本和对话自动检索相关的电影画面&#xff0c;帮助剧作家更好地构思和调整剧情 斯坦福大学的研究者们开发了一个电影剧本可视化工具ScriptViz工具&#xff0c;ScriptViz的工作原理可以简单地理解…

oceanbase的日志量太大,撑爆磁盘,修改下日志级别

oceanbase的日志量太大&#xff0c;撑爆磁盘&#xff0c;修改下日志级别&#xff1a; [adminlnpg ~]$ obclient -h127.0.0.1 -uroot -P2881 -plinux123 Welcome to the OceanBase. Commands end with ; or \g. Your OceanBase connection id is 3221561020 Server version: O…

echarts显示隐藏柱状图柱子的背景色

showBackground: true, //控制是否显示背景色backgroundStyle: {// color: rgba(180, 180, 180, 0.4) //背景色的颜色color: red} 关键代码是 showBackground: true, //控制是否显示背景色 设置为false或者直接而不写就是不显示背景色&#xff0c;默认是不显示背景色 true的时…

IO作业代码

问题 通过 fwrite和 fread去拷贝 文件到另外一个文件上 #include<myhead.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include<errno.h> #include<time.h> int main(int argc, const char *argv[]) { FILE *fp fo…

ES 全文检索完全匹配高亮查询

我们ES会将数据文字进行拆词操作&#xff0c;并将拆解之后的数据保存到倒排索引当中几十使用文字的一部分也能查询到数据&#xff0c;这种检索方式我们就称之为全文检索&#xff0c;ES的查询结果也会倒排索引中去查询匹配 下面的查询结果中输入的词&#xff0c;就是输入小也可…

【量化交易】聚宽安装

安装JQData 更换源&#xff1a; 如果使用的是pip默认的PyPI源&#xff0c;可以尝试更换为一个更快的国内镜像源。例如阿里云、豆瓣等提供的PyPI镜像。 更改方法可以通过设置环境变量或者在pip命令中直接指定&#xff1a; PS C:\Users\bilirjs\Documents> pip config set …

第100+28步 ChatGPT学习:概率校准 Bayesian Calibration

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…