穿过已知点画平滑曲线(3次贝塞尔曲线)

2023-05-16

为了把一串点连成光滑的曲线,先研究贝塞尔曲线,又搞B样条插值。。。。都没有成功(数学没那么强)。

后来在

[翻译] AGG 之贝塞尔插值 ”http://liyiwen.javaeye.com/blog/705489  。看到一种比较好的方法:

运用贝塞尔曲线的光滑性来穿过这些点。

大致思路就是 先算出相邻原始点的中点,在把相邻中点连成的线段平移到对应的原始点,以平移后的中点作为控制点,相邻原始点为起始点画贝塞尔曲线,这样就保证了连接处的光滑。而贝塞尔曲线本身是光滑的,所以就把这些原始点用光滑曲线连起来了。


我封装了一个函数,留着以后用。

(c++版,其它语言只要把数组和可变数组稍微变一下就能用)

 

view plain
  1. void createCurve(CvPoint *originPoint,int originCount,vector<CvPoint> &curvePoint){  
  2.     //控制点收缩系数 ,经调试0.6较好,CvPoint是opencv的,可自行定义结构体(x,y)  
  3.     float scale = 0.6;  
  4.     CvPoint midpoints[originCount];  
  5.     //生成中点       
  6.     for(int i = 0 ;i < originCount ; i++){      
  7.         int nexti = (i + 1) % originCount;  
  8.         midpoints[i].x = (originPoint[i].x + originPoint[nexti].x)/2.0;  
  9.         midpoints[i].y = (originPoint[i].y + originPoint[nexti].y)/2.0;  
  10.     }      
  11.       
  12.     //平移中点  
  13.     CvPoint extrapoints[2 * originCount];   
  14.     for(int i = 0 ;i < originCount ; i++){  
  15.          int nexti = (i + 1) % originCount;  
  16.          int backi = (i + originCount - 1) % originCount;  
  17.          CvPoint midinmid;  
  18.          midinmid.x = (midpoints[i].x + midpoints[backi].x)/2.0;  
  19.          midinmid.y = (midpoints[i].y + midpoints[backi].y)/2.0;  
  20.          int offsetx = originPoint[i].x - midinmid.x;  
  21.          int offsety = originPoint[i].y - midinmid.y;  
  22.          int extraindex = 2 * i;  
  23.          extrapoints[extraindex].x = midpoints[backi].x + offsetx;  
  24.          extrapoints[extraindex].y = midpoints[backi].y + offsety;  
  25.          //朝 originPoint[i]方向收缩   
  26.          int addx = (extrapoints[extraindex].x - originPoint[i].x) * scale;  
  27.          int addy = (extrapoints[extraindex].y - originPoint[i].y) * scale;  
  28.          extrapoints[extraindex].x = originPoint[i].x + addx;  
  29.          extrapoints[extraindex].y = originPoint[i].y + addy;  
  30.            
  31.          int extranexti = (extraindex + 1)%(2 * originCount);  
  32.          extrapoints[extranexti].x = midpoints[i].x + offsetx;  
  33.          extrapoints[extranexti].y = midpoints[i].y + offsety;  
  34.          //朝 originPoint[i]方向收缩   
  35.          addx = (extrapoints[extranexti].x - originPoint[i].x) * scale;  
  36.          addy = (extrapoints[extranexti].y - originPoint[i].y) * scale;  
  37.          extrapoints[extranexti].x = originPoint[i].x + addx;  
  38.          extrapoints[extranexti].y = originPoint[i].y + addy;  
  39.            
  40.     }      
  41.       
  42.     CvPoint controlPoint[4];  
  43.     //生成4控制点,产生贝塞尔曲线  
  44.     for(int i = 0 ;i < originCount ; i++){  
  45.            controlPoint[0] = originPoint[i];  
  46.            int extraindex = 2 * i;  
  47.            controlPoint[1] = extrapoints[extraindex + 1];  
  48.            int extranexti = (extraindex + 2) % (2 * originCount);  
  49.            controlPoint[2] = extrapoints[extranexti];  
  50.            int nexti = (i + 1) % originCount;  
  51.            controlPoint[3] = originPoint[nexti];      
  52.            float u = 1;  
  53.            while(u >= 0){  
  54.                int px = bezier3funcX(u,controlPoint);  
  55.                int py = bezier3funcY(u,controlPoint);  
  56.                //u的步长决定曲线的疏密  
  57.                u -= 0.005;  
  58.                CvPoint tempP = cvPoint(px,py);  
  59.                //存入曲线点   
  60.                curvePoint.push_back(tempP);  
  61.            }      
  62.     }  
  63. }  
  64. //三次贝塞尔曲线  
  65. float bezier3funcX(float uu,CvPoint *controlP){  
  66.    float part0 = controlP[0].x * uu * uu * uu;  
  67.    float part1 = 3 * controlP[1].x * uu * uu * (1 - uu);  
  68.    float part2 = 3 * controlP[2].x * uu * (1 - uu) * (1 - uu);  
  69.    float part3 = controlP[3].x * (1 - uu) * (1 - uu) * (1 - uu);     
  70.    return part0 + part1 + part2 + part3;   
  71. }      
  72. float bezier3funcY(float uu,CvPoint *controlP){  
  73.    float part0 = controlP[0].y * uu * uu * uu;  
  74.    float part1 = 3 * controlP[1].y * uu * uu * (1 - uu);  
  75.    float part2 = 3 * controlP[2].y * uu * (1 - uu) * (1 - uu);  
  76.    float part3 = controlP[3].y * (1 - uu) * (1 - uu) * (1 - uu);     
  77.    return part0 + part1 + part2 + part3;   
  78. }   

