三阶贝塞尔曲线_三阶贝塞尔曲线公式

三阶贝塞尔曲线_三阶贝塞尔曲线公式目的:使用L-Edit绘制DC耦合器版图其中的弯曲部分就是基于贝塞尔曲线画出来的。长这样↓使用语言:C语言写了两个版本。一个是基于L-edit平台的版本,一个是基于VS平台版本(我的是2017版)。这里说下VS的版本,不过VS里我就没有费心画出来了,只是列出了坐标来验证我L-Edit里面版图的正确性。贝塞尔曲线是个啥可参考这篇:点击打开链接简言之我们要画的三阶贝塞尔曲线就是通过四个点来拟合一条曲线…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

目的:使用L-Edit绘制版图,其中有一段弯曲部分就是基于贝塞尔曲线画出来的。长这样↓

三阶贝塞尔曲线_三阶贝塞尔曲线公式

使用语言:C语言

写了两个版本。一个是基于L-edit平台的版本,一个是基于VS平台版本(我的是2017版)。这里说下VS的版本,不过VS里我就没有费心画出来了,只是列出了坐标来验证我L-Edit里面版图的正确性。

贝塞尔曲线是个啥可参考这篇:点击打开链接

简言之我们要画的三阶贝塞尔曲线就是通过四个点来拟合一条曲线。其中首尾二点在曲线上,中间两点只是确定方向用的,不在曲线上。

我遇到比较麻烦的问题是,我的已知条件只有四个点坐标,我需要“加粗”用这四个点画出的贝塞尔曲线,让它变成如图所示的两条平行贝塞尔曲线。

我开始的方法是:画出一条以后,y方向移动我需要的宽度,活生生移出一条曲线来。结果如下:

三阶贝塞尔曲线_三阶贝塞尔曲线公式

三阶贝塞尔曲线_三阶贝塞尔曲线公式

