Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AutoCAD在.NET中的垂直/相切对象捕捉问题_C#_.net_Math_Geometry_Autocad - Fatal编程技术网

C# AutoCAD在.NET中的垂直/相切对象捕捉问题

C# AutoCAD在.NET中的垂直/相切对象捕捉问题,c#,.net,math,geometry,autocad,C#,.net,Math,Geometry,Autocad,现在,让我用数学术语和代码(C#)来解释我的问题: ======================== 鉴于: 原点位于(0,0)且半径为0.0364的圆 平行于圆的顶部并由一小段边距隔开的线段(以便线段不与圆相切)。保证金的大小无关紧要。线段的长度为圆直径的40% 解决: 一条垂直线段,其起点位于上述直线的起点,终点接触圆的边缘 ======================== 使用AutoCAD的对象捕捉功能时,我没有收到所需的结果。我尝试绘制的线段仅使用OSnap模式“切线”和“垂直”以

现在,让我用数学术语和代码(C#)来解释我的问题:

========================

鉴于:

  • 原点位于(0,0)且半径为0.0364的圆

  • 平行于圆的顶部并由一小段边距隔开的线段(以便线段不与圆相切)。保证金的大小无关紧要。线段的长度为圆直径的40%

解决:

一条垂直线段,其起点位于上述直线的起点,终点接触圆的边缘

========================

使用AutoCAD的对象捕捉功能时,我没有收到所需的结果。我尝试绘制的线段仅使用OSnap模式“切线”和“垂直”以对角线方式渲染。(参见以下C#示例):

例1:

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的函数。谢谢!我的几何学技能很生疏。我从来不知道我必须得到“箭塔”。