Complete.Org: Mailing Lists: Archives: freeciv-dev: July 2003:
[Freeciv-Dev] Re: (PR#4648) how to do wrapping in map_to_canvas_pos?
Home

[Freeciv-Dev] Re: (PR#4648) how to do wrapping in map_to_canvas_pos?

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: undisclosed-recipients: ;
Subject: [Freeciv-Dev] Re: (PR#4648) how to do wrapping in map_to_canvas_pos?
From: "Jason Short" <jdorje@xxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 23 Jul 2003 06:09:01 -0700
Reply-to: rt@xxxxxxxxxxxxxx

Gregory Berkolaiko wrote:
> On Tue, 22 Jul 2003, Jason Short wrote:
> 
> 
>>Gregory Berkolaiko wrote:
>>
>>>I do not understand why map_center_[xy] should stay unnormalized?
>>>Let them be normalized, it should work just as well.  It would save you 
>>>from removing CHECK_MAP_POSs, although you can do that to save time.
>>
>>No, the whole point is that you are looking for an absolute (non-wrapped 
>>or "unnormalized") position.
>>
>>First consider that the center tile might not even be real.  If we do 
>>things right, though, this shouldn't happen...
>>
>>But consider an 80x50 map with standard wrapping, non-iso tileset.  Say 
>>x0=70 and the mapview window is 22 tiles wide.  Now the center tile is 
>>at x=81 or x=1 once it's been normalized.
>>
>>Now you want to "unnormalize" some coordinates.  Since this example is 
>>very simple, it should be easy to see the "unnormalized" values should 
>>have X values in the range [70,150).
>>
>>Now start with x=1.  It's distance vector has dx=0.  If we use the 
>>normalized value of center_map_x this will give us an unnormalized value 
>>x=1, giving canvas_x=-69*NORMAL_TILE_WIDTH - way off the screen.  The 
>>correct value should be x=81 giving canvas_x=11*NORMAL_TILE_WIDTH.
> 
> 
> Err.  I don't quite understand the paragraph above.  OUr goal is to get 
> canvas positions, isn't it.  So we get distance verctor dx = 0, therefore
>       canvas_x = center_canvas_x + dx*NORMAL_TILE_WIDTH
> gives the correct answer.

It only gives the correct answer if center_canvas_[xy] is unwrapped.  If 
you normalize it then you'll get something completely different.  With 
center_map_x=81 we'll get a position 11 tiles right of the origin, 
whereas with center_map_x=1 we'll get a position 69 tiles left of the 
origin (which is wrong).

This is because the calculation isn't done as

   canvas_x = center_canvas_x + dx * NORMAL_TILE_WIDTH

but as

   map_x = center_map_x + dx;
   canvas_x = NORMAL_TILE_WIDTH * (map_x - map_view_x0);

the former method is possible but means more changes (particularly for 
iso-view).

As a side note, (map_x, map_y) may be unreal and so map_distance_vector 
has to deal with unreal positions in either case.

> Another issue is that I am not 100% sure your approach will give the right 
> answer for iso tiles.

I'm pretty certain it does.  You can try using iso-view with a 40x25 
map.  If you enlarge the window sufficiently you will be able to see the 
whole map, approximately centered around the center.

It should be exactly centered around the center, but it's not...in 
gen-topologies it does work.  Somewhere else I think there's an 
additional clipping action that constrains map_view_x0/map_view_y0.

jason




[Prev in Thread] Current Thread [Next in Thread]