二阶贝塞尔曲线生成弧线

这篇具有很好参考价值的文章主要介绍了二阶贝塞尔曲线生成弧线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

本文分享一个二阶贝塞尔曲线曲线生成弧线的算法。

效果

二阶贝塞尔曲线生成弧线,跟牛老师一起学WEBGIS,GIS加油站,弧段,被萨尔曲线,贝塞尔曲线

实现

1. 封装方法

class ArcLine {
  constructor(from, to, num = 100) {
    this.from = from;
    this.to = to;
    this.num = num;
    return this.getPointList();
  }
  getPointList() {
    const { from, to } = this
    const ctrlPoint = this.getOffsetPoint(from, to);
    const points = this.create2PBezier(from, ctrlPoint, to)
    return points
  }
  getOffsetPoint(start, end) {
    const distance = this.getDistance(start, end) / 2; //除以3?
    let angle, dX, dY;
    const mp = [start[0], start[1]];
    const deltaAngle = - Math.PI / 8; //偏移0.2弧度
    if (start[0] != end[0] && start[1] != end[1]) { //斜率存在
      const k = (end[1] - start[1]) / (end[0] - start[0]);
      angle = Math.atan(k);
    } else if (start[0] == end[0]) { //垂直线
      angle = (start[1] <= end[1] ? 1 : -1) * Math.PI / 2;
    } else { //水平线
      angle = 0;
    }
    if (start[0] <= end[0]) {
      angle -= deltaAngle;
      dX = Math.round(Math.cos(angle) * distance);
      dY = Math.round(Math.sin(angle) * distance);
      mp[0] += dX;
      mp[1] += dY;
    } else {
      angle += deltaAngle;
      dX = Math.round(Math.cos(angle) * distance);
      dY = Math.round(Math.sin(angle) * distance);
      mp[0] -= dX;
      mp[1] -= dY;
    }
    return mp;
  }

  getDistance(p1, p2) {
    return Math.sqrt((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]));
  }

  bezier2P(p0, p1, p2, t) {
    const P0 = p0 * Math.pow(1 - t, 2);
    const P1 = p1 * 2 * t * (1 - t);
    const P2 = p2 * t * t;
    return P0 + P1 + P2;
  }

  getBezierNowPoint2P(p0, p1, p2, num, tick) {
    return {
      x: this.bezier2P(p0[0], p1[0], p2[0], num * tick),
      y: this.bezier2P(p0[1], p1[1], p2[1], num * tick),
    };
  }
  create2PBezier(p0, p1, p2) {
    const num = this.num
    const t = 1 / (num - 1);
    const points = [];
    for (let i = 0; i < num; i++) {
      const point = this.getBezierNowPoint2P(p0, p1, p2, i, t);
      points.push([point.x, point.y]);
    }
    return points;
  }
}

2. 前端调用

示例使用openlayers实现。文章来源地址https://www.toymoban.com/news/detail-813644.html

let vetSource = new ol.source.Vector({
  features: [],
});
let vectorLayer = new ol.layer.Vector({
  source: vetSource,
  style: new ol.style.Style({
    stroke: new ol.style.Stroke({
      color: "#f00",
      width: 2,
    }),
  }),
});
map.addLayer(vectorLayer)

function addAllLines() {
  let features = [];
  for (let i = 0; i < pointData.length; i++) {
    const after = pointData[i];
    const from = [101.797439042302, 36.5937248286007];
    const to = [after.lon, after.lat].map(Number);
    let points = new ArcLine(from, to);
    points = points.map((p) => ol.proj.fromLonLat(p));
    lineData.push(points);

    features.push(
      new ol.Feature({
        geometry: new ol.geom.LineString(points),
      })
    );
  }
  vetSource.addFeatures(features);
  map.getView().animate({
    center: [12474607.173951693, 4278483.982819865],
    zoom: 3.8,
  });
}

