Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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
Java 格雷厄姆的麻烦';s扫描_Java_Dot Product_Cross Product_Grahams Scan - Fatal编程技术网

Java 格雷厄姆的麻烦';s扫描

Java 格雷厄姆的麻烦';s扫描,java,dot-product,cross-product,grahams-scan,Java,Dot Product,Cross Product,Grahams Scan,目前正在与Graham的扫描和凸面外壳一起工作。我是一名学生,所以我试图自己完成它,但我一直在多个网站筛选,以找到答案。简而言之,我有我的构造函数,一个来自文件,一个随机生成,这样我就能够创建一个点数组。下一步是实现快速排序,即按极轴角度排序。这是通过一个比较器类完成的。比较器类是我被卡住的地方,我们被告知使用点比较和交叉比较来做角度的比较,但我很迷茫 /** * Use cross product and dot product to implement this method. Do n

目前正在与Graham的扫描和凸面外壳一起工作。我是一名学生,所以我试图自己完成它,但我一直在多个网站筛选,以找到答案。简而言之,我有我的构造函数,一个来自文件,一个随机生成,这样我就能够创建一个点数组。下一步是实现快速排序,即按极轴角度排序。这是通过一个比较器类完成的。比较器类是我被卡住的地方,我们被告知使用点比较和交叉比较来做角度的比较,但我很迷茫

/**
 * Use cross product and dot product to implement this method.  Do not take square roots 
 * or use trigonometric functions. See the PowerPoint notes on how to carry out cross and 
 * dot products. 
 * 
 * Call comparePolarAngle() and compareDistance(). 
 * 
 * @param p1
 * @param p2
 * @return -1 if one of the following three conditions holds: 
 *                a) p1 and referencePoint are the same point but p2 is a different point; 
 *                b) neither p1 nor p2 equals referencePoint, and the polar angle of 
 *                   p1 with respect to referencePoint is less than that of p2; 
 *                c) neither p1 nor p2 equals referencePoint, p1 and p2 have the same polar 
 *                   angle w.r.t. referencePoint, and p1 is closer to referencePoint than p2. 
 *         0  if p1 and p2 are the same point  
 *         1  if one of the following three conditions holds:
 *                a) p2 and referencePoint are the same point but p1 is a different point; 
 *                b) neither p1 nor p2 equals referencePoint, and the polar angle of
 *                   p1 with respect to referencePoint is greater than that of p2;
 *                c) neither p1 nor p2 equals referencePoint, p1 and p2 have the same polar
 *                   angle w.r.t. referencePoint, and p1 is further to referencePoint than p2. 
 *                   
 */
public int compare(Point p1, Point p2){
    if(p1 == referencePoint && p2 != referencePoint){
        return -1;
    } else if(p1 == p2){
        return 0;
    } else {

    }
    return 0; 
}


/**
 * Compare the polar angles of two points p1 and p2 with respect to referencePoint.  Use 
 * cross products.  Do not use trigonometric functions. 
 * 
 * Precondition:  p1 and p2 are distinct points. 
 * 
 * @param p1
 * @param p2
 * @return   -1  if p1 equals referencePoint or its polar angle with respect to referencePoint
 *               is less than that of p2. 
 *            0  if p1 and p2 have the same polar angle. 
 *            1  if p2 equals referencePoint or its polar angle with respect to referencePoint
 *               is less than that of p1. 
 */
public int comparePolarAngle(Point p1, Point p2){
    // TODO 
    return 0; 
}


/**
 * Compare the distances of two points p1 and p2 to referencePoint.  Use dot products. 
 * Do not take square roots. 
 * 
 * @param p1
 * @param p2
 * @return   -1   if p1 is closer to referencePoint 
 *            0   if p1 and p2 are equidistant to referencePoint
 *            1   if p2 is closer to referencePoint
 */
public int compareDistance(Point p1, Point p2){
    int distance = 0;

    return distance; 
}
这就是全部,我只是在陷入困境之前,在比较方法上经历了一些小事情

快速排序和分区方法是相当标准的,但我将添加它们,以便大家可以全面了解所有内容:

/**
 * Sort the array points[] in the increasing order of polar angle with respect to lowestPoint.  
 * Use quickSort.  Construct an object of the pointComparator class with lowestPoint as the 
 * argument for point comparison.  
 * 
 * Ought to be private, but is made public for testing convenience.   
 */
public void quickSort(){

    // TODO 
}


/**
 * Operates on the subarray of points[] with indices between first and last. 
 * 
 * @param first  starting index of the subarray
 * @param last   ending index of the subarray
 */
