📜  里面没有点的三角形

📅  最后修改于: 2021-10-23 08:56:56             🧑  作者: Mango

给定二维空间中的 N 个点,我们需要找到三个点,使得通过选择这些点构成的三角形内部不应包含任何其他点。所有给定的点不会位于同一条线上,因此解决方案将始终存在。
例子:

In above diagram possible triangle with no point 
inside can be formed by choosing these triplets,
[(0, 0), (2, 0), (1, 1)]
[(0, 0), (1, 1), (0, 2)]
[(1, 1), (2, 0), (2, 2)]
[(1, 1), (0, 2), (2, 2)]

So any of the above triplets can be the final answer.

解决方案是基于这样一个事实,如果存在内部没有点的三角形,那么我们可以形成一个三角形,其中任意一个点在所有点中。
我们可以通过一个一个地搜索所有三个点来解决这个问题。第一个点可以随机选择。选择第一个点后,我们需要两个点,使得它们的斜率应该不同,并且没有点应该位于这三个点的三角形内。我们可以通过选择第二个点作为距离第一个点最近的点,选择第三个点作为具有不同斜率的第二个最近点来做到这一点。为此,我们首先遍历所有点并选择最接近第一个点的点并将其指定为所需三角形的第二个点。然后我们再迭代一次以找到具有不同斜率且距离最小的点,这将是我们三角形的第三个点。

C++
// C/C++ program to find triangle with no point inside
#include 
using namespace std;
 
// method to get square of distance between
// (x1, y1) and (x2, y2)
int getDistance(int x1, int y1, int x2, int y2)
{
    return (x2 - x1)*(x2 - x1) +
           (y2 - y1)*(y2 - y1);
}
 
// Method prints points which make triangle with no
// point inside
void triangleWithNoPointInside(int points[][2], int N)
{
    //    any point can be chosen as first point of triangle
    int first = 0;
    int second, third;
    int minD = INT_MAX;
 
    // choose nearest point as second point of triangle
    for (int i = 0; i < N; i++)
    {
        if (i == first)
            continue;
 
        // Get distance from first point and choose
        // nearest one
        int d = getDistance(points[i][0], points[i][1],
                    points[first][0], points[first][1]);
        if (minD > d)
        {
            minD = d;
            second = i;
        }
    }
 
    // Pick third point by finding the second closest
    // point with different slope.
    minD = INT_MAX;
    for (int i = 0; i < N; i++)
    {
        // if already chosen point then skip them
        if (i == first || i == second)
            continue;
 
        // get distance from first point
        int d = getDistance(points[i][0], points[i][1],
                     points[first][0], points[first][1]);
 
        /*  the slope of the third point with the first
            point should not be equal to the slope of
            second point with first point (otherwise
            they'll be collinear)     and among all such
            points, we choose point with the smallest
            distance  */
        // here cross multiplication is compared instead
        // of division comparison
        if ((points[i][0] - points[first][0]) *
            (points[second][1] - points[first][1]) !=
            (points[second][0] - points[first][0]) *
            (points[i][1] - points[first][1]) &&
            minD > d)
        {
            minD = d;
            third = i;
        }
    }
 
    cout << points[first][0] << ", "
         << points[first][1] << endl;
    cout << points[second][0] << ", "
         << points[second][1] << endl;
    cout << points[third][0] << ", "
         << points[third][1] << endl;
}
 
// Driver code to test above methods
int main()
{
    int points[][2] = {{0, 0}, {0, 2}, {2, 0},
                       {2, 2}, {1, 1}};
    int N = sizeof(points) / sizeof(points[0]);
    triangleWithNoPointInside(points, N);
    return 0;
}


Java
// Java program to find triangle
// with no point inside
import java.io.*;
 
class GFG
{
    // method to get square of distance between
    // (x1, y1) and (x2, y2)
    static int getDistance(int x1, int y1, int x2, int y2)
    {
        return (x2 - x1)*(x2 - x1) +
                  (y2 - y1)*(y2 - y1);
    }
     
    // Method prints points which make triangle with no
    // point inside
    static void triangleWithNoPointInside(int points[][], int N)
    {
        // any point can be chosen as first point of triangle
        int first = 0;
        int second =0;
        int third =0;
        int minD = Integer.MAX_VALUE;
     
        // choose nearest point as second point of triangle
        for (int i = 0; i < N; i++)
        {
            if (i == first)
                continue;
     
            // Get distance from first point and choose
            // nearest one
            int d = getDistance(points[i][0], points[i][1],
                        points[first][0], points[first][1]);
            if (minD > d)
            {
                minD = d;
                second = i;
            }
        }
     
        // Pick third point by finding the second closest
        // point with different slope.
        minD = Integer.MAX_VALUE;
        for (int i = 0; i < N; i++)
        {
            // if already chosen point then skip them
            if (i == first || i == second)
                continue;
     
            // get distance from first point
            int d = getDistance(points[i][0], points[i][1],
                        points[first][0], points[first][1]);
     
            /* the slope of the third point with the first
                point should not be equal to the slope of
                second point with first point (otherwise
                they'll be collinear) and among all such
                points, we choose point with the smallest
                distance */
            // here cross multiplication is compared instead
            // of division comparison
            if ((points[i][0] - points[first][0]) *
                (points[second][1] - points[first][1]) !=
                (points[second][0] - points[first][0]) *
                (points[i][1] - points[first][1]) &&
                minD > d)
            {
                minD = d;
                third = i;
            }
        }
     
        System.out.println(points[first][0] + ", "
            + points[first][1]);
        System.out.println(points[second][0]+ ", "
            + points[second][1]) ;
        System.out.println(points[third][0] +", "
            + points[third][1]);
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int points[][] = {{0, 0}, {0, 2}, {2, 0},
                         {2, 2}, {1, 1}};
        int N = points.length;
        triangleWithNoPointInside(points, N);
    }
}
 
