Il existe N segments de ligne horizontaux ou verticaux. Maintenant, j'ai besoin de connaître le nombre total d'Intersections et le nombre total d'Intersections par segment de ligne. N peut aller jusqu'à . J'ai essayé de vérifier chaque paire de lignes. La réponse est correcte, mais j'ai besoin de réduire le temps que cela prend.Réduction du temps nécessaire pour trouver l'intersection de lignes N
Voici mon code:
using namespace std;
typedef struct Point
{
long long int x;
long long int y;
} ;
bool fun(Point p0, Point p1, Point p2, Point p3)
{
double s1_x, s1_y, s2_x, s2_y;
s1_x = p1.x - p0.x; s1_y = p1.y - p0.y;
s2_x = p3.x - p2.x; s2_y = p3.y - p2.y;
double s, t;
s = (-s1_y * (p0.x - p2.x) + s1_x * (p0.y - p2.y))/(-s2_x * s1_y + s1_x * s2_y);
t = (s2_x * (p0.y - p2.y) - s2_y * (p0.x - p2.x))/(-s2_x * s1_y + s1_x * s2_y);
if (s >= 0 && s <= 1 && t >= 0 && t <= 1)
{
return 1; // Collision detected
}
return 0; // No collision
}
int main()
{
long long int n // number of line segments;
Point p[n],q[n]; // to store end points of line segments
for(long long int i=0;i<n;i++)
{
// line segments is defined by 2 points P(x1,y1) and Q(x2,y2)
p[i].x=x1;
p[i].y=y1;
q[i].x=x2;
q[i].y=y2;
}
for(long long int i=0;i<n-1;i++)
{
for(long long int j=i+1;j<n;j++)
{
if(fun(p[i],q[i],p[j],q[j]))
count++;
}
}
return 0;
}
que quelqu'un peut me aider à réduire la complexité temporelle de ce programme?
Si elles sont horizontales ou verticales, la vérification de l'intersection est beaucoup plus facile que pour des lignes arbitraires (comme dans votre approche). En outre, commencez par trier les lignes par coordonnées x/y.Ensuite, vous savez dans quelle zone les intersections possibles doivent être. Une approche plus sophistiquée serait d'utiliser des arbres de segments ou des arbres d'intervalles. –
Le même professeur ou concours? http://stackoverflow.com/questions/40570886/c-modified-line-segment-intersection – MBo
voir [Implémentation de l'algorithme de Hoey Shamos avec C#] (http://stackoverflow.com/q/18512815/2521214) les deux réponses. – Spektre