翻译] AGG 之贝塞尔插值

文章分类:综合技术

原文地址:http://www.antigrain.com/research/ 
bezier_interpolation/index.html#PAGE_BEZIER_INTERPOLATION

Interpolation with Bezier Curves  贝塞尔插值

A very simple method of smoothing polygons 一种非常简单的多边形平滑方法

翻译:唐风

之前 comp.graphic.algorithms 上有一个讨论,是关于怎么样使用曲线对多边形进行插值处理,使得最终产生的曲线是光滑的而且能通过所有的顶点。Gernot Hoffmann 建议说使用著名的 B-Spline 来进行插值。这里有他当时的文章 。B-Spline 在这里效果很好,它看起来就像是一个固定在多边形顶点上的橡皮尺(elastic ruler)。

spline_polygon1    spline_polygon2

 


 

bezier_interpolation但我有个大胆的推测,我觉得肯定还存在更简单的方法。比如,使用三次贝塞曲线(cubic Bezier)进行近似。贝塞尔曲线有两个固定点(起点和终点),另加两个决定曲线形状的控制点(CP)。关于贝塞尔曲线的更多知识可以在搜索引擎中找到,比如,你可以参考Paul Bourke 的站点 。 现在给贝塞尔曲线的锚点(固定点),也就是多边形的某一对顶点,那么问题是,我们怎么计算控制点的位置?我运行 Xara X 然后画出了右边这个图形,这很简单,所以我决定尝试下计算出它们的坐标。很显然,多边形两条相邻边的两个控制点与这两个控制点之间的顶点应该在一条直线 上,只有这样,两条相邻的插值曲线才能平滑地连接在一起。所以,这两个控制点应该是相对于顶点是对称的,不过,也不全是……,因为真正的对称就要求它们与 中心点的距离应该是相等的,但对于我们的情况中并不完全是这样的。一开始,我试着先算出多边形两条边的角平分线,然后把控制点放在这条角平分线的垂直线 上。但从图上可以看到,控制点的连线并不会总是垂直于角平分线的。

 


 

最终,我找到一个非常简单的办法,不需要任何复杂的数学计算。首先,我们计算出多边形所有边线的中点,Ai。

bezier_interpolation_s1

 


 

然后连接起相邻边中点,得到很多线段,记为 Ci 。并用图记的方法计算出 Bi 点。

bezier_interpolation_s2

 


 

最后一步,只需要简单地将 Ci 进行平移,平移的路径就是每条线段上 Bi 到对应顶点的路径。就这样,我们计算出了贝塞尔曲线的控制点,平滑的结果看起来也很棒。

bezier_interpolation_s3

 


 

这里还可以做一点小小的改进,因为我们已经得到了一条决定控制点的直线,所以,我们可以根据需要,使控制点在这条直线上移动,这样可以改变插值曲线 的状态。我使用了一个与控制点和顶点初始距离相关的系数 K ,用来沿直线移动控制点。控制点离顶点越远,图形看起来就越锐利。

bezier_interpolation_s4

 


 

下面是用原始形状和系统K=1.0的贝塞尔插值两种方法来描画的 SVG 的狮子。

bezier_lion1   bezier_lion2

 


 

下面是放大图

bezier_lion3   bezier_lion4

 


 

这个方法对于自相关的多边形也适用,下面的例子可以看到,结果非常有意思:

