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

在Java中按极角对点进行排序

萧元徽
2023-03-14
问题内容

我正在使用Graham扫描算法来查找点集的凸包,我试图按其极角对点进行排序,但我不知道如何做到这一点(我已经按点对点集进行了排序Y坐标)。

我已经写的是这样的:

public double angle(Coord o, Coord a)
{
    return Math.atan((double)(a.y - o.y) / (double)(a.x - o.x));
}

这里Coord是我有X和Y坐标作为类double

我还查看了Stack Overflow中的类似文章之一,有人尝试使用C ++实现这种角度,但我不理解qsqrt。我们在Java中有类似的东西吗?

qreal Interpolation::dp(QPointF pt1, QPointF pt2)
{
    return (pt2.x()-pt1.x())/qSqrt((pt2.x()-pt1.x())*(pt2.x()-pt1.x()) + (pt2.y()-pt1.y())*(pt2.y()-pt1.y()));
}

如果有人可以帮助我,我会很高兴。


问题答案:

您无需计算极角即可对其进行排序。由于触发函数在一个象限内是单调的(总是增加或总是减小),因此只需按函数本身进行排序即可,例如,您所用的棕褐色。如果您要从最底端开始进行Graham扫描,则只需查看前两个象限,因此按tan曲进行排序最容易,因为它在两个象限中都是单调的。

换句话说,您可以按- (x - x1) / (y - y1)(其中(x1,y1)是起点的坐标)进行排序,这样可以更快地进行计算。首先,您需要分隔点y == y1,当然,然后根据(x-x1)`的符号将它们添加到列表的顶部或底部,但是由于您已经对它们进行了排序,因此它们很容易识别按y查找您的起点。



 类似资料:
  • 问题内容: 我有一个包含从上午8:00到下午4:00的时间列表。 当我在输出中显示它时,它似乎没有排序,而当我使用它时,它的排序时间是从1:00 pm到8:00 am。 我如何从8:00 am到4:00 pm排序我的列表? 问题答案: 不要重新发明轮子,而是使用collection(如果允许使用java8,则使用Lambdas)How ??:将列表保留为字符串,但使用Anonymous 比较器 ,

  • 问题内容: 我正在尝试使用TreeMap按日期键在Java中对地图进行排序。这是我的代码 将含有像(例如21-3-2013)以字符串格式和外观日期。问题在于,它仅在TreeMap(mp)中存储12个键值对(每月一个),而不是预期的103(i)。有任何想法吗 ? 问题答案: 请参阅http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDat

  • 问题内容: 我发现的每个示例都是按字母顺序进行的,而我需要按日期对元素进行排序。 我的ArrayList包含其数据成员之一是DateTime对象的对象。在DateTime上,我可以调用以下函数: 因此,我可以做一些比较: 我应该在if块内做什么? 问题答案: 你可以使对象具有可比性: 然后通过调用以下命令对其进行排序: 但是,有时你不想更改模型,例如想要对几个不同的属性进行排序时。在这种情况下,你

  • 问题内容: 可以按升序对它进行排序: 如何按降序排列? 问题答案: 要以相反顺序排序,请将作为参数传递给。 要获取a ,您必须明确要求使用4参数。如果您未指定所需的地图类型,则将获得默认值,而默认值是。由于不保留元素的顺序,因此绝对不会为您服务。 使用静态导入,它将变得更加令人愉快:

  • 我正在尝试编写一个程序,根据列表中最不频繁的字符排列字符串列表。例如,如果列表是,列表中的字母频率将是a-5,n-3,p-2,e-2,l-1,o-1,r-1,g-1,b-1。由于橙色包含最不频繁的字母,程序将返回橙色,然后是apple,然后是banana。 到目前为止,我已经编写了按频率排列列表中所有字母的代码。但我需要应用它来找出哪个字符串包含最不频繁的字母。 这是我的代码:

  • 因此,我有一个,下面的字符串作为元素: null null