当前位置: 首页 > 面试题库 >

如果两个线段重叠或相交,则将它们合并在同一圆上

年文柏
2023-03-14
问题内容

我试着两个部分结合起来,如果他们重叠或intersect.My的问题是类似这样和这个。但是,我要结合两个部分。

public class Segment
{
    private readonly double _from;
    private readonly double _to;
    public Segment(double from, double to)
    {
        _from = Normalize(from); // 0 <= x < 360
        _to = Normalize(to);
    }

    public bool Inside(double target)
    {
        if (_from < _to)
            return _from <= target && target <= _to;
        return _from <= target || target <= _to;
    }
}

我正在尝试写一篇TryCombine()

public bool TryCombine(Segment other, out Segment result)
{
    // if not intersect
    // return false

    // else if overlap
    // return true, out larger one

    // else if intersect
    // return true, out a new one with merged bound
}

预期结果

var seg1 = new Segment(0, 100);
var seg2 = new Segment(50, 150);
var seg3 = new Segment(110, -100);
var seg4 = new Segment(10, 50);
Segment result;

seg1.TryCombine(seg2, result); // True, result = Segment(0, 150)
seg1.TryCombine(seg3, result); // False
seg1.TryCombine(seg4, result); // True, result = Segment(0, 100)
seg2.TryCombine(seg3, result); // True, result = Segment(260, 150)

问题答案:

您可以在第二个链接中使用我的回答中所述的方法。

ma = (a2 + a1)/ 2  
mb = (b2 + b1)/ 2  
cda = Cos(da)
cdb = Cos(db)

要检查交叉点是否存在以及发生哪种类型的交叉点,请找到4个布尔值

 BStartInsideA = (Cos(ma - b1) >= cda)
 BEndInsideA  =  (Cos(ma - b2) >= cda)
 AStartInsideB = (Cos(mb - a1) >= cdb)
 AEndInsideB =   (Cos(mb - a2) >= cdb)

这些组合可能形成16种可能的结果(并非所有结果都是可靠的)。我将这些结果组合为4位值的位,并在case语句中对其进行处理。

例如,如果第一个值和最后一个值均为true(value0b1001=9),则您具有类似于seg1-seg2的情况的简单交集-因此,请获取AStartans起点,BEnd作为终点并将其标准化(如果较小则将360添加到BEnd比AStart)。

预规范化步骤应提供BEnd> =BStart和AEnd>=AStart(例如,将(3,1)弧转换为具有中点182和半角179的(3,361)

可能的结果(两种额外的情况,4种简单的末端组合,4种单末端重合的情况):

 0000: no intersection
 1111: full circle

 0011: AStart-AEnd
 1001: AStart-BEnd
 0110: BStart-AEnd
 1100: BStart-BEnd

 0111: AStart-AEnd
 1011: AStart-AEnd
 1110: BStart-BEnd
 1101: BStart-BEnd

一位组合和1010,0101看起来不可能

如作者建议的那样,使用通配符:

 At first check for 
   0000: no intersection
   1111: full circle
 then
   **11: AStart-AEnd
   1001: AStart-BEnd
   0110: BStart-AEnd
   11**: BStart-BEnd


 类似资料:
  • 问题内容: 在上一篇文章中,我在sqlite3中具有以下视图: 现在,由于数据是根据和之间的多对多关系生成的,因此我可以得到如下结果: 我想做的是,如果有一家以上的公司(如上),则创建一个查询,输出: 另一个输出: 因此,我本质上需要知道如何合并该表中具有不同值的行的特定列。 有任何想法吗? 以防万一,在第一个查询中显然是文本串联,也就是说, 问题答案: 为此使用聚合函数: (使用表别名使其更短且

  • 问题内容: 看这个: 现在,我有了一些值和一个从文件中加载的值的实例化。我希望将两个结构合并到一起,以便同时获取两个结构的内容。应该覆盖设置的任何内容,而 可能没有设置所有的字段 。(为什么?因为潜在的用户可能不知道默认值,所以删除该条目等同于设置默认值-我认为) 我认为我需要对此进行反思: 在这里我不确定: 如果根本需要反思 可能有更简单的方法可以做到这一点 我在这里看到的另一个问题是检查零值可

  • 问题内容: 我有一个这样的表: 如果相同ID的情节重叠(如-和- ),我希望使用,合并行。 如果情节是直接连续的(例如-和- ),则应执行相同的操作。 如果有“失踪”事件(如之间的天-和- ),他们应该 不会 合并。 如何做到这一点? 目前,我的代码如下所示: 但是,当然,这不能满足最后一个条件(如果有“丢失”的日子,则不能合并)。 先感谢您! [编辑] 我正在研究一种解决方案,我将表格与自身连接

  • 根据逻辑,我需要实现两个,如果它们以相同的“相对”顺序具有相同的元素,则它们被认为是相等的。 举个例子,以下一对列表被认为彼此相等: 只要遵守相对顺序,就可以认为它们是平等的。 作为反例,这两个不相等: 导致 和 交换到位。 所以,基本上我发现这很有挑战性,因为这不是顺序完全重要的情况,也不是顺序完全不重要的情况。在这种情况下,我会使用普通的< code>list1.equals(list2)方法

  • 问题内容: 我有两个非常大的表,我需要从这些表中处理一个小的结果集。但是,每个处理都是在几个函数中完成的,并且函数必须进行一些连接才能以正确的方式格式化数据。 我肯定需要以某种方式缓存初始结果集,以便功能可以重复使用它。我想做的是将第一个结果集放在一个集合中,将第二个结果集放在另一个集合中,然后通过SQL查询将这些集合当作真实的SQL表进行操作。 您能建议如何做到这一点吗? 问题答案: 您需要创建

  • 问题内容: 我正在使用上述算法来测试圆和直线之间的交点。有时它工作正常,但有时却失败。该代码表示​​方程,该方程是从同时求解圆和线方程和时得到的。有谁知道我在数学上或其他地方哪里出错了? 问题答案: 您的计算似乎很长,我看不到您测试的不同案例的使用。无论如何,由于我发现了有趣的问题,所以我尝试自己解决该问题,并提出了以下解决方案。随意更换的,并使用S,但是要知道,你每次投,如评论,一点效果都没有准

  • 例如 并把这个作为背景,在上边可以放置我们设置的标题和小图片

  • 问题内容: 我有2个表:product和cart,我希望结合这2个表并根据特定条件以数组形式显示数据,如下所示: 应显示特定类别下的所有产品,如果特定用户购买了给定产品中的任何产品,则其详细信息也应显示在该产品的前面 我到目前为止所做的代码是 它给出了这样的数组 但是我想要代替上面的数组的最后一个数组是 产品表视图(如您所见,产品表中包含一个productid,在每个productid下最多可以有