Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Sign In with Facebook Sign In with Google Sign In with OpenID

Categories

We have migrated to a new platform! Please note that you will need to reset your password to log in (your credentials are still in-tact though). Please contact lee@programmersheaven.com if you have questions.
Welcome to the new platform of Programmer's Heaven! We apologize for the inconvenience caused, if you visited us from a broken link of the previous version. The main reason to move to a new platform is to provide more effective and collaborative experience to you all. Please feel free to experience the new platform and use its exciting features. Contact us for any issue that you need to get clarified. We are more than happy to help you.

How to Find Best Position for A Label in Irregular Shape?

rayqrayq Posts: 8Member
Hi, does anyone know a way to find the best position for a label in an irregular shape? For example, a lake is in a L shape with ~50 points and I want to post its name in the middle inside the lake, I can't post it in the mid point of the range since it will be outside the lake in such L shape, so how to estimate/calculate the best possible position? If you have experience doing so or know where to get the info of how to doing it, please let me know. Any help will be greatly appreciated. Thanks.

Raymond

Comments

  • XLoomXLoom Posts: 129Member
    What points do you mean? Do you mean pixels as in raster graphics or points as vertices in vector graphics? There is always possibility to convert the vector graphics to raster graphics, so I'll give you one simple, but algorithmically complex solution (it can be optimized) with raster graphics.

    When you have a bitmap with a lake on it. Lets say the lake is drawn with black pixels and all other parts of map with white pixels. Obviously the best place for label is where it lays mostly on black pixels. How to get it? The solution is to find for each position on map, how many black pixels will be under the label if the label is drawn starting from that position and choose the position with highest value. Just count the black pixels that are under label while it's drawn. That's about it ;) It can be optimized a lot as this solution is slow with complexity X*Y*Z*W where X and Y are map dimensions and Z and W are the size of label. If you think of the label as a rectangle, then you can move it by scanlines, so the complexity is only about X*Y.



  • rayqrayq Posts: 8Member
    [b][red]This message was edited by rayq at 2006-6-6 13:3:0[/red][/b][hr]
    [b][red]This message was edited by rayq at 2006-6-6 13:2:11[/red][/b][hr]
    No, I meant a single entity, for example, a irregular shaped polygon with 50 vertices in vector graphics. I was given a project to find the best/optimal point for its label placement. If the shape is a circle, rectangle, or equal sided polygon, the best position for its label is the mid point. For irregular shape, which is the best??? Better yet, the angle (tilted upward/downward) of the label can somewhat follow the shape. I think the algorithm (if found) can be used with regular/irregular shape!


    Thanks for your input.

    : What points do you mean? Do you mean pixels as in raster graphics or points as vertices in vector graphics? There is always possibility to convert the vector graphics to raster graphics, so I'll give you one simple, but algorithmically complex solution (it can be optimized) with raster graphics.
    :
    : When you have a bitmap with a lake on it. Lets say the lake is drawn with black pixels and all other parts of map with white pixels. Obviously the best place for label is where it lays mostly on black pixels. How to get it? The solution is to find for each position on map, how many black pixels will be under the label if the label is drawn starting from that position and choose the position with highest value. Just count the black pixels that are under label while it's drawn. That's about it ;) It can be optimized a lot as this solution is slow with complexity X*Y*Z*W where X and Y are map dimensions and Z and W are the size of label. If you think of the label as a rectangle, then you can move it by scanlines, so the complexity is only about X*Y.
    :
    :
    :
    :





  • XLoomXLoom Posts: 129Member
    With the extension of tilted labels it becomes very a difficult problem. The easiest thing would still be to create a rasterized picture and have a rectangular label. If you don't want to do that, then your best bet might be to first triangulate the shape, then try to fit in the label the label on the triangles somehow. I don't really know any specific algorithm for it. Things that popped into mind that you might want to try after triangulation are:
    1) for each triangle put the label to the center of the triangle at the angle that the triangles outer side is (ie the side that is original vertex in the shape) and find out how much of the label is inside the triangles, then choose the triangle where the label is most inside this triangle and other triangles it intersects.
    or
    2) for each two triangles draw a straight between centers of two triangles and put the label on the straight at half way between the two triangles, then again choose the label that is best inside the triangles.

    It might give quite nice outcome, if the lakes are simple polygons that do not have very jagged edges.

    The easiest algorithm for triangulation is probably ear cutting:
    http://cgm.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Ian/cutting_ears.html

    : No, I meant a single entity, for example, a irregular shaped polygon with 50 vertices in vector graphics. I was given a project to find the best/optimal point for its label placement. If the shape is a circle, rectangle, or equal sided polygon, the best position for its label is the mid point. For irregular shape, which is the best??? Better yet, the angle (tilted upward/downward) of the label can somewhat follow the shape. I think the algorithm (if found) can be used with regular/irregular shape!

  • rayqrayq Posts: 8Member
    I'll try the rasterized method that you mentioned. Yes, you are right about the angular text. I might just keep it simple as rectangular label. Thanks a lot for your help.

    Ray

    : With the extension of tilted labels it becomes very a difficult problem. The easiest thing would still be to create a rasterized picture and have a rectangular label. If you don't want to do that, then your best bet might be to first triangulate the shape, then try to fit in the label the label on the triangles somehow. I don't really know any specific algorithm for it. Things that popped into mind that you might want to try after triangulation are:
    : 1) for each triangle put the label to the center of the triangle at the angle that the triangles outer side is (ie the side that is original vertex in the shape) and find out how much of the label is inside the triangles, then choose the triangle where the label is most inside this triangle and other triangles it intersects.
    : or
    : 2) for each two triangles draw a straight between centers of two triangles and put the label on the straight at half way between the two triangles, then again choose the label that is best inside the triangles.
    :
    : It might give quite nice outcome, if the lakes are simple polygons that do not have very jagged edges.
    :
    : The easiest algorithm for triangulation is probably ear cutting:
    : http://cgm.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Ian/cutting_ears.html
    :

Sign In or Register to comment.