隐隐约约不太对劲(

单纯的y向平移显然不适合这种gay里gay气的曲线(不是钢铁直线对不起了呢

然后我想到应该把每点的斜率算出来,然后在法向上平移,这个方法是可行的,只是比较麻烦,我写了一半就想回去洗澡了。

为了节省时间,我参考了第三种方法。戳戳->点击打开链接

简言之就是从四个已知点下手,通过平移点,来平移曲线。这样一来我只需要操作四个点就行,十分方便。结果就如我一开始放的图那样。

下面放上程序:

// DCtest3.cpp: 定义控制台应用程序的入口点。 // /******************风格看起来有点奇怪不要介意,因为是从L-edit改过来的*****************************/ #include "stdafx.h" #include <stdlib.h> #include <math.h> #include <stdio.h> void sub_2(double x, double y, struct D_C dc); /*定义变量*/ struct D_C { double Lc, Lw, Ls, base_width, gap, y_span, w2, y_2; /* # Lc: length of the central straight waveguide sections for coupling # Lw: length of the four individual straight waveguide sections # at the input and output ports # Ls: x span of the four individual s-bend sections # base width: width of the waveguide base # gap: gap between two coupling sections # y span: center-to-center distance between the two input ports # w2:base_width/2; y_2:y_span/2; */ double x1, y1; double x2, y2; double x3, y3; double x4, y4; double x11, y11; double x22, y22; double x33, y33; double x44, y44; double factor; char* WG; }dc; int main() { double x0 = 0; double y0 = 0; dc.factor = 1.0e3; dc.Lc = 30 * dc.factor; dc.Lw = 3 * dc.factor; dc.Ls = 5 * dc.factor; dc.base_width = 0.5*dc.factor; dc.gap = 0.4*dc.factor; dc.y_span = 8 * dc.factor; dc.w2 = dc.base_width / 2; dc.y_2 = dc.y_span / 2; //中心曲线坐标(左上) dc.x1 = dc.Lw, dc.y1 = dc.y_2; dc.x2 = dc.Lw + dc.Ls / 2, dc.y2 = dc.y_2; dc.x3 = dc.Lw + dc.Ls / 2, dc.y3 = dc.gap / 2 + dc.w2; dc.x4 = dc.Lw + dc.Ls, dc.y4 = dc.gap / 2 + dc.w2; dc.x11 = dc.x1, dc.y11 = -dc.y1; dc.x22 = dc.x2, dc.y22 = -dc.y2; dc.x33 = dc.x3, dc.y33 = -dc.y3; dc.x44 = dc.x4, dc.y44 = -dc.y4; sub_2(x0, y0, dc);//弯曲波导左上 getchar(); return 0; } /*****贝塞尔曲线公式*****/ /******这个是百度来的可以直接用,当然也可以自己写成之前链接里面的那种标准格式, 我两种都试过,都ok的*****emmm注释比较随意懒得搞了**********/ //n!/k! int zuhe(int n, int k) { int i, s1, s2; s1 = 1, s2 = 1; if (k == 0) return 1; for (i = n; i >= n - k + 1; i--) s1 = s1 * i; for (i = k; i >= 2; i--) s2 = s2 * i; return s1 / s2; } //n^k double fang(double n, int k) { if (k == 0) return 1; return pow(n, k); } //(n!/k!)*t^k*(1-t)*(n-k) double eiheihei(int n, int k, double t) { return zuhe(n, k)*fang(t, k)*fang(1 - t, n - k); } void sub_2(double x, double y, struct D_C dc) { double t[101] = { 0 }; double xa[101], ya[101]; double s = 0.00; int i; //t[i]从0取到1,步进0.01 for (i = 1; i<101; i++) { s = s + 0.01; t[i] = s; } //向上平移 for (i = 0; i<101; i++) { xa[i]=(dc.x1*eiheihei(3, 0, t[i]) + (dc.x2 + dc.w2)*eiheihei(3, 1, t[i]) + (dc.x3 + dc.w2)*eiheihei(3, 2, t[i]) + dc.x4*eiheihei(3, 3, t[i])); ya[i] = ((dc.y1 + dc.w2)*eiheihei(3, 0, t[i]) + (dc.y2 + dc.w2)*eiheihei(3, 1, t[i]) + (dc.y3 + dc.w2)*eiheihei(3, 2, t[i]) + (dc.y4 + dc.w2)*eiheihei(3, 3, t[i])); printf("i:%d (%f,%f);\n", i, xa[i], ya[i]); } printf("\n\n"); //向下平移 for (i = 0; i<101; i++) { int j = 102 + i; xa[i]= (dc.x4*eiheihei(3, 0, t[i]) + (dc.x3 - dc.w2)*eiheihei(3, 1, t[i]) + (dc.x2 - dc.w2)*eiheihei(3, 2, t[i]) + dc.x1*eiheihei(3, 3, t[i])); ya[i] = ((dc.y4 - dc.w2)*eiheihei(3, 0, t[i]) + (dc.y3 - dc.w2)*eiheihei(3, 1, t[i]) + (dc.y2 - dc.w2)*eiheihei(3, 2, t[i]) + (dc.y1 - dc.w2)*eiheihei(3, 3, t[i])); printf("i:%d (%f,%f);\n", j, xa[i], ya[i]); } }

运行结果:

三阶贝塞尔曲线_三阶贝塞尔曲线公式

图我是在L-edit里画的,以上程序只有坐标,没有费心画图了,要画图的话改改就能用。

贝塞尔函数参考程序:点击打开链接

【以上程序属于七改八改加点小原创写出来的,如有不正确的地方欢迎指正。】

三阶贝塞尔曲线_三阶贝塞尔曲线公式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191617.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • IE11打不开网页, 所有菜单都被禁用了。

    IE11打不开网页, 所有菜单都被禁用了。

  • 来客在线客服系统源码 支持一键安装

    来客在线客服系统源码 支持一键安装简介:来客客服源码/带完整文字教程/一键安装好友分享的,状态比流通版本还是要好很多。不支持前端商户注册,这个大家应该也都用过了,有喜欢的,自己拿去吧,东西如下。网盘下载地址:http://kekewl.org/D11LdBKXP7L0图片:…

  • linux vim用不了(排位老是遇到坑怎么办)

    这里写自定义目录标题Vim是Linux常用的文本编辑器新的改变插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入Vim是Linux常用的文本编辑器1、 输入命令vi文件名,进…

  • 全局数据库名称.数据库名称.SID是什么关系?

    全局数据库名称.数据库名称.SID是什么关系?

  • Java旅游管理系统

    Java旅游管理系统基于Java的SSM旅游平台基于Java的SSM旅游平台功能介绍系统部分快照基于Java的SSM旅游平台功能介绍(1)用户注册,登陆,验证,退出等基本功能;(2)景点介绍,天气预报,门票预订,酒店预订;(3)旅游攻略,旅游咨询,驴友风采;(4)景点地图;(5)驴友社区;(8)个人旅途分享;系统部分快照后台管理界面图片省略…

  • WiFi(6)和5G的区别及比对[通俗易懂]

    WiFi(6)和5G的区别及比对[通俗易懂]5G是蜂窝数字移动通信技术,既可用于广域高速移动通信,又可用于室内无线上网,具有传输速率高、时延小、并发能力强等优点,但系统复杂、成本高。WiFi6是无线接入技术,主要用于室内无线终端上网,具有传输速率高、系统简单、成本低等优点,但不适用于高速移动通信。5G和WiFi6具有以下特点:(1)5G上行峰值传输速率达10Gbit/s,下行峰值传输速率达20Gbit/s。WIFI6在80MHz带宽下,单条空间流的峰值速率为600Mbit/s,在带宽为160MHz、8条空间流的情况下,峰值速率达9.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号