Diary SiteMap RecentChanges About Contact 2010-02 Calendar

Search:

Matching Pages:

2010-02-28 Traveller Subsector Coding Hell

Last edit

Changed:

< # if it the move has a downwards component add Δx and Δy

to

> # if the move has a downwards component add Δx and Δy


I have this (Mongoose?) Traveller Subsector Mapper. I started thinking that maybe I should start looking at automatically drawing communications and trade routes. I started writing some code that calculates the distance between two hexes. And I started wasting hours. Whoa, big time code failure on my part!

There was something about |Δx| div 2 + |Δy| and all that stuff, but there was always some case in which it wouldn’t work. I googled many times, but finally I found what I needed to know in a rec.games.design archive.

  1. transform the stupid Traveller coordinate system into a decent system with one axis tilted by 60°
  2. only consider moves from left to right and transpose start and end point to make it so
  3. if the move has a downwards component add Δx and Δy
  4. else just take the larger of Δx and Δy

And it works!

I guess I’ll look at communications routes next week-end. :/

use POSIX;

sub d {
  my ($x1, $y1, $x2, $y2) = @_;
  if ($x1 > $x2) {
    return d($x2, $y2, $x1, $y1);
  } elsif ($y2>=$y1) {
    return $x2-$x1 + $y2-$y1;
  } else {
    return $x2-$x1 > $y1-$y2 ? $x2-$x1 : $y1-$y2;
  }
}

sub pt {
  my ($x1, $y1, $x2, $y2) = @_;
  my $s = sprintf("%02d%02d:", $x2, $y2);
  # shift coordinate system
  my $y1 = $y1 - POSIX::ceil($x1/2);
  my $y2 = $y2 - POSIX::ceil($x2/2);
  $s .= sprintf("%.1f   ", d($x1, $y1, $x2, $y2));
  return $s;
}

my ($x1, $y1) = (4,5);
foreach my $y (1..10) {
  print join("         ", map { pt($x1, $y1, $_, $y) } (1, 3, 5, 7)), "\n";
  print join("         ", "", map { pt($x1, $y1, $_, $y) } (2, 4, 6, 8)), "\n";
}

Result:

0101:6.0            0301:5.0            0501:5.0            0701:6.0   
         0201:5.0            0401:4.0            0601:5.0            0801:6.0   
0102:5.0            0302:4.0            0502:4.0            0702:5.0   
         0202:4.0            0402:3.0            0602:4.0            0802:5.0   
0103:4.0            0303:3.0            0503:3.0            0703:4.0   
         0203:3.0            0403:2.0            0603:3.0            0803:4.0   
0104:3.0            0304:2.0            0504:2.0            0704:3.0   
         0204:2.0            0404:1.0            0604:2.0            0804:4.0   
0105:3.0            0305:1.0            0505:1.0            0705:3.0   
         0205:2.0            0405:0.0            0605:2.0            0805:4.0   
0106:3.0            0306:1.0            0506:1.0            0706:3.0   
         0206:2.0            0406:1.0            0606:2.0            0806:4.0   
0107:3.0            0307:2.0            0507:2.0            0707:3.0   
         0207:3.0            0407:2.0            0607:3.0            0807:4.0   
0108:4.0            0308:3.0            0508:3.0            0708:4.0   
         0208:4.0            0408:3.0            0608:4.0            0808:5.0   
0109:5.0            0309:4.0            0509:4.0            0709:5.0   
         0209:5.0            0409:4.0            0609:5.0            0809:6.0   
0110:6.0            0310:5.0            0510:5.0            0710:6.0   
         0210:6.0            0410:5.0            0610:6.0            0810:7.0   

Tags: RSS RSS RSS

Show Google +1

Comments

Difference between revision 4 and current revision

Summary: Rollback to 2011-01-23 19:28 UTC

No diff available.

Elegant and interesting!

BeRKA 2010-03-02 08:27 UTC


Please make sure you contribute only your own work, or work licensed under the GNU Free Documentation License. See Info for text formatting rules. You can edit the comment page if you need to fix typos. You can subscribe to new comments by email without leaving a comment.

A carefully selected set of emoji for you to copy and paste: • ✕ ✓ ✝ ☠ ☢ ☣ ⚛ ☭ ☮ ☯ ⚒ ⚓ ⚔⚙ ★ ☆ ✨ 🌟 🐣 🐤 🐥 🐦 🐧 🐨 🐷 🐻 🐼 🐢 🐝 🐛 🐙 🐒 🐌 🐋 👑 ✊ 👊 ✌ 👋 👌 👍 👎 👏 👸 🍵 🍷 👹 👺 👻 👽 👾 👿 💀 ❤ ❦ ♥ 💔 📓 📖 📜 📝 🔒 🔓 🔔 🔥 🔨 🔪 🔫 🔮 😁 😂 😃 😄 😅 😆 😉 😊 😋 😌 😍 😏 😒 😓 😔 😖 😘 😚 😜 😝 😞 😠 😡 😢 😣 😤 😥 😨 😩 😪 😫 😭 😰 😱 😲 😳 😵 😷 😸 😹 😺 😻 😼 😽 😾 😿 🙀 🙇 🙈 🙉 🙊 🚶 🚲 🚀 🚽

To save this page you must answer this question:

Please say HELLO.