【几何】指定半径倒角的实现,暂不考虑误差

前言

数学

前置知识

前置知识一

0 < ∠ B A C < π 0<\angle BAC < \pi 0<∠BAC<π, 截短(接长)AB使得,AB和AC相等。根据等腰三角型的三线合一,AD是角平分线,中线、中垂线,则D的坐标是B和C的坐标相加除以2。即 A D ⃗ = A B ⃗ + A C ⃗ 2 \vec {AD}= \frac{ \vec {AB}+\vec{AC}}2 AD =2AB +AC

csharp 复制代码
        [CommandMethod("QSTest")]
        public void Test()
        {
            var db = CadBase.GetDefaultDatabase();
            CSelAEntity selAEntity = new CSelAEntity();
            selAEntity.Add(typeof(Line), false);
            var pr1 = selAEntity.Sel();
            if (pr1.Status != PromptStatus.OK) { return; }
            var pr2 = selAEntity.Sel();
            if (pr2.Status != PromptStatus.OK) { return; }
            SPoint2D ptA, ptB, ptC, ptD;
            using (var tr = db.TransactionManager.StartTransaction())
            {
                Line line1 = tr.GetObject(pr1.ObjectId, OpenMode.ForWrite) as Line;
                Line line2 = tr.GetObject(pr2.ObjectId, OpenMode.ForWrite) as Line;
                if ((null == line1) || (line2 == null)) { return; }
                Point3dCollection points = new Point3dCollection();
                line1.IntersectWith(line2, Intersect.ExtendBoth, points, IntPtr.Zero, IntPtr.Zero);
                if (0 == points.Count) { return; }
                ptA = points[0].To();
                ptB = (points[0].DistanceTo(line1.StartPoint) > points[0].DistanceTo(line1.EndPoint)) ? line1.StartPoint.To() : line1.EndPoint.To();
                ptC = (points[0].DistanceTo(line2.StartPoint) > points[0].DistanceTo(line2.EndPoint)) ? line2.StartPoint.To() : line2.EndPoint.To();
                ptB = ptA + SVector2D.From2Point(ptA, ptB).GetUnitVector();
                ptC = ptA + SVector2D.From2Point(ptA, ptC).GetUnitVector();
                ptD = ptA + (SVector2D.From2Point(ptA, ptB) + SVector2D.From2Point(ptA, ptC)) * 0.5;
            }
            Line lineAD = new Line(ptA.To3(), ptD.To3());
            Line LineBC = new Line(ptB.To3(), ptC.To3());
            double R = 1000;
            double adLen = ptA.Dis(ptB) / ptB.Dis(ptD) * R;
            var ptE = ptA + SVector2D.From2Point(ptA, ptD).GetUnitVector() * adLen;
            CEntHelp.AddEnity(new Circle(ptE.To3(), Vector3d.ZAxis, R), "", db);
        }

精度明显比AutoCad低,暂时放弃。

前置知识二

圆心为o1,o2,半径为r1,r2的圆,r1>r2。外切(内切)    ⟺    o 1 o 2 的距离 = r 1 ± r 2 \iff o1o2的距离=r1 \pm r2 ⟺o1o2的距离=r1±r2

前置知识三

和直线A相切,半径R的圆的圆心在与A平行,距离为R的直线上。

三种情况

倒角分三种情况:

一,直线与直线。倒角所在圆半径为R,和两条直线相切。直线离切点较近的端口移到切点。

二,直线与圆弧。倒角所在圆半径为R,和直线圆弧所在圆相切(内切、外切)。直线、圆弧离切点近的端点移到切点。

三,圆弧与圆弧。倒角所在圆半径为R,和圆弧所在圆相切(内切、外切)。圆弧离切点近的端点移到切点。

三角函数和反三角函数误差较大,不用。

直线与直线方法一

ABC坐标已知,, 截短(接长)AB使得AB和AC相等。AD是 ∠ B A C \angle BAC ∠BAC的角平分线,。 A D ⊥ B C , E F ⊥ A B , E G ⊥ A C AD \perp BC,EF \perp AB,EG \perp AC AD⊥BC,EF⊥AB,EG⊥AC EF和EG相等,其长度为R,求E的坐标。E就是倒角所在圆的圆心。

∣ E F ∣ |EF| ∣EF∣

一,根据前置知识一,求向量 A D ⃗ \vec {AD} AD 。

二,求出D的坐标。

三,求 A ⃗ E \vec AE A E, ∣ E F ∣ ∣ A E ∣ = sin ⁡ ∠ B A D = ∣ B D ∣ ∣ A B ∣ \frac {|EF|}{ |AE|}=\sin \angle {BAD}=\frac{|BD|}{|AB|} ∣AE∣∣EF∣=sin∠BAD=∣AB∣∣BD∣,即 ∣ A E ∣ = ∣ A B ∣ R ÷ ∣ B D ∣ |AE|=|AB|R \div |BD| ∣AE∣=∣AB∣R÷∣BD∣。

四,求E的坐标。

直线和直线方法二

做直线a,b, a平行与AB,距离为R。b平行与AC,距离为R。a可以做两条,选取离点C近的那条。b可以做两条,选取与B近的那条。a和b的交点就是倒角圆的圆心。

直线AB与圆C的倒角

C的半径r,倒角圆的半径R。

做平行于AB的直线a,b,到AB的距离为R。以C的圆心c做半径为R+r,R-r分别做圆d,e,直线和d,e的交点便是倒角圆的圆心。

圆A与圆B的倒角

A的圆心a,半径r1。B的圆心b,半径r2。

以a为圆心,R ± \pm ±r1做圆C,D。

以b为圆心,R ± \pm ±r2做圆E,F。

C、D与E、F的交点就是 倒角圆的圆心。

扩展阅读

算法为骨,CAD为魂
亲士工具箱:支持中望CAD2024、AutoCad2013及以上,多年承接CAD项目的精华
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
活到老,学到老。明朝中后期,大约50%的进士能当上堂官(副部及更高);能当上堂官的举人只有十余人。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。

https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程

https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境: VS2022 C++17

如无特殊说明,本算法用**C++**实现。

相关推荐
装不满的克莱因瓶2 小时前
什么是特征分解?从数学定义到现实问题的映射
人工智能·数学·算法·机器学习·ai·特征分解
aWty_5 小时前
实分析入门(11)--Cantor三分集
学习·数学·算法·实变函数
databook19 小时前
用 SymPy 解决 Manim 曲线绘制速度不均的问题
python·数学·动效
Luhui Dev3 天前
大角几何 MCP 服务上线:让 AI Agent 直接完成几何作图
人工智能·数学·机器学习·大角几何·luhuidev
Tisfy3 天前
LeetCode 3300.替换为数位和以后的最小元素:一次遍历
数学·算法·leetcode·模拟
惆怅客1236 天前
UVa1507/LA5838 Shadow
计算几何·icpc·坐标变换·uva·二维凸包·离散化扫描法·圆和凸多边形的面积并
databook8 天前
Manim物理模拟:别自己写欧拉了!
python·数学·动效
风在这里徘徊8 天前
断尺问题:戴德金分割现实悖论
数学·两实数相邻·实数·相邻论·实数连续性