Given a set of n points (xi, yi) in 2D coordinate. Each point has some weight wi. The task is to check whether a line at 45 degree can be drawn so that sum of weights of points on each side are equal.
Input : x1 = -1, y1 = 1, w1 = 3 x2 = -2, y2 = 1, w2 = 1 x3 = 1, y3 = -1, w3 = 4 Output : Yes Input : x1 = 1, y1 = 1, w1 = 2 x2 = -1, y2 = 1, w2 = 1 x3 = 1, y3 = -1, w3 = 2 Output : No
First, let’s try to solve above problem for a vertical line i.e if a line x = i can divide the plane into two part such that the sum of weight at each side is equal.
Observe, multiple points with the same x-coordinate can be treated as one point with weight equal to the sum of weights of all points with the same x-coordinate.
Now, traverse through all x-coordinates from the minimum x-coordinate to maximum x-coordinate. So, make an array prefix_sum, which will store the sum of weights till the point x = i.
So, there can be two options for which the answer can be ‘Yes’:
- Either prefix_sum[1, 2, …, i-1] = prefix_sum[i+1, …, n]
- or there exist a point i such that a line passes somewhere in between
x = i and x = i+1 and prefix_sum[1, …, i] = prefix_sum[i+1, …, n],
where prefix_sum[i, …, j] is the sum of weight of points from i to j.
int is_possible = false; for (int i = 1; i < prefix_sum.size(); i++) if (prefix_sum[i] == total_sum - prefix_sum[i]) is_possible = true if (prefix_sum[i-1] == total_sum - prefix_sum[i]) is_possible = true
Now, to solve for a line at 45 degrees, we will rotate each point by 45 degrees.
Refer: 2D Transformation or Rotation of objects
So, point at (x, y), after 45 degree rotation will become ((x – y)/sqrt(2), (x + y)/sqrt(2)).
We can ignore the sqrt(2) since it is the scaling factor. Also, we don’t need to care about y-coordinate after rotation because a vertical line cannot distinguish between the point having the same x-coordinate. (x, y1) and (x, y2) will lie to the right, left or on any line of the form x = k.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
- Check if any square (with one colored cell) can be divided into two equal parts
- Count the number of ways to divide an array into three contiguous parts having equal sum
- Minimum cuts required to divide the Circle into equal parts
- Maximum number of region in which N non-parallel lines can divide a plane
- Minimum Cuts can be made in the Chessboard such that it is not divided into 2 parts
- Number of ways N can be divided into four parts to construct a rectangle
- Shortest distance between a Line and a Point in a 3-D plane
- Find foot of perpendicular from a point in 2 D plane to a Line
- Count of intersections of M line segments with N vertical lines in XY plane
- Check if a large number can be divided into two or more segments of equal sum
- Number of Triangles that can be formed given a set of lines in Euclidean Plane
- Number of times an array can be partitioned repetitively into two subarrays with equal sum
- Count number of ways to divide an array into two halves with same sum
- Optimal partition of an array into four parts
- Maximum distance between two points in coordinate plane using Rotating Caliper's Method
- Number of triangles in a plane if no more than two points are collinear
- Find the equation of plane which passes through two points and parallel to a given axis
- Program to check whether 4 points in a 3-D plane are Coplanar
- Count ways to partition a string such that both parts have equal distinct characters
- Check whether a straight line can be formed using N co-ordinate points
If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to email@example.com. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.
Improved By : princiraj1992