C# AutoCAD在.NET中的垂直/相切对象捕捉问题
现在,让我用数学术语和代码(C#)来解释我的问题: ======================== 鉴于:C# AutoCAD在.NET中的垂直/相切对象捕捉问题,c#,.net,math,geometry,autocad,C#,.net,Math,Geometry,Autocad,现在,让我用数学术语和代码(C#)来解释我的问题: ======================== 鉴于: 原点位于(0,0)且半径为0.0364的圆 平行于圆的顶部并由一小段边距隔开的线段(以便线段不与圆相切)。保证金的大小无关紧要。线段的长度为圆直径的40% 解决: 一条垂直线段,其起点位于上述直线的起点,终点接触圆的边缘 ======================== 使用AutoCAD的对象捕捉功能时,我没有收到所需的结果。我尝试绘制的线段仅使用OSnap模式“切线”和“垂直”以
- 原点位于(0,0)且半径为0.0364的圆
- 平行于圆的顶部并由一小段边距隔开的线段(以便线段不与圆相切)。保证金的大小无关紧要。线段的长度为圆直径的40%
bigCircle.GetObjectSnapPoints(
ObjectSnapModes.ModePerpendicular,
0,
tipTopCenterPoint1,
hatTopP3Dstart1,
fakematrix1,
p3dcolright,
icol1
)
…使新线向内折叠,成为对角线。我不知道这是什么,但这不是我想要的
示例2:此函数
bigCircle.GetObjectSnapPoints(
ObjectSnapModes.ModeTangent,
0,
tipTopCenterPoint1,
hatTopP3Dstart1,
fakematrix1,
p3dcolright,
icol1
);
..使新线向外延伸,成为对角线。我相信这条线是附着在与圆相切的点上的,但这不是我想要的
这就是我想要的;我怎样才能做到
我不会试图编写一个关于用户如何执行此操作的程序,我会坚持使用好的古老数学来实现速度和简单性。你要寻找的下降距离被称为矢状。 以下是如何在代码中实现它以使其动态:
[CommandMethod("MathIsCool")]
public void Draw_Method()
{
Database db = HostApplicationServices.WorkingDatabase;
Editor ed = AcadApplication.DocumentManager.MdiActiveDocument.Editor;
// Parameters (get from user prompt if desired)
var startP = new Point3d(0, 0, 0);
var r = 5.64;
var lineGap = 0.4;
var chordLen = r * 0.40;
try
{
using (Transaction acTrans = db.TransactionManager.StartOpenCloseTransaction())
{
var bt = (BlockTable)acTrans.GetObject(db.BlockTableId, OpenMode.ForWrite);
var btr = (BlockTableRecord)acTrans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
// Create the circle
var circ = new Circle(startP, Vector3d.ZAxis, r);
btr.AppendEntity(circ);
acTrans.AddNewlyCreatedDBObject(circ, true);
// Create the horizontal line
var hPt1 = new Point3d(startP.X - (chordLen / 2), startP.Y + (r + lineGap), 0);
var hPt2 = new Point3d(hPt1.X + chordLen, hPt1.Y, 0);
var hLine = new Line(hPt1, hPt2);
btr.AppendEntity(hLine);
acTrans.AddNewlyCreatedDBObject(hLine, true);
// Create the vertical line
// Arc sagitta = Sqrt(r*r-l*l);
var sag = Math.Sqrt(r * r - (chordLen / 2) * (chordLen / 2));
var vPt2 = new Point3d(hPt1.X, startP.Y + sag, 0);
var vLine = new Line(hPt1, vPt2);
btr.AppendEntity(vLine);
acTrans.AddNewlyCreatedDBObject(vLine, true);
acTrans.Commit();
}
}
catch (System.Exception ex)
{
Debug.WriteLine(ex.ToString());
ed.WriteMessage(ex.ToString());
}
}
你可以在这里阅读更多关于射手座的信息:
编辑:根据100000次迭代中60%的性能提升,将事务更新为StartTopEncloseTransaction。基本上,您希望在垂直线和圆之间有一个交点。您可以旋转水平线以获得垂直线。然后修剪该直线,或删除该直线并绘制较短的直线(精确长度)。水平线段的起点为垂直线段的起点,以及垂直线段终点的x值。现在只需要端点的y值。圆的方程式给出了圆顶部的y值,作为x的函数。谢谢!我的几何学技能很生疏。我从来不知道我必须得到“箭塔”。