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

三阶贝塞尔曲线_三阶贝塞尔曲线公式目的:使用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里画的,以上程序只有坐标,没有费心画图了,要画图的话改改就能用。

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

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

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 无线AP、WiFi、WLAN是什么关系?

    无线AP、WiFi、WLAN是什么关系?最近在看科技论文,有些基础知识不是很清楚,故作了解近年来,无线AP被越来越多的应用于商场、车站、机场等公共场所,已变得与我们的生活息息相关,成为社会发展的一个趋势。但许多人弄不清楚无线AP与WiFi、WLAN之间的关系,以为WiFi就是WLAN,它们之间到底有什么不同?公共WiFi其实是一种无线AP技术今年央视315晚会曝光的公共WiFi安全隐患引起了社会各界的关注,但是有一个细节需要值得注意,那…

    2022年7月11日
    70
  • java中calendar类打印日历_输入年份和月份求天数

    java中calendar类打印日历_输入年份和月份求天数题目题目另可表述为:1.输入一个年份和月份,按格式输出此月份的日历2.以如下格式输出一个月份的日历代码实现1.Calendar类的一些说明Calendar类是一个抽象类,不能通过new的方式来获得实例,可以使用类方法getInstance()返回一个Calendar的子类对象.Calendarcalendar=Calendar.getInstance();…

    2022年9月2日
    9
  • android studio 导出的jar中没有主清单属性「建议收藏」

    android studio 导出的jar中没有主清单属性「建议收藏」问题:androidstudio工程的module生成的jar包,在执行中出现“没有主清单属性”错误。解决办法:原因:MANIFEST.MF中的没有Main-Class在对应的module中的gradle文件中加入:jar{manifest{attributes’Main-Class’:’com.MainClass’}}

    2022年9月5日
    3
  • 关于jquery中on绑定click事件在苹果手机失效的问题(巨坑啊)

    关于jquery中on绑定click事件在苹果手机失效的问题(巨坑啊)

    2021年11月5日
    47
  • matlab中wavedec2函数,[转载]小波滤波器–wavedec2函数

    matlab中wavedec2函数,[转载]小波滤波器–wavedec2函数wavedec2函数:1.功能:实现图像(即二维信号)的多层分解.多层,即多尺度.2.格式:[c,s]=wavedec2(X,N,’wname’)[c,s]=wavedec2(X,N,Lo_D,Hi_D)(我不讨论它)3.参数说明:对图像X用wname小波基函数实现N层分解,这里的小波基函数应该根据实际情况选择,具体办法可以:db1、db2、……db45、haar.输出为c,s.c为各层分…

    2022年6月16日
    70
  • 爬虫原理及应用

    https://www.cnblogs.com/luchun666/p/9394149.html链接:link…

    2022年4月9日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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