bezier_self_intersecting1

 


 

bezier_self_intersecting2

 


 

bezier_self_intersecting3

 


 

这个方法只是探索和经验式的,如果从严格的数学模型的角度看它可能是错误的。但在实际使用中的效果已经足够好了,而 且这个方法只需要最小的计算量。下面的代码就是用来画出上面狮子图像的。这些代码并没有进行优化,只是用来演示的。里面有些变量计算了两次,在实际程序 中,如果连续的步骤中都用到同一个变量值,我们可以先缓存变量值进行复用(以避免重复的计算)。


This method is pure heuristic and empiric. It probably gives 
a wrong result from the point of view of strict mathematical 
modeling. But in practice the result is good enough and it 
requires absolute minimum of calculations. Below is the source code
that has been used to generate the lions shown above. It's
not optimal and just an illustration. It calculates some variables 
twice, while in real programs we can store and reuse them in the 

  
  
  1. // Assume we need to calculate the control  
  2.    // points between (x1,y1) and (x2,y2).  
  3.    // Then x0,y0 - the previous vertex,  
  4.    //      x3,y3 - the next one.  
  5.   
  6.    double xc1 = (x0 + x1) / 2.0;  
  7.    double yc1 = (y0 + y1) / 2.0;  
  8.    double xc2 = (x1 + x2) / 2.0;  
  9.    double yc2 = (y1 + y2) / 2.0;  
  10.    double xc3 = (x2 + x3) / 2.0;  
  11.    double yc3 = (y2 + y3) / 2.0;  
  12.   
  13.    double len1 = sqrt((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0));  
  14.    double len2 = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));  
  15.    double len3 = sqrt((x3-x2) * (x3-x2) + (y3-y2) * (y3-y2));  
  16.   
  17.    double k1 = len1 / (len1 + len2);  
  18.    double k2 = len2 / (len2 + len3);  
  19.   
  20.    double xm1 = xc1 + (xc2 - xc1) * k1;  
  21.    double ym1 = yc1 + (yc2 - yc1) * k1;  
  22.   
  23.    double xm2 = xc2 + (xc3 - xc2) * k2;  
  24.    double ym2 = yc2 + (yc3 - yc2) * k2;  
  25.   
  26.    // Resulting control points. Here smooth_value is mentioned  
  27.    // above coefficient K whose value should be in range [0...1].  
  28.    ctrl1_x = xm1 + (xc2 - xm1) * smooth_value + x1 - xm1;  
  29.    ctrl1_y = ym1 + (yc2 - ym1) * smooth_value + y1 - ym1;  
  30.   
  31.    ctrl2_x = xm2 + (xc2 - xm2) * smooth_value + x2 - xm2;  
  32.    ctrl2_y = ym2 + (yc2 - ym2) * smooth_value + y2 - ym2;  
consecutive steps.

使用三次贝塞尔近似的代码:



  
  
  1. // Number of intermediate points between two source ones,  
  2. // Actually, this value should be calculated in some way,  
  3. // Obviously, depending on the real length of the curve.  
  4. // But I don't know any elegant and fast solution for this  
  5. // problem.  
  6. #define NUM_STEPS 20  
  7.   
  8. void curve4(Polygon* p,  
  9.             double x1, double y1,   //Anchor1  
  10.             double x2, double y2,   //Control1  
  11.             double x3, double y3,   //Control2  
  12.             double x4, double y4)   //Anchor2  
  13. {  
  14.     double dx1 = x2 - x1;  
  15.     double dy1 = y2 - y1;  
  16.     double dx2 = x3 - x2;  
  17.     double dy2 = y3 - y2;  
  18.     double dx3 = x4 - x3;  
  19.     double dy3 = y4 - y3;  
  20.   
  21.     double subdiv_step  = 1.0 / (NUM_STEPS + 1);  
  22.     double subdiv_step2 = subdiv_step*subdiv_step;  
  23.     double subdiv_step3 = subdiv_step*subdiv_step*subdiv_step;  
  24.   
  25.     double pre1 = 3.0 * subdiv_step;  
  26.     double pre2 = 3.0 * subdiv_step2;  
  27.     double pre4 = 6.0 * subdiv_step2;  
  28.     double pre5 = 6.0 * subdiv_step3;  
  29.   
  30.     double tmp1x = x1 - x2 * 2.0 + x3;  
  31.     double tmp1y = y1 - y2 * 2.0 + y3;  
  32.   
  33.     double tmp2x = (x2 - x3)*3.0 - x1 + x4;  
  34.     double tmp2y = (y2 - y3)*3.0 - y1 + y4;  
  35.   
  36.     double fx = x1;  
  37.     double fy = y1;  
  38.   
  39.     double dfx = (x2 - x1)*pre1 + tmp1x*pre2 + tmp2x*subdiv_step3;  
  40.     double dfy = (y2 - y1)*pre1 + tmp1y*pre2 + tmp2y*subdiv_step3;  
  41.   
  42.     double ddfx = tmp1x*pre4 + tmp2x*pre5;  
  43.     double ddfy = tmp1y*pre4 + tmp2y*pre5;  
  44.   
  45.     double dddfx = tmp2x*pre5;  
  46.     double dddfy = tmp2y*pre5;  
  47.   
  48.     int step = NUM_STEPS;  
  49.   
  50.     // Suppose, we have some abstract object Polygon which  
  51.     // has method AddVertex(x, y), similar to LineTo in  
  52.     // many graphical APIs.  
  53.     // Note, that the loop has only operation add!  
  54.     while(step--)  
  55.     {  
  56.         fx   += dfx;  
  57.         fy   += dfy;  
  58.         dfx  += ddfx;  
  59.         dfy  += ddfy;  
  60.         ddfx += dddfx;  
  61.         ddfy += dddfy;  
  62.         p->AddVertex(fx, fy);  
  63.     }  
  64.     p->AddVertex(x4, y4); // Last step must go exactly to x4, y4  
  65. }  

