如何计算连接两个电路元件的角点?

How can I compute the corner point for connecting two circuit components?

提问人:Abdo21 提问时间:2/20/2023 最后编辑:Abdo21 更新时间:2/20/2023 访问量:65

问:

我有一个源组件和一个目标组件,我想计算它们将连接的角点。我正在实现一种方法,该方法将源点和目标点及其方向(水平或垂直)作为输入。以下是该方法的骨架:

private final static int HORIZONTAL = 0;
private final static int VERTICAL = 1;

private PointF computeCornerPoint(PointF sourcePoint, int sourceComponentOrientation, PointF targetPoint, int targetComponentOrientation) {
    PointF cornerPoint = new PointF();

    // TODO: Calculate the corner point here

    return cornerPoint;
}

我创建了一个图表,显示了所有可能的情况。在图中,绿点是源点和目标点,红点是我要计算的角点。

enter image description here

另外,请注意,这个问题是对称的,因此源组件和目标组件可以交换,我提供的图表只显示了一种情况。

在 Android 中,x 坐标从左到右递增,y 坐标从上到下递增。

您能提出一种算法或解决方案来计算所有这些情况的角点吗?

此外,如果缺少任何有助于解决此问题的信息,请告诉我。

java android 算法 数学 电路图

评论

1赞 Abdo21 2/20/2023
@m0skit0 感谢您的回复。这不是一个家庭作业问题。我正在为Android设计一个电路绘图工具,我一直停留在这一点上。我试图自己想出一个解决方案,但我很难找到最好的方法。任何帮助或建议将不胜感激。谢谢。
0赞 Morrison Chang 2/20/2023
@Abdo21 请查看“两条线的交集”,并意识到“电路”实际上是矩形。否则,请显示您尝试过的代码。在处理其他情况之前,请先从最简单的情况开始。
1赞 Abdo21 2/20/2023
@MorrisonChang 感谢您的回复。我很欣赏你的建议,但我认为这个问题与两条线的交集问题不同。在本例中,我们有两个点(源点和目标点),需要根据组件的方向计算角点。组件的方向决定了我们需要连接矩形的哪一侧。不幸的是,我无法自己想出解决方案。任何帮助或建议将不胜感激。谢谢。
0赞 Morrison Chang 2/20/2023
第一行是线交点问题。第二行和第三行旋转投影矩形(不是电路图像),其中发生交叉,并带有其他规则,例如不通过电路。
0赞 Abdo21 2/20/2023
@MorrisonChang 我同意我可以使用蛮力来解决这个问题,对每种情况都使用 if-else 语句,但我希望找到一个更优化的解决方案。当我正在为 Android 设计电路绘图工具时,对我来说,解决方案的高效性很重要。谢谢。

答:

1赞 David Eisenstat 2/20/2023 #1

水平/垂直是不够的——我们需要知道 连接点所在的组件。另外,我不确定你想怎么做 处理相对两侧的连接点。

对于您展示的情况,答案将是(source.x, target.y) 或 (target.x, source.y)。如果(例如)源点是 在其组件的右侧,则 (target.x, source.y) 被否决 如果 target.x < source.x,则首选 source.x < target.x;(来源.x, target.y) 是一个中等选项。其他7例(3个来源 方向和四个目标方向)是对称的。我们要求 未被否决的选项,如果满足以下条件,应选择首选选项 可能。

假设 (source.dx, source.dy) 和 (target.dx, target.dy) 给出 它们各自连接点相对于 组件的中心(因此使用通常的数学坐标 正 dx 指向右且正 dy 指向上方的系统,(dx, dy) = (1, 0) 是正确的,(dx, dy) = (0, 1) 是向上的,依此类推)。泛型 分量的条件是,点 (x′, y′) 是 否决/首选/中等 if component.dx * (x′ - component.x) + component.dy * (y′ - component.y) 小于/大于/等于 分别为零。如果我们让“否决”是 -2 分,最好是 1 分 点,中等为 0 分,我们可以将两者的分数相加 候选人得分并取最大值。

评论

0赞 Abdo21 2/20/2023
感谢您抽出宝贵时间提供此信息。你是对的,有一些遗漏的情况需要考虑,在解决这个问题时,我会考虑这种方法。谢谢。