给定两对(X, Y), (P, Q)和R半圆的中心坐标、半圆的交点坐标和半圆的直径和、半圆的半径,以及一个数组arr[ ]维数N*2由几个点的坐标组成,任务是从数组中找到位于数组内部或上面的点数
半圆。
注:考虑直径上方的半圆。
例子:
Input: X = 0, Y = 0, R = 5, P = 5, Q = 0, arr[][] = { {2, 3}, {5, 6}, {-1, 4}, {5, 5} }
Output: 2
Explanation: The points {2, 3} and {-1, 4} are inside the semi-circle.
Input: X = 2, Y = 3, R = 10, P = 12, Q = 3, arr[][] = { {-7, -5}, {0, 6}, {11, 4} }
Output: 2
方法:根据以下观察可以解决给定的问题:
- The points that lies on or inside the semicircle must be above or on the diameter of semicircle and the distance between center and that point should be ≤ R.
- Suppose is the equation of diameter.
The point (R, S) lies above the line if
- A point (R, S) lies above the line formed by joining points (X, Y) and (P, Q) if
请按照以下步骤解决问题:
- 从点 (X, Y) 和 (P, Q) 找出半圆直径的直线方程。
- 初始化一个变量,比如ans ,以存储所需点的数量。
- 遍历数组arr[]并执行以下操作:
- 计算点(X, Y)和(P, Q)之间的距离并将其存储在变量中,例如d。
- 将arr[i][0]和arr[i][1]分别代替R和S ,在公式中
并将结果存储在一个变量中,比如f 。 - 如果R ≤ d且f ≥ 0,则将ans的计数增加1 。
- 完成上述步骤后,打印ans 中存储的值。
下面是上述方法的实现:
C++
// C++ program for above approach
#include
using namespace std;
int getPointsIns(int x1, int y1, int radius, int x2,
int y2, vector> points)
{
int ans = 0;
// Traverse the array
for(int i = 0; i < points.size(); i++)
{
// Stores if a point lies
// above the diameter or not
bool condOne = false, condTwo = false;
if ((points[i].second - y2) *
(x2 - x1) - (y2 - y1) *
(points[i].first - x2) >= 0)
{
condOne = true;
}
// Stores if the R is less than or
// equal to the distance between
// center and point
if (radius >= (int)sqrt(pow((y1 - points[i].second), 2) +
pow(x1 - points[i].first, 2)))
{
condTwo = true;
}
if (condOne && condTwo)
{
ans += 1;
}
}
return ans;
}
// Driver code
int main()
{
int X = 0;
int Y = 0;
int R = 5;
int P = 5;
int Q = 0;
vector> arr = { make_pair(2, 3),
make_pair(5, 6),
make_pair(-1, 4),
make_pair(5, 5) };
cout << getPointsIns(X, Y, R, P, Q, arr);
return 0;
}
// This code is contributed by nirajgusain5
Java
// Java program for above approach
import java.io.*;
class Gfg {
public static int getPointsIns(int x1, int y1,int radius,
int x2,int y2, pair points[])
{
int ans = 0;
// Traverse the array
for (int i = 0; i < points.length; i++)
{
// Stores if a point lies
// above the diameter or not
boolean condOne = false, condTwo = false;
if ((points[i].b - y2) *
(x2 - x1)- (y2 - y1) *
(points[i].a - x2)>= 0)
{
condOne = true;
}
// Stores if the R is less than or
// equal to the distance between
// center and point
if (radius >= (int)Math.sqrt(Math.pow((y1 - points[i].b), 2)+
Math.pow(x1 - points[i].a, 2)))
{
condTwo = true;
}
if (condOne && condTwo)
{
ans += 1;
}
}
return ans;
}
// Driver code
public static void main(String[] args)
{
int X = 0;
int Y = 0;
int R = 5;
int P = 5;
int Q = 0;
pair arr[] = {new pair(2, 3), new pair(5, 6), new pair(-1, 4), new pair(5,5)};
System.out.print(getPointsIns(X, Y, R, P, Q, arr));
}
}
class pair
{
int a;
int b;
pair(int a,int b)
{
this.a = a;
this.b = b;
}
}
Python3
# Python implementation of above approach
def getPointsIns(x1, y1, radius, x2, y2, points):
# Stores the count of ans
ans = 0
# Traverse the array
for point in points:
# Stores if a point lies
# above the diameter or not
condOne = (point[1] - y2) * (x2 - x1) \
- (y2 - y1) * (point[0] - x2) >= 0
# Stores if the R is less than or
# equal to the distance between
# center and point
condTwo = radius >= ((y1 - point[1]) ** 2 \
+ (x1 - point[0]) ** 2) ** (0.5)
if condOne and condTwo:
ans += 1
return ans
# Driver Code
# Input
X = 0
Y = 0
R = 5
P = 5
Q = 0
arr = [[2, 3], [5, 6], [-1, 4], [5, 5]]
print(getPointsIns(X, Y, R, P, Q, arr))
C#
// C# program for above approach
using System;
class Gfg
{
public static int getPointsIns(int x1, int y1,
int radius, int x2,
int y2, pair[] points)
{
int ans = 0;
// Traverse the array
for (int i = 0; i < points.Length; i++) {
// Stores if a point lies
// above the diameter or not
bool condOne = false, condTwo = false;
if ((points[i].b - y2) * (x2 - x1)
- (y2 - y1) * (points[i].a - x2)
>= 0) {
condOne = true;
}
// Stores if the R is less than or
// equal to the distance between
// center and point
if (radius >= (int)Math.Sqrt(
Math.Pow((y1 - points[i].b), 2)
+ Math.Pow(x1 - points[i].a, 2))) {
condTwo = true;
}
if (condOne && condTwo) {
ans += 1;
}
}
return ans;
}
// Driver code
public static void Main(string[] args)
{
int X = 0;
int Y = 0;
int R = 5;
int P = 5;
int Q = 0;
pair[] arr = { new pair(2, 3), new pair(5, 6),
new pair(-1, 4), new pair(5, 5) };
Console.Write(getPointsIns(X, Y, R, P, Q, arr));
}
}
public class pair {
public int a;
public int b;
public pair(int a, int b)
{
this.a = a;
this.b = b;
}
}
// This code is contributed by code_hunt.
Javascript
输出:
2
时间复杂度: O(N)
辅助空间: O(1)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。