你可以下载一个能运行的画狮子的例子,对它进行旋转和缩放,也可以生成一些随机的多边形。点左键并拖动它可以围绕中 心点旋转和缩放图像。点右键并从左向右拖动,可以改变系统数K。 K=1时大约是距窗口左边100像素处。每次双击会产生一个随机的多边形,对于这些多边形,也可以进行旋转、缩放以及改变K值的操作。

转自:http://blog.csdn.net/microchenhong/article/details/6316332

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

穿过已知点画平滑曲线(3次贝塞尔曲线) 的相关文章

  • vmware占用磁盘空间增加(ubuntu虚拟机占用空间小)

    vmware占用磁盘空间大 xff0c 但是用df h指令看ubuntu虚拟机占用的空间没有这么大 xff0c 可以试着用下面的三种方法清理vmware占用的空间 方法一 xff1a 使用vmware自带的工具就能收回占用的部分空间 那个工
  • 进临界区(关全局中断)是否会影响数据的接收?

    在嵌入式的编程中 xff0c 经常会使用嵌入式实时操作系统 xff0c 比如FreeRTOS xff0c RTT等 而在使用这些操作系统时 xff0c 会有一个临界区的概念 xff0c 一般操作是 1 xff0c 进入临界区 xff1b 2
  • source insight 4.0 护眼背景色设置

    1 xff0c 打开source insight 4 0 2 xff0c 选择options下的preferences 3 xff0c 选择window background xff0c 双击打开 xff1b 4 xff0c 在颜色中将色调
  • octet和byte

    在看BLE协议时 xff0c 看到了数据包格式的定义 packet format xff0c 定义如下 xff1a Preamble 1 octet Access Address 4 octets PDU 2 to 257 octets C
  • 如何解决SSL/TLS握手过程中失败的错误?

    Fixes for the SSL TLS Handshake Failed error for both internet users and site owners It s time for another technical art
  • 学校人力资源管理系统——逻辑结构设计

    E R 图向关系模型的转换 第一步 把六个实体类型转化成五个模式 xff1a 教职工 职工编号 xff0c 姓名 xff0c 性别 xff0c 出生年份 xff0c 学历 xff0c 民族 xff0c 婚姻状态 xff0c 政治面貌 xff
  • 无线持续攻击(wireless duration attack)

    抓空口包时发现一种奇怪的ack帧 duration位长度是32767us 看到omnipeek将它定义为wireless duration attack 看起来是路由器回复设备的ack 而设备也是发了一个奇怪的pspoll帧 节能位置1 乱
  • .bashrc文件在哪?

    linux的bashrc文件在 home目录下 xff0c 但是是一个隐藏bai文件 xff0c 在文件管理器里面du按Ctrl 43 H即可显示 显示为 bashrc xff0c 前zhi面小点儿表示隐藏文件 xff09 也可以直接利用t
  • Cotex-M内核双堆栈指针MSP和PSP

    MSP和PSP 的含义是Main Stack Pointer 和Process Stack Pointer 在逻辑地址上他们都是R13 xff1b 权威手册上说的很清楚PSP主要是在Handler的模式下使用 xff0c MSP主要在线程模
  • TCP/IP协议栈之LwIP-pbuf

    pbuf结构体就是一个描述协议栈中数据包的数据结构 xff1a Main packet buffer struct struct pbuf next pbuf in singly linked pbuf chain struct pbuf
  • Linux使用wpa_supplicant手动配置连接WiFi

    wpa supplicant是Linux BSD Mac OSX和Windows的WPA的服务 支持WPA和WPA2 IEEE 802 11i RSN xff0c 它适用于台式机 笔记本和嵌入式系统 xff0c Supplicant是在客户
  • 使用python快速将主机字节序转为网络字节序

    1 进入python环境 这里以win10自带的wsl win10子系统为操作环境进入Python命令行 2 引入网络字节序标准库 这里使用Python自带的socket库 3 将待转换的主机数据使用socket htons 或者socke
  • ∏这个是什么符号?

    是各项连乘的运算符号 读大写的 xff08 pai xff09 例如 xff1a i 61 1 xff08 符号下面 xff09 n xff08 符号上面 xff09 ai 符号右面 表示a1 a2 an 符号下面表示右面式子可变参量的下限
  • python获取图片的颜色信息

    span class pun style font family none font size 14px span h1 style font family none font size 24px padding 5px margin 5p
  • Python:TypeError: 'int' object is not callable

    一个函数的部分代码如下 xff1a python view plain copy def loadData len 61 dataSet len trainingSet extend dataSet len 3 4 testSet exte
  • FreeRTOS — 消息队列

    以下内容转载自安富莱电子 xff1a http forum armfly com forum php FreeRTOS 的一个重要的通信机制 消息队列 xff0c 消息队列在实际项目中应用较多 1 消息队列 1 1 消息队列的概念及其作用
  • 学校人力资源管理系统——物理结构设计

    新 建学校人力资源管理系统 数据库 1 创建相关表 1 1 创建部门信息表 部门信息表的创建代码如下 xff0c 部门信息表在SQL中的信息显示如图6 1所示 create table 部门信息表 部门编号 char 6 not null
  • python 安装serial模块

    想用Python来实现对串口的控制 xff0c 写好了脚本 xff0c 现在将这个脚本拿到另外一个电脑上去运行 xff1b 运行时提示错误 xff0c 说是没有安装serial模块 xff0c 于是乎安装 pip install seria
  • Doxygen使用教程(个人总结)

    简介Doxygen 一 xff0e 什么是Doxygen Doxygen 是一个程序的文件产生工具 xff0c 可将程序中的特定批注转换成为说明文件 通常我们在写程序时 xff0c 或多或少都会写上批注 xff0c 但是对于其它人而言 xf
  • STM32F401 I2S(full duplex)全双工示例代码

    USER CODE BEGIN Header 64 file main c 64 brief Main program body This notice applies to any and all portions of this fil

