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

三阶贝塞尔曲线_三阶贝塞尔曲线公式目的:使用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 修改win10 ntp服务器地址,修改win10 ntp服务器地址

    修改win10 ntp服务器地址,修改win10 ntp服务器地址修改win10ntp服务器地址内容精选换一换用户可以配置、修改和查看系统时区及NTP服务器相关信息。目前只支持使用操作系统为Linux的外部NTP服务器。以NTP服务器、DNS服务器的操作系统均为SUSE为例:登录Linux弹性云服务器。执行以下命令,切换至root用户。sudosu-sudosu-执行以下命令,编辑ntp.conf文件。vim/etc/ntp.confvim/et…

    2022年6月12日
    113
  • 进程同步和线程同步

    进程同步和线程同步怎样同步多个线程或多个进程的活动。为允许在线程或进程间共享数据,同步是必需的。互斥锁和条件变量是同步的基本组成部分。互斥锁和条件变量出自POSIX.1线程标准,它们总是可用来同步一个进程内的各个线程的。如果一个互斥锁或条件变量存放在多个进程间共享的某个内存中,那么POSIX还允许它用于这些进程间的同步。互斥锁、条件变量、读写锁、信号量均可用于进程、线程的同步。多线程同步方法1)互斥锁互斥锁是最基

    2022年7月15日
    15
  • bash找不到命令_bash sed

    bash找不到命令_bash sedCentos7默认安装了openJDK,jps命令不能使用,如果jdk是重新安装指定的版本,默认不需要重新安装jps服务[root@maven-test~]#jpsbash:jps:commandnotfound…解决办法[root@maven-test~]#yuminstall-yjava-1.8.0-openjdk-devel再次执行[root@maven-test~]#jps20755Jps[root@maven-test~]#…

    2022年9月16日
    4
  • Loadrunner从入门到精通教程(一)

    Loadrunner从入门到精通教程(一)第一章:性能测试基础1-1.大话性能测试性能测试是什么使用自动化测试工具对产品按一定的性能指标进行测试。解决心性能平衡.给用户最好的体验。性能测试的时代背景,作用。大数据时代网站(BA).软件(T),游戏–金融银行,证券系统,教育(教务系统),交通(12306)–1-2性能测试那些事一.性能测试基本流程二、Web性能测试常用指标…

    2022年5月24日
    39
  • omnidisksweeper怎么用_handbrake参数设置

    omnidisksweeper怎么用_handbrake参数设置http://newping.cn/322

    2025年8月18日
    2
  • 跟我学Telerik公司的RadControls控件(二)

    跟我学Telerik公司的RadControls控件(二)  继上篇我们学习了RadWindow控件的用法之后,本篇我们将学习在项目中更加方便开发人员的常用控件RadAjax控件.  RadAjax是面向ASP.NET应用程序无编码AJAX使能化的第一个框架。这个专利Click-and-Go™技术可以让你不需要对你应用程序做任何修改(摆放Callback面板,设置触发器等)。最棒的是,你根本不需要写一行的JavaScript或s…

    2022年7月19日
    20

发表回复

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

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