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

三阶贝塞尔曲线_三阶贝塞尔曲线公式目的:使用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)


相关推荐

  • U盘中毒了?教你如何删除System Volume Information这个顽固文件夹「建议收藏」

    U盘中毒了?教你如何删除System Volume Information这个顽固文件夹「建议收藏」不得不说cmd命令很好用呢。最近我的U盘中毒了,格式化都删除不了SystemVolumeInformation这个顽固的文件夹,真心伤不起哇!还好现在解决了问题。看来以后得好好对待U盘,不能乱用了。本篇文章教大家如何删除SystemVolumeInformation这个顽固文件夹。希望对你有用。我的电脑是win10,win+R搜索cmd,启用cmd命令编辑器,并输入以下命令:attrib…

  • mac idea2022.01永久激活【2021免费激活】

    (mac idea2022.01永久激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • axisfault 解析报文异常_oculus headset only

    axisfault 解析报文异常_oculus headset only一般说来,不可避免的WebService的服务中也会出现异常,举个简单的例子,一个服务接受一个SOAP请求消息,获取有效负载后,进行一个数据库更新操作,而在更新操作过程中发生了SQLException,这个时候就需要告诉客户端(调用WebService)出现异常了,Axis2将异常封装成为一个AxisFault进行抛出。任何类型的异常Axis2都会对其进行封装,而不管该异常是运行时异常,还

  • 中星睿典职称计算机考试,大纲教材 – 中星睿典 – 全国职称计算机考试|职称计算机考试模块|全国职称计算机考试试题…

    中星睿典职称计算机考试,大纲教材 – 中星睿典 – 全国职称计算机考试|职称计算机考试模块|全国职称计算机考试试题…大纲教材介绍全国专业技术人员计算机应用能力考试,又称全国职称计算机应用考试。为贯彻党的十五届五中全会提出的“要在全社会广泛应用信息技术,全国职称计算机考试可以提高计算机和网络的普及应用程度,加强信息资源的开发和利用”的精神,落实国家加快信息化建设的要求,引导全国专业技术人员学习掌握计算机知识,提高计算机的应用能力,根据原人事部《关于全国专业技术人员计算机应用能力考试的通知》(人发2001124号)…

  • 堆栈callstack打印

    堆栈callstack打印一、适用java1、Log.d(TAG,Log.getStackTraceString(newThrowable()));//在使用Log.d的场合2、newException(“testprintkstack”).printStackTrace();Note:还有其他方法,可以参考网络

    2022年10月25日
  • 自己动手写游戏:Flappy Bird

    一、关于FlappyBird《FlappyBird》是由来自越南的独立游戏开发者DongNguyen所开发的作品,游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍,而这只鸟其实是

    2021年12月19日

发表回复

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

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