Re: GnomeCanvasLine
- From: Federico Mena Quintero <federico helixcode com>
- To: ee96090 fe up pt
- Cc: gnome-devel-list gnome org
- Subject: Re: GnomeCanvasLine
- Date: Thu, 4 May 2000 00:24:06 -0500
> Because of a school project I'm working on (a 3D modeler using
> GnomeCanvas), I need to make sure that the routine that checks if a point
> belongs to an item. I'm using exclusively GnomeCanvasLine.
A 3D modeller using the canvas? Are you sure you don't want to use
OpenGL instead?
> gnome_canvas_get_item_at calls the function
> gnome_canvas_item_invoke_point, which calls the item's point virtual
> function. This function calculates the distance between the point and
> each of the item's edges, using formulas like
> dist = sqrt (dx * dx + dy * dy) - width / 2.0;
>
> This is very slow; my teacher says we should use something like
> dist = dx; if the line's inclination is < 1.0, or
> dist = dy; otherwise.
That will not calculate the correct distance to the line.
> gnome_canvas_item_invoke_point is also invoked as the pointer moves
> across the canvas, to synthesize enter/leave notify events to canvas
> items. This is also very slow. Amazingly, I don't notice it being slow. I
> must be reading the code wrong. If not, can I make a patch to GnomeCanvas?
It is not slow. The ::point() method is only invoked for items whose
bounding box intersects the mouse position. Moreover, you normally
don't have a million overlapping items, so you'll only need to take a
few square roots on each mouse motion.
"Floating point is slow" is a fallacy. It depends entirely on what
you are doing.
However, having a point-distance computation method for canvas items
is overkill, and it is a leftover of the design of Tk's canvas. I
intend to replace ::point() with a simpler ::contains() that just
returns a boolean value. This makes hit testing easier and probably
faster as well.
Federico
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]