private void quickSortRec(int first, int last){

    // TODO
}


/**
 * Operates on the subarray of points[] with indices between first and last.
 * 
 * @param first
 * @param last
 * @return
 */
private int partition(int first, int last){

    // TODO 
    return 0; 
}
我知道,在快速排序方法开始之前,我基本上需要启动并运行Compare类,但我觉得我甚至不知道如何使用点/交叉比较,所以我感到非常失落

如果有人愿意帮忙,我将非常感激!
非常感谢您的关注,祝您度过一个愉快的夜晚。

在所有这些方法中,当您需要查看两个点对象是否相等时,应使用点的相等方法,而不是“==”:

实施比较 请注意,您的compare方法需要在其实现中使用equals()、comparePolarAngle()和compareInstance()。最后一组条件(返回1)也可以在else语句中处理

public int compare(Point p1, Point p2) {
   if(p1.equals(p2)) {
      return 0;
   }
   else if(p1.equals(referencePoint) ||
          (!p1.equals(referencePoint) && !p2.equals(referencePoint) && comparePolarAngle(p1, p2) == -1) ||
          (!p1.equals(referencePoint) && !p2.equals(referencePoint) && comparePolarAngle(p1, p2) == 0 && compareDistance(p1, p2) == -1))
   {
      return -1;
   }
   else {
      return 1;
   }
}
实现比较 这里我们需要的主要信息是如何仅使用点积确定从referencePoint到点对象的向量长度。首先,让我们实现一个helper方法,该方法将两点作为输入,并将点积作为整数值返回

private int dotProduct(Point p1, Point p2) {
   int p1X = p1.getX() - referencePoint.getX();
   int p1Y = p1.getY() - referencePoint.getY();
   int p2X = p2.getX() - referencePoint.getX();
   int p2Y = p2.getY() - referencePoint.getY();
   //compensate for a reference point other than (0, 0)

   return (p1X * p2X) + (p1Y * p2Y);  //formula for dot product
}
那么我们如何用它来计算向量的长度呢?如果我们取一个点的点积,我们得到(xx)+(yy),这是毕达哥拉斯定理的左边(a^2+b^2=c^2)。如果我们称之为点积(p1,p1),我们将得到向量的长度平方。现在让我们实现CompareInstance

public int compareDistance(Point p1, Point p2) {
   if(dotProduct(p1, p1) == dotProduct(p2, p2)) {
      return 0;
   }
   else if(dotProduct(p1, p1) < dotProduct(p2, p2)) {
      return -1;
   }
   else {
      return 1;
   }
}
另一种写取两点叉积的结果的方法是| p1 | p2 | sin(θ),其中| p1 |是p1向量的长度,| p2 |是p2向量的长度,θ是从p1到p2的角度

相对于参考点具有相同极角的两个点的θ值为零。sin(0)=0,因此具有相同极角的两点的叉积为零

如果p1相对于参考点的极角小于p2的极角,则p1到p2的角度为正。对于0<θ<180,sin(θ)为正。因此,如果我们取p1和p2的叉积,并且它是正的,那么p1的极角必须小于p2的极角

如果p1相对于参考点的极角大于p2的极角,则p1到p2的角度将为负值。对于-180<θ<0,sin(θ)为负。因此,如果我们取p1和p2的叉积为负,p1的极角必须大于p2的极角

使用这些信息,我们最终可以实现comparePolarAngle

public int comparePolarAngle(Point p1, Point p2) {
   if(crossProduct(p1, p2) == 0) {
      return 0;
   }
   else if(p1.equals(referencePoint) || crossProduct(p1, p2) > 0) {
      return -1;
   }
   else {
      return 1;
   }
}
我将把快速排序的实现留给您,因为我不知道您的点对象是如何存储、访问和比较的

private int crossProduct(Point p1, Point p2) {
   int p1X = p1.getX() - referencePoint.getX();
   int p1Y = p1.getY() - referencePoint.getY();
   int p2X = p2.getX() - referencePoint.getX();
   int p2Y = p2.getY() - referencePoint.getY();
   //compensate for a reference point other than (0, 0)

   return (p1X * p2Y) - (p2X * p1Y);  //formula for cross product
}
public int comparePolarAngle(Point p1, Point p2) {
   if(crossProduct(p1, p2) == 0) {
      return 0;
   }
   else if(p1.equals(referencePoint) || crossProduct(p1, p2) > 0) {
      return -1;
   }
   else {
      return 1;
   }
}