Thanks Ch'Gans for replying.

The lines do not have a width. I thought about QGraphicsScene which I use already but it does seems to be too much for that (plus memory consumption is an issue as well).

To give a bit mode details: The list of lines does not change during calculation, it changes only when the user moves the view, but remain as it is during calculation. I don't need the crossing point, and I don't need the number of lines that crosses. If it crosses once I break. No bezier curves or fancy things, just lines. Most of these lines form a closed polygon that I can detect and manipulate as such, but some other are just single lines (or non-closed polygons) not connected to anything else.

The number of lines in the list can vary from 0 to around 50k, it depends. I already divide the set of lines in subsets (square cells) and before I go iterate on the list of lines in a cell, I check that the line is crossing (or is inside) the cell. I have then improved a bit by using a QPainterPath to determine the boundingRect of the lines within a cell which I use instead of the cell borders. A bit better, but not that much. The size of cells is also difficult to tune (more cells with less lines, or the opposite?).

Since my first mail I have also tried to give some thickness to the line and use QPainterPath::intersects(). The result is much slower than simply iterating on the list of lines, at least 1000 times slower (and cpu is going crazy). I was also considering using QRegion but I suppose the result will be similar.

I will have a look at CGAL Minkowski 2D algorithms, and will also try the elegant solution with a QMap provided by Henry in the other reply.

Thanks to you both,
Philippe


Le 09-08-2016 03:07, Ch'Gans a écrit :
On 9 August 2016 at 04:05, maitai <mai...@virtual-winds.org> wrote:
Hello all,

I have a list of lines (QLineF) in 2D space. Some might represent a closed polygon, some others are just a line or represent a non closed polygon. Classical problem: I need to detect if another given line is crossing one of the lines in the list. I don't need the crossing point, just to know if it
crosses or not.

Do your lines have a width? or are they "ideal" lines (0 thickness)?
If you need to deal with outline/shape stroking, then you might
consider using QGraphicsScene.
This might look a bit too much at first, but maybe in the long run
this can save you lot of time depending on you spatial query use
cases.
Just check http://doc.qt.io/qt-5/qtwidgets-graphicsview-chip-example.html
if you never tried before.

Fore more "advanced" geometry approach, you could have a look at cgal
(eg: 2D arrangements)
http://doc.cgal.org/latest/Manual/packages.html#PkgArrangement2Summary

If you find yourself falling short with QPainterPath and
QPainterPathStroker, maybe CGAL Minkowski sums and polygon offsetting
is what you're after
http://doc.cgal.org/latest/Manual/packages.html#PkgMinkowskiSum2Summary
http://doc.cgal.org/latest/Manual/packages.html#PkgStraightSkeleton2Summary


For the time being, I just iterate on the list and use QLineF::intersects().
This is of course badly slow.

I read that post (and many others):
http://stackoverflow.com/questions/9393672/intersection-point-of-qpainterpath-and-line-find-qpainterpath-y-by-x

Using a QPainterPath seems the right idea, but as it seems it does not work with a single line, so maybe I should convert the line in a tiny rectangle
to be able to use QPainterPath::intersects(). Will that be faster?

Yeah, that's where you realise the "Painter" role in "QPainterPath".
QPainterPath is definitely tailored to address Qt painting needs.
Plus beware of instability with QPainterPath if you use bezier curves
and circular arcs (implemented internally as bezier curves). Again it
might be OK when your job is painting, but it is not OK if your job is
"geometry solving with precision"

Before I try that, I was wondering if someone has a better idea as of what class to use in qt to solve this? Calculation speed is the most important
thing in my case.

Maybe gives more details about your application:
How many line-segments are you talking about, hundreds, thousands, millions?
What is the likeliness of intersection?
Are the line static or are they moving? How often the spatial
configuration changes?
How often you need to query the arrangement?
Do you need to detect *every* intersection at *any* moment, or within
an "area of interest" during a "time span of interest:, ... ?


Chris


Thanks for pointing me in the right direction
Philippe Lelong
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to