Public Module BezierHelper
    ''' <summary>
    ''' 获得二次贝塞尔曲线在某个时刻的位置
    ''' B(t) = PA(1-t)^2+ 2PBt(1-t) + PCt^2
    ''' </summary>
    ''' <param name="PA">起始点</param>
    ''' <param name="bs">二次贝塞尔曲线</param>
    ''' <param name="t">时间t 0~1</param>
    Public Function GetPosition(PA As Point, bs As QuadraticBezierSegment, t As Single) As Point
        Dim pr As Point
        pr.X = PA.X * (1 - t) ^ 2 + 2 * bs.Point1.X * t * (1 - t) + bs.Point2.X * t ^ 2
        pr.Y = PA.Y * (1 - t) ^ 2 + 2 * bs.Point1.Y * t * (1 - t) + bs.Point2.Y * t ^ 2
        Return pr
    End Function

    ''' <summary>
    ''' 获得二次贝塞尔曲线在某个时刻的切线方向
    ''' </summary>
    ''' <param name ="PA">起始点</param>
    ''' <param name="bs">二次贝塞尔曲线</param>
    ''' <param name="t">时间t 0~1</param>
    ''' <returns></returns>
    Public Function GetTangentAngle(PA As Point, bs As QuadraticBezierSegment, t As Single) As Single
        Dim dr As Point
        REM 变量X受自变量时间t 在X方向的变化率
        dr.X = PA.X * 2 * (1 - t) * (-1) +
            2 * bs.Point1.X * ((1 - t) + (-1) * t) +
            bs.Point2.X * 2 * t
        dr.Y = PA.Y * 2 * (1 - t) * -1 +
            2 * bs.Point1.Y * ((1 - t) + (-1) * t) +
            bs.Point2.Y * 2 * t
        Return Math.Atan2(dr.Y, dr.X)
    End Function

    ''' <summary>
    ''' 获得三次贝塞尔曲线在某个时刻的位置
    ''' B(t) = PA(1-t)^3 + 3PBt(1-t)^2 + 3PCt^2(1-t) + PDt^3
    ''' </summary>
    ''' <param name="PA">起始点</param>
    ''' <param name="bs">三次贝塞尔曲线</param>
    ''' <param name="t">时间t 0~1</param>
    Public Function GetPosition(PA As Point, bs As BezierSegment, t As Single) As Point
        Dim pr As Point
        pr.X = PA.X * (1 - t) ^ 3 + 3 * bs.Point1.X * t * (1 - t) ^ 2 _
        + 3 * bs.Point2.X * t ^ 2 * (1 - t) + bs.Point3.X * t ^ 3
        pr.Y = PA.Y * (1 - t) ^ 3 + 3 * bs.Point1.Y * t * (1 - t) ^ 2 _
        + 3 * bs.Point2.Y * t ^ 2 * (1 - t) + bs.Point3.Y * t ^ 3
        Return pr
    End Function

    ''' <summary>
    ''' 获得三次贝塞尔曲线在某个时刻的切线方向
    ''' </summary>
    ''' <param name ="PA">起始点</param>
    ''' <param name="bs">三次贝塞尔曲线</param>
    ''' <param name="t">时间t 0~1</param>
    ''' <returns></returns>
    Public Function GetTangentAngle(PA As Point, bs As BezierSegment, t As Single) As Single
        Dim dr As Point
        REM 变量X受自变量时间t 在X方向的变化率
        dr.X = PA.X * 3 * (1 - t) ^ 2 * (-1) +
            3 * bs.Point1.X * ((1 - t) ^ 2 + t * 2 * (1 - t) * (-1)) +
            3 * bs.Point2.X * (2 * t * (1 - t) + t ^ 2 * (-1)) +
            bs.Point3.X * 3 * t ^ 2

        dr.Y = PA.Y * 3 * (1 - t) ^ 2 * (-1) +
            3 * bs.Point1.Y * ((1 - t) ^ 2 + t * 2 * (1 - t) * (-1)) +
            3 * bs.Point2.Y * (2 * t * (1 - t) + t ^ 2 * (-1)) +
            bs.Point3.Y * 3 * t ^ 2

        Dim angle As Single = Math.Atan2(dr.Y, dr.X) * 180 / 3.14
        'Console.Clear()
        'Console.WriteLine(dr.X.ToString("f2") + "  " + dr.Y.ToString("f2") + " " + angle.ToString("f2"))
        Return angle
    End Function
End Module