随机推荐

  • 一、认识与学习Linux中的BASH 之 1.1 什么是bash

    1 1 什么是bash 1 1 1 什么是bash bash全称为The Bourne Again shell xff0c 是Bourne Shell的扩展 xff0c 是基于GUN构架发展出来的语言 xff0c 有很灵活和强大的编程接口
  • 阿里云ECS服务器环境搭建(1) —— ubuntu 16.04 图形界面的安装

    阿里云ECS服务器环境搭建 xff08 1 xff09 ubuntu 16 04 图形界面的安装 1 背景 在我们购买阿里云ECS服务器之后 xff0c 默认的系统环境是很干净的 xff0c 我购买的是ubuntu16 04 xff0c 远
  • Python+pandas+每天股票涨了多少

    第一步 xff1a 得到某支股票历年来的交易数据 方法见 xff1a https blog csdn net zwy 0309 article details 108217342 在此 xff0c 我使用以下脚本得到股票 xff08 代码
  • 2021-06-02

    在ROS中仿真模型中添加gps传感器 获取gps传感器模型包为自己的机器人添加gps传感器将gps之中的经度纬度坐标转化为自己地图中的坐标 1 获取gps传感器模型包 link http wiki ros org hector gazebo
  • Dockerfile如何编写(指令详解)

    本文个人博客地址 xff1a https www leafage top posts detail 21525V8AP Dockerfile Dockerfile 描述了组装镜像的步骤 xff0c 其中每条指令都是单独执行的 除了FROM指
  • 关于Home Lab的搭建——硬件选择篇(迷你主机)(一)

    关于Home Lab 这个名词出自哪里 xff0c 我也不清楚 不过 xff0c 可以这样来理解Home Lab xff0c Home Lab是一台作为实验使用的电脑 xff0c 试验的内容多数是关于计算机网络的搭建 系统安装 测试 xff
  • Adaboost基本二分类算法

    最早类型的Adaboost是由Yoav Freund和Robert E Schapire提出的 xff0c 一种用于二分类的boosting集成学习方法 也是李航 统计学习方法 中所介绍的Adaboost 它将一系列弱分类器的线性组合 xf
  • Springboot 项目金蝶中间件AAS-9.0启动报错 javax.persistence.Table.indexes()[Ljavax/persistence/Index 问题解决

    Springboot 项目金蝶中间件AAS 9 0启动报错 java lang NoSuchMethodError javax persistence Table indexes Ljavax persistence Index问题解决方法
  • CMakeLists配置(常用的)

    一 xff1a 最小组成 cmake 最小版本需求 cmake minimum required VERSION 2 8 project 名字 project MyEsp32AllCode 可执行文件生成 add executable PR
  • SLAM学习笔记(四)定位

    原创博客 xff1a http blog csdn net renshengrumenglibing viewmode 61 contents 机器人定位的目的是为了知道 自己在什么地方 xff0c 目前 xff0c 机器人定位的方法可以分
  • SLAM实习岗位面经

    一 地平线 一面主要是在问关于SLAM岗位的技术问题 xff0c 然后还问了一些比较简单的C 43 43 基础知识 其实总体而言 xff0c 面试的问题都比较基础 xff0c 比较考验SLAM基本功 xff0c 如果只知道一些SLAM皮毛的
  • Canal数据库监听

    1 什么是canal canal是用java开发的基于数据库增量日志解析 xff0c 提供增量数据订阅 amp 消费的中间件 目前 xff0c canal主要支持了MySQL的binlog解析 xff0c 解析完成后才利用canal cli
  • linux下安裝mitmproxy 详解傻瓜式文档

    前言 xff1a mitmproxy 就是用于 MITM 的 proxy xff0c MITM 即中间人攻击 xff08 Man in the middle attack xff09 用于中间人攻击的代理首先会向正常的代理一样转发请求 xf
  • ROS学习笔记(2)——ROS架构

    ROS学习笔记 xff08 2 xff09 ROS架构 0 学习来源1 ROS架构2 文件系统级2 1 工作空间 3 计算图级4 ROS开源社区级4 1 发行版 xff08 Distribution xff09 4 2 软件库 xff08
  • STM32_中断

    STM32 中断 一 介绍 1 1解释 打断CPU执行正常的程序 xff0c 转而处理紧急程序 xff0c 然后返回原暂停的程序继续运行 xff0c 就叫中断 1 2作用和意义 作用 xff1a 实时控制 xff1a 在确定时间内对相应事件
  • Oracle创建用户并授权

    很多时候 xff0c 我们不需要用系统原始的sys xff0c sysdba等系统账户 xff0c 需要创建个性化的用户并授权 xff0c 那就需要我们首先登录到dba账户 xff0c 然后通过dba账户进行用户创建并授权 1 用dba权限
  • 【Linux】vim 中批量添加注释

    本期主题 xff1a vim 中批量添加注释博客主页 xff1a 小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限 xff0c 出现错误希望大家不吝赐 此文主要介绍两种方法 xff1a 方法一 xff1a 块选择模式
  • 对gazebo启动后黑屏或者没有模型的解决

    1 问题 卡在加载模型界面 xff1b 加载太慢或者黑屏 xff1a 报错信息如下 xff1a 图1 打开界面 xff1a 图2 2 解决办法 直接下载所有模型到用户的根目录下的 gazebo models 下 xff1a 方法1 xff1
  • 【Python与机器学习】5.K-Means聚类

    聚类 xff08 clustering xff09 什么是聚类 聚类属于无监督学习 xff08 unsupervised learning xff09 xff0c 即无类别标记 是数据挖掘经典算法之一 算法接收参数k xff1b 然后将样本
  • 穿过已知点画平滑曲线(3次贝塞尔曲线)

    为了把一串点连成光滑的曲线 xff0c 先研究贝塞尔曲线 xff0c 又搞B样条插值 都没有成功 数学没那么强 后来在 翻译 AGG 之贝塞尔插值 http liyiwen javaeye com blog 705489 看到一种比较好的方