到了这里,关于二阶贝塞尔曲线生成弧线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CSS动画中的贝塞尔曲线

    最近在学习CSS动画,其中动画时间函数的部分涉及到了 贝塞尔曲线 的相关知识。对于这部分知识,之前一直没有好好学习过,正好借着这个机会学习下。 首先简单介绍下贝塞尔曲线。 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲

    2024年02月09日
    浏览(68)
  • unity 曲线可视化图表制作(lineRenderer + 贝塞尔曲线)

    需求要实现一个动态变化的曲线 思路: 分为两部分:画线和平滑曲线 首先解决画线问题: 1.lineRenderer 2.texture的setpixel 肯定选已经做好的轮子1啦 平滑曲线思路: 1.抛物线 2.贝塞尔曲线 抛物线做连续的曲线太抽象了 肯定选贝塞尔曲线 先了解一下贝塞尔曲线 一次贝塞尔 对应

    2023年04月08日
    浏览(47)
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    1. 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线。 2. 原理介绍 2.1 曲线的创建 unity建立网格曲线可以参考Unity程序化网格体的实现方法。主要分为顶点,三角面,UV和法线。笔者有类似的文章unity 线绳管道纯代码创建方法_,详细的讲解了网格线的

    2024年02月04日
    浏览(41)
  • Unity中的数学基础——贝塞尔曲线

    一:前言  一条贝塞尔曲线是由一组定义的控制点P0到 Pn,n=1为线性,n=2为二次......第一个和最后一个控制点称为起点和终点,中间的控制点一般不会位于曲线上  获取两个点之间的点就是通过线性插值( Mathf.Lerp),0 = t = 1 二:贝塞尔曲线公式 ——线性公式:给定点P0、P

    2024年02月11日
    浏览(38)
  • 贝塞尔曲线的python实现(简单易理解)

    贝塞尔曲线在计算机图形学中被大量使用,通常可以产生平滑的曲线。比如ps中的钢笔工具,就是利用的这种原理。由于用计算机画图大部分时间是操作鼠标来掌握线条的路径,与手绘的感觉和效果有很大的差别。即使是一位精明的画师能轻松绘出各种图形,拿到鼠标想随心

    2024年02月16日
    浏览(42)
  • Godot插值、贝塞尔曲线和Astar寻路

    线性插值是采用一次多项式上进行的插值计算,任意给定两个值A和B,那么在A和B之间的任意值可以定义为: P(t) = A * (1 - t) + B * t,0 = t = 1。 数学中用于线性拟合,游戏应用可以做出跟随效果(宠物跟随、npc跟随) 贝塞尔是插值的应用之一。贝塞尔曲线是为工业设计,是图形

    2024年04月14日
    浏览(42)
  • Unity ——使用贝塞尔曲线对三维管状物体进行弯曲

    参考链接:【Unity】弹性鱼竿简单实现-通过贝塞尔曲线修改Mesh - 简书 参考论文:吴晓亮, 黄襄念. Unity 中使用贝塞尔曲线对三维物体进行弯曲[J]. 现代计算机, 2016 (5): 57-59. unity项目下载:https://download.csdn.net/download/weixin_43042683/87690343 效果图 随着虚拟现实的发展,在游戏引擎中

    2024年02月11日
    浏览(53)
  • Bezier Curve 贝塞尔曲线 - 在Unity中实现路径编辑

    贝塞尔曲线( Bezier Curve ),又称贝兹曲线或贝济埃曲线,是计算机图形学中相当重要的参数曲线,在我们常用的软件如 Photo Shop 中就有贝塞尔曲线工具,本文简单介绍贝塞尔曲线在Unity中的实现与应用。 给顶点P 0 、P 1 ,只是一条两点之间的直线,公式如下: B(t) = P 0 + (P

    2024年01月23日
    浏览(40)
  • 贝塞尔曲线(Bezier Curve)原理、公式推导及matlab代码实现

    目录 参考链接 定义 直观理解  公式推导 一次贝塞尔曲线(线性公式) 二次贝塞尔曲线(二次方公式)  三次贝塞尔曲线(三次方公式) n次贝塞尔曲线(一般参数公式) 代码实现 贝塞尔曲线(Bezier Curve)原理及公式推导_bezier曲线-CSDN博客 贝塞尔曲线(Bezier Curve)原理、公

    2024年01月20日
    浏览(47)
  • 【路径规划】局部路径规划算法——贝塞尔曲线法(含python实现 | c++实现)

    路径规划与轨迹跟踪系列算法 曲线杂谈(二):Bezier曲线的特殊性质 贝塞尔曲线的特性总结 贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔( Pierre Bézier)发表,他运用贝塞尔曲线来为汽车的主体进行设计。 贝塞尔曲线是应用于二维图形应用程序的数学曲线,由一组称为

    2024年02月14日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包