[Freeciv-Dev] Re: [PATCH] base_real_map_distance (PR#1049)
[Top] [All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
On Thu, 1 Nov 2001, jdorje@xxxxxxxxxxxxxxxxxxxxx wrote:
> This patch introduces a new topology function,
> base_real_map_distance(). It performs a similar function to
> real_map_distance, but also finds a distance vector from the source
> to the destination coordinate pair. It also replaces xdist and
> ydist.
>
> A function like this is absolutely essential for iso-rectangular
> topologies. xdist() and ydist() will not work because you cannot
> find the distance along one coordinate axis independently of the
> other.
>
> int real_map_distance(int x0, int y0, int x1, int y1)
> {
> - int xd = xdist(x0, x1);
> - int yd = ydist(y0, y1);
> - return MAX(xd, yd);
> + int xd, yd;
> + return base_real_map_distance(&xd, &yd, x0, y0, x1, y1);
> }
>
> /***************************************************************
> @@ -317,8 +299,10 @@
> ***************************************************************/
> int sq_map_distance(int x0, int y0, int x1, int y1)
> {
> - int xd = xdist(x0, x1);
> - int yd = ydist(y0, y1);
> + /* We assume base_real_map_distance gives us the vector with
> + the minimum squared distance. Right now this is true. */
> + int xd, yd;
> + base_real_map_distance(&xd, &yd, x0, y0, x1, y1);
> return (xd*xd + yd*yd);
> }
Before you propose such a change you should check that the function is
being used the way you think it is. There are only 3 places where
this function is used. In server/settlers.c the use is really not
necessary, and in control.c it is entirely cosmetic.
settlers.diff
Description: Text Data
I propose to scrap it entirely, which is what I'm doing. That is a
much better idea than trying to apply a concept (Euclidean metric) to
arbitrary nightmare topologies, where it does not have a sensible
meaning.
> @@ -327,7 +311,11 @@
> ***************************************************************/
> int map_distance(int x0, int y0, int x1, int y1)
> {
> - return xdist(x0, x1) + ydist(y0, y1);
> + /* We assume base_real_map_distance gives us the vector with
> + the minimum map distance. Right now this is true. */
> + int xd, yd;
> + base_real_map_distance(&xd, &yd, x0, y0, x1, y1);
> + return abs(xd) + abs(yd);
> }
We should just scrap this one altogether. Again, the only good
distance is the length-of-a-unit's walk one. This one has no sensible
meaning neither in terms of game mechanics (except possibly for some
settler actions) nor in terms of "real life".
> Index: server/settlers.c
> ===================================================================
> RCS file: /home/freeciv/CVS/freeciv/server/settlers.c,v
> retrieving revision 1.112
> diff -u -r1.112 settlers.c
> --- server/settlers.c 2001/10/14 21:02:17 1.112
> +++ server/settlers.c 2001/11/01 14:09:33
> @@ -769,8 +769,8 @@
> for (i = 0; i < game.nplayers; i++) {
> city_list_iterate(game.players[i].cities, pcity) {
> if (map_distance(x, y, pcity->x, pcity->y)<=8) {
> - dx = xdist(pcity->x, x);
> - dy = ydist(pcity->y, y);
> + base_real_map_distance(&dx, &dy, pcity->x, pcity->y, x, y);
> + dx = abs(dx), dy = abs(dy);
> /* these are heuristics... */
> if (dx<=5 && dy<5)
> return 0;
This is an instance of correct usage of map_distance() (I think, since
building irrigation and suchlike does not work diagonally).
It is also an example of the fact that displacement verctors don't
work in the
^
<###
topology that you proposed.
--
Big Gaute http://www.srcf.ucam.org/~gs234/
"DARK SHADOWS" is on!! Hey, I think the VAMPIRE forgot his UMBRELLA!!
|
|