求二次、三次贝塞尔曲线的某个时间的位置及切线方向相关推荐

  1. 二次贝塞尔曲线转换为三次贝塞尔曲线

    二次贝塞尔曲线转换为三次贝塞尔曲线 在使用cairo绘图的时候,发现cairo不支持二次贝塞尔曲线的绘制,为了与QT实现的canvas的行为一致,cairo必须同样实现二次贝塞尔曲线的绘制.思路是将二 ...

  2. canvas笔记-二次贝塞尔曲线与三次贝塞尔曲线的用法

    此博文不研究其算法,只记录下其用法. 首先是二次贝塞尔曲线! 函数是这样的 quadraticCurveTo(cpx, cpy, x, y); 其中cpx为贝塞尔控制点x: 其中cpy为贝塞尔控制点y ...

  3. 书小宅之网页设计——二次贝塞尔曲线和三次贝塞尔曲线

    贝塞尔曲线起始点和终止点在曲线上,方向控制点不再曲线上.二次贝塞尔曲线有一个控制点,三次贝塞尔曲线有两个控制点. 二次贝塞尔曲线 定义和用法 quadraticCurveTo() 方法通过使用表示二次 ...

  4. 【HTML 中的二次贝塞尔曲线 和三次贝塞尔曲线】(使用说明详解)

    二次 贝塞尔曲线 和三次 贝塞尔曲线 使用说明 1. 二次 贝塞尔曲线 和三次 贝塞尔曲线 1.1 贝塞尔曲线的 基本知识 1.2 贝塞尔曲线 生成动图 1.3 HTML 中 画贝塞尔曲线的 2 种方 ...

  5. Python+OpenGL绘制任意形状的三次贝塞尔曲线

    推荐阅读: 开学第一课:一定不要这样问老师Python问题 中国大学MOOC"Python程序设计基础"第6次开课时间 推荐教材: <Python程序设计基础与应用(第2版) ...

  6. html贝塞尔曲线在线,【HTML+js+纯前端】三次方贝塞尔曲线手工拟合小工具

    本帖最后由 南郊居士 于 2020-2-18 23:38 编辑 2020.2.18 重要修正: 1. 修正了当图样长宽不同时不能正确显示各控制点的问题. (一整天了都没人吐槽这个问题,看来这个工具还真 ...

  7. OpenGL实现可交互的三维三次贝塞尔曲线(实现鼠标控制)

    系列文章目录 前文:OpenGL实现可交互的三次多项式曲线(控制鼠标可拖拽)https://editor.csdn.net/md/?articleId=109129704 OpenGL实现可交互的三维 ...

  8. OpenGL Cubic Bezier三次贝塞尔曲线修补实例

    OpenGL Cubic Bezier三次贝塞尔曲线修补 先上图,再解答. 正常显示 按下C键 按下W键 按下X键 完整主要的源代码 源代码剖析 先上图,再解答. 正常显示 按下C键 按下W键

  9. 三次贝塞尔曲线平滑多边形

    #pragma once#include "opencv.hpp" #include "StdStrFile.h"void CurvePoly(const st ...

最新文章

  1. 他们用卷积神经网络,发现了名画中隐藏的秘密
  2. golang string切片解析json
  3. CodeForces - 1168B Good Triple(思维+暴力)
  4. 使用代码创建SAP BRF ruleset
  5. 《C语言深度解剖》学习笔记之符号
  6. odbc mysql 配置文件_ODBC连接主流数据库的配置方法
  7. BOW(opencv源码)
  8. detach screen_linux screen命令详解和常见问题解决
  9. 基于RAM的雷达线性调频信号产生
  10. 【原创】调用有道翻译Api翻译Linux命令accessdb输出内容
  11. 校园二手交易平台-简要需求分析
  12. 什么相片可以两张弄成一张_美图秀秀怎么把两张图片合成一张?美图秀秀两张图片融合方法汇总...
  13. 三星 android recovery,三星所有机型如何进入recovery模式的方法
  14. Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes解决方法
  15. mysql .frm_mysql通过frm向mysql导入表结构及数据
  16. ElasticSearch 索引设计指南
  17. vchart 坐标轴标题_ECharts xAxis配置 x坐标轴名称的文本样式
  18. vosk实时语音识别
  19. 三个人的友谊显的有些拥挤了...
  20. 3月13日云栖精选夜读 | Serverless 风暴来袭,前端工程师如何应对?

热门文章

  1. 快速擦除硬盘数据的一种方法
  2. 2023年全国最新安全员精选真题及答案67
  3. 制作6D姿态数据集常用的BCH码背景图下载
  4. freeSSL 申请证书
  5. 简报 | 网信办:区块链信息需提供商备案
  6. 频繁项集挖掘算法在告警关联中的应用
  7. 几种方法,彻底删除电脑弹窗广告,还你一个干净的桌面~
  8. Integer值的范围
  9. 关于静态局部变量与静态外部变量
  10. 短视频简单无脑玩法,播放量10w+的藏头诗玩法,操作思路分享给你!