前言
前置知识
前置知识一
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++**实现。