// This article is contributed by vt_m.


Python 3
# Python3 program to find triangle
# with no point inside
import sys
 
# method to get square of distance between
# (x1, y1) and (x2, y2)
def getDistance(x1, y1, x2, y2):
    return (x2 - x1) * (x2 - x1) + \
           (y2 - y1) * (y2 - y1)
 
# Method prints points which make triangle
# with no point inside
def triangleWithNoPointInside(points, N):
     
    # any point can be chosen as
    # first point of triangle
    first = 0
    second = 0
    third = 0
    minD = sys.maxsize
 
    # choose nearest point as
    # second point of triangle
    for i in range(0, N):
        if i == first:
            continue
 
        # Get distance from first point and choose
        # nearest one
        d = getDistance(points[i][0], points[i][1],
                        points[first][0],
                        points[first][1])
        if minD > d:
            minD = d
            second = i
     
    # Pick third point by finding the second closest
    # point with different slope.
    minD = sys.maxsize
    for i in range (0, N):
         
        # if already chosen point then skip them
        if i == first or i == second:
            continue
 
        # get distance from first point
        d = getDistance(points[i][0], points[i][1],
                        points[first][0],
                        points[first][1])
 
        """ the slope of the third point with the first
            point should not be equal to the slope of
            second point with first point (otherwise
            they'll be collinear) and among all such
            points, we choose point with the smallest
            distance """
             
        # here cross multiplication is compared instead
        # of division comparison
        if ((points[i][0] - points[first][0]) *
            (points[second][1] - points[first][1]) !=
            (points[second][0] - points[first][0]) *
            (points[i][1] - points[first][1])
            and minD > d) :
            minD = d
            third = i
 
    print(points[first][0], ', ', points[first][1])
    print(points[second][0], ', ', points[second][1])
    print(points[third][0], ', ', points[third][1])
 
# Driver code
points = [[0, 0], [0, 2],
          [2, 0], [2, 2], [1, 1]]
N = len(points)
triangleWithNoPointInside(points, N)
 
# This code is contributed by Gowtham Yuvaraj


C#
using System;
 
// C# program to find triangle
// with no point inside
 
public class GFG
{
    // method to get square of distance between
    // (x1, y1) and (x2, y2)
    public static int getDistance(int x1, int y1, int x2, int y2)
    {
        return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
    }
 
    // Method prints points which make triangle with no
    // point inside
    public static void triangleWithNoPointInside(int[][] points, int N)
    {
        // any point can be chosen as first point of triangle
        int first = 0;
        int second = 0;
        int third = 0;
        int minD = int.MaxValue;
 
        // choose nearest point as second point of triangle
        for (int i = 0; i < N; i++)
        {
            if (i == first)
            {
                continue;
            }
 
            // Get distance from first point and choose
            // nearest one
            int d = getDistance(points[i][0], points[i][1], points[first][0], points[first][1]);
            if (minD > d)
            {
                minD = d;
                second = i;
            }
        }
 
        // Pick third point by finding the second closest
        // point with different slope.
        minD = int.MaxValue;
        for (int i = 0; i < N; i++)
        {
            // if already chosen point then skip them
            if (i == first || i == second)
            {
                continue;
            }
 
            // get distance from first point
            int d = getDistance(points[i][0], points[i][1], points[first][0], points[first][1]);
 
            /* the slope of the third point with the first
                point should not be equal to the slope of
                second point with first point (otherwise
                they'll be collinear) and among all such
                points, we choose point with the smallest
                distance */
            // here cross multiplication is compared instead
            // of division comparison
            if ((points[i][0] - points[first][0]) * (points[second][1] - points[first][1]) != (points[second][0] - points[first][0]) * (points[i][1] - points[first][1]) && minD > d)
            {
                minD = d;
                third = i;
            }
        }
 
        Console.WriteLine(points[first][0] + ", " + points[first][1]);
        Console.WriteLine(points[second][0] + ", " + points[second][1]);
        Console.WriteLine(points[third][0] + ", " + points[third][1]);
    }
 
    // Driver code 
    public static void Main(string[] args)
    {
        int[][] points = new int[][]
        {
            new int[] {0, 0},
            new int[] {0, 2},
            new int[] {2, 0},
            new int[] {2, 2},
            new int[] {1, 1}
        };
        int N = points.Length;
        triangleWithNoPointInside(points, N);
    }
}
 
  // This code is contributed by Shrikant13


Javascript


输出:

0, 0
1, 1
0, 2

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程