Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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# CAD绘图中的不精确处理_C#_C++_Algorithm_Drawing_Cad - Fatal编程技术网

C# CAD绘图中的不精确处理

C# CAD绘图中的不精确处理,c#,c++,algorithm,drawing,cad,C#,C++,Algorithm,Drawing,Cad,我有一个CAD应用程序,允许用户绘制直线和多边形等 我面临的一个棘手问题是,用户绘图可能非常不精确,例如,用户可能希望绘制两个相互连接的矩形。因此,两个矩形应该共享一条直线。然而,用户很容易不画一条线,而是画两条彼此非常接近的线,如此接近以至于当从屏幕上看时,你可能会误认为它们是同一条线,只是当你放大一点时它们不是 我的应用程序需要用户正确地绘制线条(或者我的预处理必须能够进行自动校正),否则我的内部算法(我们称之为算法)将无法正确处理输入 应对此类问题的最佳策略是什么?我正在考虑将点坐标四舍五

我有一个CAD应用程序,允许用户绘制直线和多边形等

我面临的一个棘手问题是,用户绘图可能非常不精确,例如,用户可能希望绘制两个相互连接的矩形。因此,两个矩形应该共享一条直线。然而,用户很容易不画一条线,而是画两条彼此非常接近的线,如此接近以至于当从屏幕上看时,你可能会误认为它们是同一条线,只是当你放大一点时它们不是

我的应用程序需要用户正确地绘制线条(或者我的预处理必须能够进行自动校正),否则我的内部算法(我们称之为算法)将无法正确处理输入

应对此类问题的最佳策略是什么?我正在考虑将点坐标四舍五入到一定的精度,但尽管我不能准确地指出这种方法的问题,但我觉得这不是正确的方法,这将引入一组新的问题

编辑:为了参数起见,捕捉不是一个可用的选项。事实上,各种“输入端”指导都不可用。修正必须在绘图完成时,但就在我将其提交给算法之前,通过对代码进行预处理来完成

你说是疯狂的限制。但是用户可以在我的应用程序中构造输入,也可以在其他CAD软件中构造输入,然后提交给我的引擎进行计算。我无法控制他们如何输入其他CAD软件

编辑2:我可以让用户指定要发生的“集群半径”,但重要的是,我需要确保我的预处理算法是一致的,并且不会真正引入新的问题集


有什么想法吗?

捕捉点。用户应该能够捕捉到端点(以及更多),然后,当您检测到捕捉时,只需将用户单击的点更改为捕捉点。检查AutoCAD、线端、中间等功能

编辑:如果要脱机捕捉,则只需检查每对点是否彼此靠近即可。问题是,这是NP问题,所以它需要很多时间,因为你不能真正达到O(n^2)的时间复杂度。您需要的这个算法应该在“集群”下


我认为你不应该认为输入数据是不好的。但若你们真的想这样做,简单的方法是取每个点,检查在用户定义的半径中是否还有其他点,若有,找到应该合并到一个点的整个组,找到点坐标的平均值,并将它们全部指向那个特定点。但是请记住——大多数设计师知道捕捉点的用途,如果他们不使用它们,他们对此有一个有效的想法。

在我看来,你的基本问题(我希望我理解正确)是确定两条线是否是“同一”线

根据我自己的经验,您的感觉是正确的,在输入中舍入坐标可能不是一个好主意

也许你应该让输入中的坐标保持原样,但实现你的函数,让我们把它命名为“算法”(如果我正确理解了你的描述,谁来决定两个矩形是否连接)

IsSameLine可以将输入线的端点从源坐标转换为屏幕坐标,考虑到特定(可能可配置)屏幕分辨率,并检查它们在屏幕坐标中是否相同

例如,假设您有一个具有以下范围(lowerleft)(右上)((10,10)、(24,53))的输入文件。问题是,如果在1600x1200像素的屏幕上以“最大化”级别绘制,点(11,15)和(11.1,15.1)之间的距离会有多远。因此,您可以确定从源坐标到“屏幕坐标”的转换。然后在IsSameLine中使用此转换,如上所述

我不确定这对你来说是否是一个好的解决方案


另一种可能性(可能更好?)是,如果两条直线的点之间的距离为最大ε,则实现IsSameLine以返回true。epsilon可以根据输入向量数据的范围计算出一个默认值,并且最好让用户能够为它提供另一个值。

我看到的一个问题是,您的聚类/捕捉算法必须自行决定将哪个点移动到哪个其他点

在实时输入捕捉过程中非常简单:第一个点保持不变,第二个点捕捉到第一个点上。如果在脱机模式下,您得到一堆您知道应该捕捉在一起的点,那么您不知道结果点应该位于何处。计算平均值,可能会产生一个全新的点?从所有候选人中选择最核心的一点?随便挑一个?尝试将点与x/y/z轴上的其他点对齐

如果您的程序允许任何用户交互,您可以检测可能是合并候选点的点簇,并为用户提供不同的合并目标点供选择。

否则,您可以配置这种行为:将合并半径(“如果两个或多个点彼此在n个单位内…”)和合并算法(“将它们合并到给定点的最中心”)作为参数,并从配置文件中读取它们。

@Migol,framework,您指的是什么框架?@Graviton CAD framework,还是您从头开始编写?是您的CAD应用程序(即您有源代码)?如果是这样,您可以在那里解决问题。如果没有,你必须检测问题并解决它。@Migol,我想这并不重要。我想要的是一种在我们之后处理输入的方法